From 18830ac9add80cbd3bf7369307d7e35a519dca9b Mon Sep 17 00:00:00 2001 From: fluxgen Date: Tue, 11 Dec 2001 20:47:02 +0000 Subject: [PATCH] Initial revision --- AUTHORS | 63 + COPYING | 41 + ChangeLog | 204 ++ INSTALL | 94 + Makefile.am | 9 + Makefile.in | 384 ++++ NEWS | 11 + README | 35 + TODO | 37 + aclocal.m4 | 573 ++++++ config.guess | 1183 +++++++++++ config.h.in | 106 + config.sub | 1268 ++++++++++++ configure | 3967 ++++++++++++++++++++++++++++++++++++ configure.in | 279 +++ data/Makefile.am | 16 + data/Makefile.in | 333 +++ data/README | 17 + data/README.menu | 372 ++++ data/README.style | 330 +++ data/generate_menu | 232 +++ data/init.in | 36 + data/keys | 14 + data/styles/Artwiz | 109 + data/styles/Blue | 145 ++ data/styles/Carbondioxide | 135 ++ data/styles/Clean | 117 ++ data/styles/CleanColor | 120 ++ data/styles/Cthulhain | 140 ++ data/styles/Flux | 91 + data/styles/Makefile.am | 12 + data/styles/Makefile.in | 224 +++ data/styles/Makro | 116 ++ data/styles/MerleyKay | 134 ++ data/styles/Minimal | 79 + data/styles/Nyz | 103 + data/styles/Operation | 91 + data/styles/Outcomes | 114 ++ data/styles/Rampage | 102 + data/styles/Rancor | 107 + data/styles/Results | 114 ++ data/styles/Shade | 91 + data/styles/Spiff | 109 + data/styles/TDF | 115 ++ data/styles/Twice | 103 + data/styles/qnx-photon | 138 ++ data/titlebar | 2 + doc/Coding_style | 45 + doc/Makefile.am | 11 + doc/Makefile.in | 246 +++ doc/bsetroot.1 | 89 + doc/fluxbox.1.in | 805 ++++++++ install-sh | 250 +++ ltconfig | 3114 ++++++++++++++++++++++++++++ ltmain.sh | 4024 +++++++++++++++++++++++++++++++++++++ missing | 188 ++ mkinstalldirs | 40 + nls/C/BaseDisplay.m | 16 + nls/C/Basemenu.m | 4 + nls/C/Configmenu.m | 48 + nls/C/Icon.m | 4 + nls/C/Image.m | 24 + nls/C/Makefile.am | 46 + nls/C/Makefile.in | 237 +++ nls/C/Screen.m | 54 + nls/C/Slit.m | 8 + nls/C/Toolbar.m | 22 + nls/C/Window.m | 17 + nls/C/Windowmenu.m | 22 + nls/C/Workspace.m | 4 + nls/C/Workspacemenu.m | 8 + nls/C/blackbox.m | 6 + nls/C/bsetroot.m | 16 + nls/C/common.m | 57 + nls/C/main.m | 21 + nls/Makefile.am | 13 + nls/Makefile.in | 308 +++ nls/blackbox-nls.hh | 167 ++ nls/convert.awk | 32 + nls/da_DK/BaseDisplay.m | 16 + nls/da_DK/Basemenu.m | 4 + nls/da_DK/Configmenu.m | 46 + nls/da_DK/Icon.m | 6 + nls/da_DK/Image.m | 24 + nls/da_DK/Makefile.am | 29 + nls/da_DK/Makefile.in | 220 ++ nls/da_DK/Screen.m | 53 + nls/da_DK/Slit.m | 8 + nls/da_DK/Toolbar.m | 22 + nls/da_DK/Window.m | 17 + nls/da_DK/Windowmenu.m | 20 + nls/da_DK/Workspace.m | 4 + nls/da_DK/Workspacemenu.m | 8 + nls/da_DK/blackbox.m | 6 + nls/da_DK/bsetroot.m | 16 + nls/da_DK/common.m | 57 + nls/da_DK/main.m | 21 + nls/es_ES/BaseDisplay.m | 16 + nls/es_ES/Basemenu.m | 4 + nls/es_ES/Configmenu.m | 48 + nls/es_ES/Icon.m | 4 + nls/es_ES/Image.m | 24 + nls/es_ES/Makefile.am | 32 + nls/es_ES/Makefile.in | 223 ++ nls/es_ES/Screen.m | 51 + nls/es_ES/Slit.m | 8 + nls/es_ES/Toolbar.m | 22 + nls/es_ES/Window.m | 18 + nls/es_ES/Windowmenu.m | 20 + nls/es_ES/Workspace.m | 4 + nls/es_ES/Workspacemenu.m | 8 + nls/es_ES/blackbox.m | 6 + nls/es_ES/bsetroot.m | 16 + nls/es_ES/common.m | 58 + nls/es_ES/main.m | 21 + nls/et_EE/BaseDisplay.m | 16 + nls/et_EE/Basemenu.m | 4 + nls/et_EE/Configmenu.m | 48 + nls/et_EE/Icon.m | 4 + nls/et_EE/Image.m | 24 + nls/et_EE/Makefile.am | 29 + nls/et_EE/Makefile.in | 220 ++ nls/et_EE/Screen.m | 53 + nls/et_EE/Slit.m | 8 + nls/et_EE/Toolbar.m | 22 + nls/et_EE/Window.m | 17 + nls/et_EE/Windowmenu.m | 20 + nls/et_EE/Workspace.m | 4 + nls/et_EE/Workspacemenu.m | 8 + nls/et_EE/blackbox.m | 6 + nls/et_EE/bsetroot.m | 16 + nls/et_EE/common.m | 58 + nls/et_EE/main.m | 21 + nls/fr_FR/BaseDisplay.m | 16 + nls/fr_FR/Basemenu.m | 4 + nls/fr_FR/Configmenu.m | 48 + nls/fr_FR/Icon.m | 4 + nls/fr_FR/Image.m | 24 + nls/fr_FR/Makefile.am | 33 + nls/fr_FR/Makefile.in | 224 +++ nls/fr_FR/Screen.m | 54 + nls/fr_FR/Slit.m | 8 + nls/fr_FR/Toolbar.m | 22 + nls/fr_FR/Window.m | 17 + nls/fr_FR/Windowmenu.m | 20 + nls/fr_FR/Workspace.m | 4 + nls/fr_FR/Workspacemenu.m | 8 + nls/fr_FR/blackbox.m | 6 + nls/fr_FR/bsetroot.m | 16 + nls/fr_FR/common.m | 58 + nls/fr_FR/main.m | 21 + nls/it_IT/BaseDisplay.m | 16 + nls/it_IT/Basemenu.m | 4 + nls/it_IT/Configmenu.m | 48 + nls/it_IT/Icon.m | 4 + nls/it_IT/Image.m | 24 + nls/it_IT/Makefile.am | 30 + nls/it_IT/Makefile.in | 221 ++ nls/it_IT/Screen.m | 54 + nls/it_IT/Slit.m | 8 + nls/it_IT/Toolbar.m | 22 + nls/it_IT/Window.m | 17 + nls/it_IT/Windowmenu.m | 22 + nls/it_IT/Workspace.m | 4 + nls/it_IT/Workspacemenu.m | 8 + nls/it_IT/blackbox.m | 7 + nls/it_IT/bsetroot.m | 16 + nls/it_IT/common.m | 57 + nls/it_IT/main.m | 21 + nls/pt_BR/BaseDisplay.m | 16 + nls/pt_BR/Basemenu.m | 4 + nls/pt_BR/Configmenu.m | 48 + nls/pt_BR/Icon.m | 4 + nls/pt_BR/Image.m | 24 + nls/pt_BR/Makefile.am | 29 + nls/pt_BR/Makefile.in | 220 ++ nls/pt_BR/Screen.m | 52 + nls/pt_BR/Slit.m | 8 + nls/pt_BR/Toolbar.m | 22 + nls/pt_BR/Window.m | 17 + nls/pt_BR/Windowmenu.m | 20 + nls/pt_BR/Workspace.m | 4 + nls/pt_BR/Workspacemenu.m | 8 + nls/pt_BR/blackbox.m | 6 + nls/pt_BR/bsetroot.m | 16 + nls/pt_BR/common.m | 58 + nls/pt_BR/main.m | 21 + nls/ru_RU/BaseDisplay.m | 16 + nls/ru_RU/Basemenu.m | 4 + nls/ru_RU/Configmenu.m | 48 + nls/ru_RU/Icon.m | 4 + nls/ru_RU/Image.m | 24 + nls/ru_RU/Makefile.am | 29 + nls/ru_RU/Makefile.in | 220 ++ nls/ru_RU/Screen.m | 52 + nls/ru_RU/Slit.m | 8 + nls/ru_RU/Toolbar.m | 22 + nls/ru_RU/Window.m | 17 + nls/ru_RU/Windowmenu.m | 20 + nls/ru_RU/Workspace.m | 4 + nls/ru_RU/Workspacemenu.m | 8 + nls/ru_RU/blackbox.m | 6 + nls/ru_RU/bsetroot.m | 16 + nls/ru_RU/common.m | 58 + nls/ru_RU/main.m | 21 + nls/sv_SE/BaseDisplay.m | 16 + nls/sv_SE/Basemenu.m | 4 + nls/sv_SE/Configmenu.m | 48 + nls/sv_SE/Icon.m | 4 + nls/sv_SE/Image.m | 24 + nls/sv_SE/Makefile.am | 30 + nls/sv_SE/Makefile.in | 221 ++ nls/sv_SE/Screen.m | 52 + nls/sv_SE/Slit.m | 8 + nls/sv_SE/Toolbar.m | 22 + nls/sv_SE/Window.m | 17 + nls/sv_SE/Windowmenu.m | 22 + nls/sv_SE/Workspace.m | 4 + nls/sv_SE/Workspacemenu.m | 8 + nls/sv_SE/blackbox.m | 6 + nls/sv_SE/bsetroot.m | 16 + nls/sv_SE/common.m | 58 + nls/sv_SE/main.m | 21 + nls/tr_TR/BaseDisplay.m | 16 + nls/tr_TR/Basemenu.m | 4 + nls/tr_TR/Configmenu.m | 48 + nls/tr_TR/Icon.m | 4 + nls/tr_TR/Image.m | 24 + nls/tr_TR/Makefile.am | 34 + nls/tr_TR/Makefile.in | 225 +++ nls/tr_TR/Screen.m | 52 + nls/tr_TR/Slit.m | 8 + nls/tr_TR/Toolbar.m | 22 + nls/tr_TR/Window.m | 17 + nls/tr_TR/Windowmenu.m | 20 + nls/tr_TR/Workspace.m | 4 + nls/tr_TR/Workspacemenu.m | 8 + nls/tr_TR/blackbox.m | 6 + nls/tr_TR/bsetroot.m | 16 + nls/tr_TR/common.m | 58 + nls/tr_TR/main.m | 21 + src/BaseDisplay.cc | 612 ++++++ src/BaseDisplay.hh | 368 ++++ src/Basemenu.cc | 1067 ++++++++++ src/Basemenu.hh | 192 ++ src/Clientmenu.cc | 63 + src/Clientmenu.hh | 49 + src/Configmenu.cc | 814 ++++++++ src/Configmenu.hh | 95 + src/Icon.cc | 67 + src/Icon.hh | 48 + src/IconBar.cc | 341 ++++ src/IconBar.hh | 72 + src/Image.cc | 2593 ++++++++++++++++++++++++ src/Image.hh | 242 +++ src/Keys.cc | 583 ++++++ src/Keys.hh | 116 ++ src/LinkedList.cc | 354 ++++ src/LinkedList.hh | 131 ++ src/Makefile.am | 55 + src/Makefile.in | 371 ++++ src/Netizen.cc | 145 ++ src/Netizen.hh | 64 + src/Rootmenu.cc | 115 ++ src/Rootmenu.hh | 47 + src/Rotated.hh | 83 + src/Screen.cc | 1677 ++++++++++++++++ src/Screen.hh | 349 ++++ src/Slit.cc | 905 +++++++++ src/Slit.hh | 159 ++ src/Tab.cc | 1069 ++++++++++ src/Tab.hh | 125 ++ src/Theme.cc | 1182 +++++++++++ src/Theme.hh | 162 ++ src/Timer.cc | 82 + src/Timer.hh | 87 + src/Toolbar.cc | 1415 +++++++++++++ src/Toolbar.hh | 163 ++ src/Window.cc | 3312 ++++++++++++++++++++++++++++++ src/Window.hh | 321 +++ src/Windowmenu.cc | 323 +++ src/Windowmenu.hh | 88 + src/Workspace.cc | 512 +++++ src/Workspace.hh | 90 + src/Workspacemenu.cc | 84 + src/Workspacemenu.hh | 48 + src/bsd-snprintf.c | 788 ++++++++ src/bsd-snprintf.h | 17 + src/fluxbox.cc | 2560 +++++++++++++++++++++++ src/fluxbox.hh | 291 +++ src/i18n.cc | 126 ++ src/i18n.hh | 71 + src/main.cc | 272 +++ src/misc.cc | 478 +++++ src/misc.hh | 60 + stamp-h.in | 1 + util/Makefile.am | 17 + util/Makefile.in | 369 ++++ util/bsetbg | 699 +++++++ util/bsetroot.cc | 300 +++ util/bsetroot.hh | 33 + version.h.in | 1 + 302 files changed, 54314 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 NEWS create mode 100644 README create mode 100644 TODO create mode 100644 aclocal.m4 create mode 100755 config.guess create mode 100644 config.h.in create mode 100755 config.sub create mode 100755 configure create mode 100644 configure.in create mode 100644 data/Makefile.am create mode 100644 data/Makefile.in create mode 100644 data/README create mode 100644 data/README.menu create mode 100644 data/README.style create mode 100755 data/generate_menu create mode 100644 data/init.in create mode 100644 data/keys create mode 100644 data/styles/Artwiz create mode 100644 data/styles/Blue create mode 100644 data/styles/Carbondioxide create mode 100644 data/styles/Clean create mode 100644 data/styles/CleanColor create mode 100644 data/styles/Cthulhain create mode 100644 data/styles/Flux create mode 100644 data/styles/Makefile.am create mode 100644 data/styles/Makefile.in create mode 100644 data/styles/Makro create mode 100644 data/styles/MerleyKay create mode 100644 data/styles/Minimal create mode 100644 data/styles/Nyz create mode 100644 data/styles/Operation create mode 100644 data/styles/Outcomes create mode 100644 data/styles/Rampage create mode 100644 data/styles/Rancor create mode 100644 data/styles/Results create mode 100644 data/styles/Shade create mode 100644 data/styles/Spiff create mode 100644 data/styles/TDF create mode 100644 data/styles/Twice create mode 100644 data/styles/qnx-photon create mode 100644 data/titlebar create mode 100644 doc/Coding_style create mode 100644 doc/Makefile.am create mode 100644 doc/Makefile.in create mode 100644 doc/bsetroot.1 create mode 100644 doc/fluxbox.1.in create mode 100755 install-sh create mode 100755 ltconfig create mode 100644 ltmain.sh create mode 100755 missing create mode 100755 mkinstalldirs create mode 100644 nls/C/BaseDisplay.m create mode 100644 nls/C/Basemenu.m create mode 100644 nls/C/Configmenu.m create mode 100644 nls/C/Icon.m create mode 100644 nls/C/Image.m create mode 100644 nls/C/Makefile.am create mode 100644 nls/C/Makefile.in create mode 100644 nls/C/Screen.m create mode 100644 nls/C/Slit.m create mode 100644 nls/C/Toolbar.m create mode 100644 nls/C/Window.m create mode 100644 nls/C/Windowmenu.m create mode 100644 nls/C/Workspace.m create mode 100644 nls/C/Workspacemenu.m create mode 100644 nls/C/blackbox.m create mode 100644 nls/C/bsetroot.m create mode 100644 nls/C/common.m create mode 100644 nls/C/main.m create mode 100644 nls/Makefile.am create mode 100644 nls/Makefile.in create mode 100644 nls/blackbox-nls.hh create mode 100644 nls/convert.awk create mode 100644 nls/da_DK/BaseDisplay.m create mode 100644 nls/da_DK/Basemenu.m create mode 100644 nls/da_DK/Configmenu.m create mode 100644 nls/da_DK/Icon.m create mode 100644 nls/da_DK/Image.m create mode 100644 nls/da_DK/Makefile.am create mode 100644 nls/da_DK/Makefile.in create mode 100644 nls/da_DK/Screen.m create mode 100644 nls/da_DK/Slit.m create mode 100644 nls/da_DK/Toolbar.m create mode 100644 nls/da_DK/Window.m create mode 100644 nls/da_DK/Windowmenu.m create mode 100644 nls/da_DK/Workspace.m create mode 100644 nls/da_DK/Workspacemenu.m create mode 100644 nls/da_DK/blackbox.m create mode 100644 nls/da_DK/bsetroot.m create mode 100644 nls/da_DK/common.m create mode 100644 nls/da_DK/main.m create mode 100644 nls/es_ES/BaseDisplay.m create mode 100644 nls/es_ES/Basemenu.m create mode 100644 nls/es_ES/Configmenu.m create mode 100644 nls/es_ES/Icon.m create mode 100644 nls/es_ES/Image.m create mode 100644 nls/es_ES/Makefile.am create mode 100644 nls/es_ES/Makefile.in create mode 100644 nls/es_ES/Screen.m create mode 100644 nls/es_ES/Slit.m create mode 100644 nls/es_ES/Toolbar.m create mode 100644 nls/es_ES/Window.m create mode 100644 nls/es_ES/Windowmenu.m create mode 100644 nls/es_ES/Workspace.m create mode 100644 nls/es_ES/Workspacemenu.m create mode 100644 nls/es_ES/blackbox.m create mode 100644 nls/es_ES/bsetroot.m create mode 100644 nls/es_ES/common.m create mode 100644 nls/es_ES/main.m create mode 100644 nls/et_EE/BaseDisplay.m create mode 100644 nls/et_EE/Basemenu.m create mode 100644 nls/et_EE/Configmenu.m create mode 100644 nls/et_EE/Icon.m create mode 100644 nls/et_EE/Image.m create mode 100644 nls/et_EE/Makefile.am create mode 100644 nls/et_EE/Makefile.in create mode 100644 nls/et_EE/Screen.m create mode 100644 nls/et_EE/Slit.m create mode 100644 nls/et_EE/Toolbar.m create mode 100644 nls/et_EE/Window.m create mode 100644 nls/et_EE/Windowmenu.m create mode 100644 nls/et_EE/Workspace.m create mode 100644 nls/et_EE/Workspacemenu.m create mode 100644 nls/et_EE/blackbox.m create mode 100644 nls/et_EE/bsetroot.m create mode 100644 nls/et_EE/common.m create mode 100644 nls/et_EE/main.m create mode 100644 nls/fr_FR/BaseDisplay.m create mode 100644 nls/fr_FR/Basemenu.m create mode 100644 nls/fr_FR/Configmenu.m create mode 100644 nls/fr_FR/Icon.m create mode 100644 nls/fr_FR/Image.m create mode 100644 nls/fr_FR/Makefile.am create mode 100644 nls/fr_FR/Makefile.in create mode 100644 nls/fr_FR/Screen.m create mode 100644 nls/fr_FR/Slit.m create mode 100644 nls/fr_FR/Toolbar.m create mode 100644 nls/fr_FR/Window.m create mode 100644 nls/fr_FR/Windowmenu.m create mode 100644 nls/fr_FR/Workspace.m create mode 100644 nls/fr_FR/Workspacemenu.m create mode 100644 nls/fr_FR/blackbox.m create mode 100644 nls/fr_FR/bsetroot.m create mode 100644 nls/fr_FR/common.m create mode 100644 nls/fr_FR/main.m create mode 100644 nls/it_IT/BaseDisplay.m create mode 100644 nls/it_IT/Basemenu.m create mode 100644 nls/it_IT/Configmenu.m create mode 100644 nls/it_IT/Icon.m create mode 100644 nls/it_IT/Image.m create mode 100644 nls/it_IT/Makefile.am create mode 100644 nls/it_IT/Makefile.in create mode 100644 nls/it_IT/Screen.m create mode 100644 nls/it_IT/Slit.m create mode 100644 nls/it_IT/Toolbar.m create mode 100644 nls/it_IT/Window.m create mode 100644 nls/it_IT/Windowmenu.m create mode 100644 nls/it_IT/Workspace.m create mode 100644 nls/it_IT/Workspacemenu.m create mode 100644 nls/it_IT/blackbox.m create mode 100644 nls/it_IT/bsetroot.m create mode 100644 nls/it_IT/common.m create mode 100644 nls/it_IT/main.m create mode 100644 nls/pt_BR/BaseDisplay.m create mode 100644 nls/pt_BR/Basemenu.m create mode 100644 nls/pt_BR/Configmenu.m create mode 100644 nls/pt_BR/Icon.m create mode 100644 nls/pt_BR/Image.m create mode 100644 nls/pt_BR/Makefile.am create mode 100644 nls/pt_BR/Makefile.in create mode 100644 nls/pt_BR/Screen.m create mode 100644 nls/pt_BR/Slit.m create mode 100644 nls/pt_BR/Toolbar.m create mode 100644 nls/pt_BR/Window.m create mode 100644 nls/pt_BR/Windowmenu.m create mode 100644 nls/pt_BR/Workspace.m create mode 100644 nls/pt_BR/Workspacemenu.m create mode 100644 nls/pt_BR/blackbox.m create mode 100644 nls/pt_BR/bsetroot.m create mode 100644 nls/pt_BR/common.m create mode 100644 nls/pt_BR/main.m create mode 100644 nls/ru_RU/BaseDisplay.m create mode 100644 nls/ru_RU/Basemenu.m create mode 100644 nls/ru_RU/Configmenu.m create mode 100644 nls/ru_RU/Icon.m create mode 100644 nls/ru_RU/Image.m create mode 100644 nls/ru_RU/Makefile.am create mode 100644 nls/ru_RU/Makefile.in create mode 100644 nls/ru_RU/Screen.m create mode 100644 nls/ru_RU/Slit.m create mode 100644 nls/ru_RU/Toolbar.m create mode 100644 nls/ru_RU/Window.m create mode 100644 nls/ru_RU/Windowmenu.m create mode 100644 nls/ru_RU/Workspace.m create mode 100644 nls/ru_RU/Workspacemenu.m create mode 100644 nls/ru_RU/blackbox.m create mode 100644 nls/ru_RU/bsetroot.m create mode 100644 nls/ru_RU/common.m create mode 100644 nls/ru_RU/main.m create mode 100644 nls/sv_SE/BaseDisplay.m create mode 100644 nls/sv_SE/Basemenu.m create mode 100644 nls/sv_SE/Configmenu.m create mode 100644 nls/sv_SE/Icon.m create mode 100644 nls/sv_SE/Image.m create mode 100644 nls/sv_SE/Makefile.am create mode 100644 nls/sv_SE/Makefile.in create mode 100644 nls/sv_SE/Screen.m create mode 100644 nls/sv_SE/Slit.m create mode 100644 nls/sv_SE/Toolbar.m create mode 100644 nls/sv_SE/Window.m create mode 100644 nls/sv_SE/Windowmenu.m create mode 100644 nls/sv_SE/Workspace.m create mode 100644 nls/sv_SE/Workspacemenu.m create mode 100644 nls/sv_SE/blackbox.m create mode 100644 nls/sv_SE/bsetroot.m create mode 100644 nls/sv_SE/common.m create mode 100644 nls/sv_SE/main.m create mode 100644 nls/tr_TR/BaseDisplay.m create mode 100644 nls/tr_TR/Basemenu.m create mode 100644 nls/tr_TR/Configmenu.m create mode 100644 nls/tr_TR/Icon.m create mode 100644 nls/tr_TR/Image.m create mode 100644 nls/tr_TR/Makefile.am create mode 100644 nls/tr_TR/Makefile.in create mode 100644 nls/tr_TR/Screen.m create mode 100644 nls/tr_TR/Slit.m create mode 100644 nls/tr_TR/Toolbar.m create mode 100644 nls/tr_TR/Window.m create mode 100644 nls/tr_TR/Windowmenu.m create mode 100644 nls/tr_TR/Workspace.m create mode 100644 nls/tr_TR/Workspacemenu.m create mode 100644 nls/tr_TR/blackbox.m create mode 100644 nls/tr_TR/bsetroot.m create mode 100644 nls/tr_TR/common.m create mode 100644 nls/tr_TR/main.m create mode 100644 src/BaseDisplay.cc create mode 100644 src/BaseDisplay.hh create mode 100644 src/Basemenu.cc create mode 100644 src/Basemenu.hh create mode 100644 src/Clientmenu.cc create mode 100644 src/Clientmenu.hh create mode 100644 src/Configmenu.cc create mode 100644 src/Configmenu.hh create mode 100644 src/Icon.cc create mode 100644 src/Icon.hh create mode 100644 src/IconBar.cc create mode 100644 src/IconBar.hh create mode 100644 src/Image.cc create mode 100644 src/Image.hh create mode 100644 src/Keys.cc create mode 100644 src/Keys.hh create mode 100644 src/LinkedList.cc create mode 100644 src/LinkedList.hh create mode 100644 src/Makefile.am create mode 100644 src/Makefile.in create mode 100644 src/Netizen.cc create mode 100644 src/Netizen.hh create mode 100644 src/Rootmenu.cc create mode 100644 src/Rootmenu.hh create mode 100644 src/Rotated.hh create mode 100644 src/Screen.cc create mode 100644 src/Screen.hh create mode 100644 src/Slit.cc create mode 100644 src/Slit.hh create mode 100644 src/Tab.cc create mode 100644 src/Tab.hh create mode 100644 src/Theme.cc create mode 100644 src/Theme.hh create mode 100644 src/Timer.cc create mode 100644 src/Timer.hh create mode 100644 src/Toolbar.cc create mode 100644 src/Toolbar.hh create mode 100644 src/Window.cc create mode 100644 src/Window.hh create mode 100644 src/Windowmenu.cc create mode 100644 src/Windowmenu.hh create mode 100644 src/Workspace.cc create mode 100644 src/Workspace.hh create mode 100644 src/Workspacemenu.cc create mode 100644 src/Workspacemenu.hh create mode 100644 src/bsd-snprintf.c create mode 100644 src/bsd-snprintf.h create mode 100644 src/fluxbox.cc create mode 100644 src/fluxbox.hh create mode 100644 src/i18n.cc create mode 100644 src/i18n.hh create mode 100644 src/main.cc create mode 100644 src/misc.cc create mode 100644 src/misc.hh create mode 100644 stamp-h.in create mode 100644 util/Makefile.am create mode 100644 util/Makefile.in create mode 100755 util/bsetbg create mode 100644 util/bsetroot.cc create mode 100644 util/bsetroot.hh create mode 100644 version.h.in diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 00000000..9a3fe0a8 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,63 @@ +-- AUTHORS for Fluxbox +Author: + Henrik Kinnunen + +Contributors: + Joel Carlbark + - suggestions, bug reports, beta testing, styles + and some code. + Cleas Nästén + - suggestions, bug reports, beta testing and + Tab placement/alignment code. + Johan Andersson + - suggestions, bug reports and beta testing + Oliwier Ptak + - suggestions, styles and webpage + +-- AUTHORS for Blackbox 0.61.1 - an X11 Window manager + +Author: + Brad Hughes + +Co-author: + Jeff Raven + +Contributors: + Jeffrey Sean Connell + - debugger class code (ommited from sources) + Frank Belew + - dgradient code + Scott Garner + - suggestions, bug reports and beta testing (*the* beta moron) + David Doan + - testing of 8bpp code + Mark Seward + - beta testing, bug reports and 32bpp testing + Keith Bolland + - beta testing, bug reports and suggestions + James Spooner + - beta testing, bug reports + Fred Knieper + - beta testing, bug reports + Steve Udell + - beta testing, bug reports, questions (very good ones) + Gregory Barlow + - bug reports and patches/suggestions (original middle click advocate) + Dyon Balding + - patch for Smart(er)Placement window placement + Mike Cole + - co-author/hacker of Image.cc (local LUG buddy) + John Kennis + - author of bbtools/beta testing/bug reports + Wilbert Berendsen + - author of blackbox/bsetroot manpages + +I would also like to thank the creators of WindowMaker. Reading the existing +code has helped me immensely, and the BImage class follows the RImage data type +very closely (the 8bpp code and dithering code was based off of WindowMaker's +wrlib). + +I recently stumbled upon a library called ccmalloc (which is included in the +source tarball with blackbox) that has helped me immensely. Many thanks to +Armin Biere for this debugging aid. + diff --git a/COPYING b/COPYING new file mode 100644 index 00000000..60b4606c --- /dev/null +++ b/COPYING @@ -0,0 +1,41 @@ +Copyright (c) 2001 Henrik Kinnunen (fluxgen@linuxmail.org) + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +--- Copyright for the blackbox partions of the code: + +Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net) + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 00000000..67a98aa1 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,204 @@ +Changes for 0.1.5: +*01/12/09 + * Added execCommand to keybindings + * Added new theme qnx-photon + * Fixed util/Makefile.am + * Buggfix in Tab::insert +*01/12/08: + * Fixed "Move Group to..."-bugg (me) + * Updated AUTHORS (me) + * Fixed ungrabbing keys in Keys::load (me) + * Added rootCommand override (Joel Carlbark) + * Updated Tab code (Cleas Nästén) + * Moved some structs and enums in to the classes + to clean up the global namespace. (me) + * Added grabNextTab, grabPrevTab, grabAbortKeychain (me) + * Added mergeTree in class Keys (me) + * Added Italian nls (Thanks Giuseppe Ciotta ) + * Changed name on the includeguards (me) + * Updated the doc/Coding_style (me) + * Added "none" to titlebar config + so users can create a titlebar without buttons (Joel Carlbark) + * Fixed reversed justify in menustyle (me) +*01/12/05: + * Updated Tab code (Claes Nästén) +*01/12/03: + * Added "tab" in Windowmenu.cc (me) + * Updated Tab code (Claes Nästén) +*01/12/01: + * Fixed chained keybinding so we can do "emacs-keybindingstyle" (me) +*01/11/30: + * Fixed position code for tabs (me) + * Fixed tabconfigmenu bugg (me) + * Added new keybinding code (me) + * Removed old bbkeys code (me) +*01/11/29: + * applied Tab position patch (Claes Nästén) + * Fixed transient_for-bugg, Fluxbox::~FluxboxWindow (me) + client.transient_for didn't got focus and caused the (me) + Fluxbox::focused_window to be a badpointer since + the focused_window was pointing to an already destroyed + FluxboxWindow. (me) +*01/11/27: + * Added alignment for tabs in Tab.cc (me) +*01/11/22: + * Added wheelscroll to change tab on titlebar. Window.cc/.hh (me) +*01/11/20: + * Screen.hh/cc Added updateWorkspaceNamesAtom + updates the gnome atom _WIN_WORKSPACE_NAMES (me) +*01/11/18: + * Window.cc Fixed "invalid pixmap" error (me) +*01/11/17: + * Gnome _WIN_WORKSPACE (me) + * Gnome _WIN_WORKSPACE_COUNT (me) + * Gnome _WIN_CLIENT_LIST (me) +*01/11/15: + * Added --enable-gnome to configure.in (me) +*01/11/14: + * Added Gnome atoms (BaseDisplay.cc/hh) (me) +*01/11/13: + * Fixed grabs for window. No we can Alt+Move window with + Numlock, Capslock and Scrolllock on. (me) + * Fixed nls for "Use Icons" and "Use Tabs" (Claes Nästén) + * Removed BScreen::LoadStyle() (me) +*01/11/12: + * Tab::draw, DrawString (me) + * FluxboxWindow::redrawLabel, DrawString (me) + * Moved strcasestr to misc.hh/cc (me) + * Added DrawString function in misc.hh/cc (me) + * Added misc.cc/hh (me) +*01/11/11: + * Theme.cc/.hh added to source, handles all theme loading (me) +*01/11/09: + * Fixed bugg in Fluxbox::getRcFilename() (me) +*01/11/07: + * Removed a not working wheelscroll on rootwindow in fluxbox.cc (me) + * Moved wheelscroll in Toolbar.cc from pressEvent to releaseEvent (me) + * Fixed some nls in data (me) +*01/11/06: + * Fixed syntaxerror in Makro and CleanColor theme (me) + * First part of restructure for themes (me) +*01/11/05: + * Clean up in IconBar.cc (me) +*01/11/04: + * Fixed so it compiles with gcc 3.0.x (me) + +Changes for 0.1.4: +*01/11/03: Added new theme: Carbondioxide by skypher +*01/11/03: Fixed bsetbg in utils/Makefile.am +*01/11/02: Clean up +*01/11/02: Added session.iconbar to config file +*01/11/02: Changed the generate_menu skript to clean sh +*01/11/02: Updated skyphers theme (Clean, CleanColor, MerleyKay, Makro) +*01/11/02: Fixed parentrelative in tabs +*01/11/02: Fixed so the tab disconnects when it iconifies +*01/11/02: Added "Use Iconbar" to configmenu +*01/11/01: Added iconbar to the toolbar (new files IconBar.cc/.hh) +*01/10/31: Added border to tabs +*01/10/31: Removed workspace change when wheelscroll on titlebar +*01/10/31: Fixed so shade is correct when linkin tabs +*01/10/31: Fixed default color/texture for tab to be the same as titlebar + if the theme is a blackbox theme. +*01/10/29: Added KDE support (thanks Dan Williams for the blackbox patch) +*01/10/29: Fixed reconfigure-bugg for tabs +*01/10/28: Added "Use Tabs" in configure menu +*01/10/28: Added theme support for tabs +*01/10/28: Fixed the move bugg when moving a tablist + +Changes for 0.1.3: + +* Default focusmode is ClickToFocus + changed in fluxbox.cc + +* fluxbox.hh + added resource.tabs + +* fluxbox.cc + added enterNotify for tabs + added load/save in load_rc() save_rc() for resource.tabs + +* blackbox-nls.hh + added WindowmenuSendGroupTo + +* Windowmenu.hh,.cc + added sendGroupTo() so we can send a hole + list to another workspace + +* Tab.hh,.cc: + Added functions: iconify, deiconfigy, withdraw, + disconnect, insert, shade + EnterNotifyMask for tabwindow + +* fluxbox.cc: getRcFilename + fixed correct lenght on dbfile + +* Window.cc: motionNotifyEvent + removed unnecessary 'else if'-statement + +* Screen.cc: LoadStyle() + changed exit to throw + +* Screen.cc: prevWorkspace, nextWorkspace + fixed revers workspace change. + +Changes for Fluxbox 0.1.2: + +* Added doc/Coding_style + +* FluxboxWindow.cc: FluxboxWindow::buttonPressEvent + fixed so the shade button is drawn in pressed mode. + +* CleanColor theme: error fixed. + +* default theme is now: Clean + +* fluxbox.hh,.cc: execCommand removed + uses bexec from BaseDisplay.hh, to grabExecute in process_event, instead. + +* Window.cc: FluxboxWindow::FluxboxWindow + Changed event_mask for XGrabButton frame.plate from 0 to AnyModifier + and ungrabs Mod1-3. + This should fix the focus "bugg" when num lock, caps lock or scroll lock + are pressed. + +* fluxbox.cc: Fluxbox::process_event + fixed an error check on getAction in + KeyPress case. + +* I18n class is now singleton type + +* Changed name on: + Blackbox class to Fluxbox + BlackboxWindow to FluxboxWindow + +* Changed name on file blackbox.cc and blackbox.hh to + fluxbox.cc and fluxbox.hh + +Changes from Blackbox 0.61.1 to Fluxbox 0.1.1: + +* Integrated bbkeys in code. + "session.keyFile: thekeyfile" in the file init + +* "make dist" now creates a "functional" tarball + +* Escape cancels edit workspace name + and return to old name + +* New coding style + using tab instead of space for ident + +* Variable titlebar + The buttons on the titlebar can now be configured. + +* Wheelscroll + Wheelscroll function on titlebar and toolbar changes workspace + +* Config path + The config path is now ~/.fluxbox + +* Toolbar.cc: ~Toolbar + memory leak fix + It didnt remove some windows in ToolbarSearch. + +* Blackbox class now singleton type + diff --git a/INSTALL b/INSTALL new file mode 100644 index 00000000..471447bb --- /dev/null +++ b/INSTALL @@ -0,0 +1,94 @@ +-- INSTALL for Fluxbox + +Compilation and Installation: +-------------------------------- + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory in the +Blackbox source tree. + +Finally, it creates a shell script `config.status' that you can run +in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile Blackbox, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to bhughes@tcac.net so they can be considered +for the next release. If at some point `config.cache' contains +results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Type `make install' to install the programs and any data files and + documentation. + + 4. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. + + +Compilers and Options: +---------------------- + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + + +Optional Features: +------------------ +Fluxbox supports the XShape extension of X11R6. This support is enabled by +default, but may be overridden by specifying `--disable-shape' on the configure +script's command line. + +Fluxbox supports Window Maker dockapps (warning: restarts from wmaker to +fluxbox don't always handle dockapps correctly) with a gadget called the Slit. +The Slit is compiled into Blackbox by default, but may be overridden by +specifying `--disable-slit' on the configure script's command line. + +Fluxbox supports a rendering effect called "faked interlacing" which darkens +every other line in rendered images. This support works only for gradient +images. It is compiled in by default, but may be overridden by specifying +`--disable-interlace' on the configure script's command line. + +Fluxbox provides an alternative rendering algorithm for dithering on +pseudocolor (8 bit) displays. A noticeable pattern is visible when using +this; it's a matter of taste whether this looks better than the default +algorithm. It is disabled by default, but may be overridden by specifying +'--enable-ordered-pseudo' on the configure script's command line. + +Fluxbox uses a timer which allows it to periodically flush its pixmap +cache. It is enabled by default, but may be overridden by specifying +'--disable-timed-cache' on the configure script's command line. + +Also, `configure' can usually find the X include and library files +automatically, but if it doesn't, you can use the `configure' +options `--x-includes=DIR' and `--x-libraries=DIR' to specify +their locations. + + +Please read the README file also. + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 00000000..8097d532 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,9 @@ +# Makefile.am for Fluxbox 0.1.x + +SUBDIRS = data doc nls src util +MAINTAINERCLEANFILES = aclocal.m4 config.h.in configure Makefile.in stamp-h.in + +uninstall-local: + rmdir $(pkgdatadir) +distclean-local: + rm -f *\~ diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 00000000..7033a27f --- /dev/null +++ b/Makefile.in @@ -0,0 +1,384 @@ +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# Makefile.am for Fluxbox 0.1.x + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = . + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +AS = @AS@ +CC = @CC@ +CXX = @CXX@ +DEBUG = @DEBUG@ +DLLTOOL = @DLLTOOL@ +GNOME = @GNOME@ +INTERLACE = @INTERLACE@ +KDE = @KDE@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +NEWWMSPEC = @NEWWMSPEC@ +NLS = @NLS@ +OBJDUMP = @OBJDUMP@ +ORDEREDPSEUDO = @ORDEREDPSEUDO@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +SHAPE = @SHAPE@ +SLIT = @SLIT@ +TIMEDCACHE = @TIMEDCACHE@ +VERSION = @VERSION@ +gencat_cmd = @gencat_cmd@ +regex_cmd = @regex_cmd@ + +SUBDIRS = data doc nls src util +MAINTAINERCLEANFILES = aclocal.m4 config.h.in configure Makefile.in stamp-h.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = version.h +DIST_COMMON = README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \ +Makefile.am Makefile.in NEWS TODO aclocal.m4 config.guess config.h.in \ +config.sub configure configure.in install-sh ltconfig ltmain.sh missing \ +mkinstalldirs version.h.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status + +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in + cd $(srcdir) && $(ACLOCAL) + +config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck +$(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) + cd $(srcdir) && $(AUTOCONF) + +config.h: stamp-h + @if test ! -f $@; then \ + rm -f stamp-h; \ + $(MAKE) stamp-h; \ + else :; fi +stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES= CONFIG_HEADERS=config.h \ + $(SHELL) ./config.status + @echo timestamp > stamp-h 2> /dev/null +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@$(srcdir)/stamp-h.in + @if test ! -f $@; then \ + rm -f $(srcdir)/stamp-h.in; \ + $(MAKE) $(srcdir)/stamp-h.in; \ + else :; fi +$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOHEADER) + @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null + +mostlyclean-hdr: + +clean-hdr: + +distclean-hdr: + -rm -f config.h + +maintainer-clean-hdr: +version.h: $(top_builddir)/config.status version.h.in + cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. + +@SET_MAKE@ + +all-recursive install-data-recursive install-exec-recursive \ +installdirs-recursive install-recursive uninstall-recursive \ +check-recursive installcheck-recursive info-recursive dvi-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ + rev="$$subdir $$rev"; \ + test "$$subdir" = "." && dot_seen=yes; \ + done; \ + test "$$dot_seen" = "no" && rev=". $$rev"; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + -rm -rf $(distdir) + GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz + mkdir $(distdir)/=build + mkdir $(distdir)/=inst + dc_install_base=`cd $(distdir)/=inst && pwd`; \ + cd $(distdir)/=build \ + && ../configure --srcdir=.. --prefix=$$dc_install_base \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) dist + -rm -rf $(distdir) + @banner="$(distdir).tar.gz is ready for distribution"; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes" +dist: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) + -rm -rf $(distdir) +dist-all: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) + -rm -rf $(distdir) +distdir: $(DISTFILES) + -rm -rf $(distdir) + mkdir $(distdir) + -chmod 777 $(distdir) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + for subdir in $(SUBDIRS); do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + chmod 777 $(distdir)/$$subdir; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \ + || exit 1; \ + fi; \ + done +info-am: +info: info-recursive +dvi-am: +dvi: dvi-recursive +check-am: all-am +check: check-recursive +installcheck-am: +installcheck: installcheck-recursive +all-recursive-am: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +install-exec-am: +install-exec: install-exec-recursive + +install-data-am: +install-data: install-data-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-recursive +uninstall-am: uninstall-local +uninstall: uninstall-recursive +all-am: Makefile config.h +all-redirect: all-recursive-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: installdirs-recursive +installdirs-am: + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +mostlyclean-am: mostlyclean-hdr mostlyclean-tags mostlyclean-generic + +mostlyclean: mostlyclean-recursive + +clean-am: clean-hdr clean-tags clean-generic mostlyclean-am + +clean: clean-recursive + +distclean-am: distclean-hdr distclean-tags distclean-generic clean-am \ + distclean-local + -rm -f libtool + +distclean: distclean-recursive + -rm -f config.status + +maintainer-clean-am: maintainer-clean-hdr maintainer-clean-tags \ + maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-recursive + -rm -f config.status + +.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ +install-data-recursive uninstall-data-recursive install-exec-recursive \ +uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \ +all-recursive check-recursive installcheck-recursive info-recursive \ +dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \ +maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ +distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ +dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \ +install-exec-am install-exec install-data-am install-data install-am \ +install uninstall-local uninstall-am uninstall all-redirect all-am all \ +installdirs-am installdirs mostlyclean-generic distclean-generic \ +clean-generic maintainer-clean-generic clean mostlyclean distclean \ +maintainer-clean + + +uninstall-local: + rmdir $(pkgdatadir) +distclean-local: + rm -f *\~ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/NEWS b/NEWS new file mode 100644 index 00000000..40424b2c --- /dev/null +++ b/NEWS @@ -0,0 +1,11 @@ +So whats new in 0.1.5? + * Keybinding code and new keyconfiguresstyle + * Keybindings: NextTab, PrevTab and AbortKeychain + * Tab placement and alignment + * wheelscroll on titlebar changes between tabs + * Toggle tab on windows + * Semi-sloppy focus + * Italian nls + * a session.rootCommand to override the Themes rootCommand + * and some buggfixes + diff --git a/README b/README new file mode 100644 index 00000000..4a5f4bbf --- /dev/null +++ b/README @@ -0,0 +1,35 @@ +Fluxbox builds on Blackbox source but has different goals. +For copyright see COPYING + +Compile and Install: + +# ./configure +# make +and then as root +# make install + +for KDE slitsupport: + ./configure --enable-kde + +To disable tabs and/or iconbar just change it in configure menu. + +To use your own configuration: +Create a directorory, in your homedir, called .fluxbox +and copy: init, titlebar and menu from fluxbox datapath. +Dont forget to change session.menuFile and session.titlebarFile +in the file init. + +You can use your old blackbox configuration file too. Just copy +.blackboxrc to ~/.fluxbox/init . The same goes for menu file. +The bbkeys config file can be selected in the file init: +session.keyFile: +You can also use the Blackbox themes in Fluxbox. +If there isn't any format for the tab in the theme then +the tab will have the same theme as the titlebar. + +Thanks: +Blackbox team +#linux.se@dalnet, #linux.se@openproject.net +skypher of openprojects for buggtesting and providing fluxbox with themes: +Clean CleanColor Makro, Carbondioxide and MerleyKay. +skarin, Perc, xfs, skypher and skywarper for buggtesting diff --git a/TODO b/TODO new file mode 100644 index 00000000..05f8d9bf --- /dev/null +++ b/TODO @@ -0,0 +1,37 @@ +TODO for Fluxbox 0.2.0 +* sloppy focus - auto-raise +- Fix configurable toolbar + so the user can configure toolbar in a config file + +- Fix so config file is created @ $HOME if first use + and config files is copied and configured + +- Fix so toolbar dont hide if its autohide and + you are in "change workspace mode" + +- grabKillWindow to keygrabber grabCloseWindow + +* Fluxbox::real_reconfigure ...check "session.styleFile %s" +* grabRootmenu +* wheel-config support +* separator in the menus +* slit-maximize-stop +(* restructure BImageControl::parseTexture) +* slit.onTop and slit.placement "bugg" when changin in configurefile +* fix "move group to..." without tab bugg. +* 0,0-pos fix +* reconfigure tar upp nya dekorationer + +07:39AM also, (2) fluxbox wont currently build on linux-hppa, needs the config.{sub, + guess} updated from ftp://ftp.gnu.org/pub/gnu/config/ + +* Create fbrun style app +* Add wheelscroll-workspace-change configuration (reversed order or + regular)- Add "system menu" for minimized apps in the toolbar. + (Close, Kill, Send to, etc) + +* HUP the window manager, so it re-reads the + .fluxbox/init - rather than having to kill the window manager to change those + settings (like the key map) + +* "Iconify group" in Windowmenu diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 00000000..a1cdbcb0 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,573 @@ +dnl aclocal.m4 generated automatically by aclocal 1.4 + +dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. + +# Do all the work for Automake. This macro actually does too much -- +# some checks are only needed if your package does certain things. +# But this isn't really a big deal. + +# serial 1 + +dnl Usage: +dnl AM_INIT_AUTOMAKE(package,version, [no-define]) + +AC_DEFUN(AM_INIT_AUTOMAKE, +[AC_REQUIRE([AC_PROG_INSTALL]) +PACKAGE=[$1] +AC_SUBST(PACKAGE) +VERSION=[$2] +AC_SUBST(VERSION) +dnl test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi +ifelse([$3],, +AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) +AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) +AC_REQUIRE([AM_SANITY_CHECK]) +AC_REQUIRE([AC_ARG_PROGRAM]) +dnl FIXME This is truly gross. +missing_dir=`cd $ac_aux_dir && pwd` +AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) +AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) +AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) +AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) +AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) +AC_REQUIRE([AC_PROG_MAKE_SET])]) + +# +# Check to make sure that the build environment is sane. +# + +AC_DEFUN(AM_SANITY_CHECK, +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "[$]*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "[$]*" != "X $srcdir/configure conftestfile" \ + && test "[$]*" != "X conftestfile $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "[$]2" = conftestfile + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +rm -f conftest* +AC_MSG_RESULT(yes)]) + +dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) +dnl The program must properly implement --version. +AC_DEFUN(AM_MISSING_PROG, +[AC_MSG_CHECKING(for working $2) +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if ($2 --version) < /dev/null > /dev/null 2>&1; then + $1=$2 + AC_MSG_RESULT(found) +else + $1="$3/missing $2" + AC_MSG_RESULT(missing) +fi +AC_SUBST($1)]) + + +# serial 40 AC_PROG_LIBTOOL +AC_DEFUN(AC_PROG_LIBTOOL, +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl + +# Save cache, so that ltconfig can load it +AC_CACHE_SAVE + +# Actually configure libtool. ac_aux_dir is where install-sh is found. +CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ +LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ +LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \ +DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \ +${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ +$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \ +|| AC_MSG_ERROR([libtool configure failed]) + +# Reload cache, that may have been modified by ltconfig +AC_CACHE_LOAD + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Redirect the config.log output again, so that the ltconfig log is not +# clobbered by the next message. +exec 5>>./config.log +]) + +AC_DEFUN(AC_LIBTOOL_SETUP, +[AC_PREREQ(2.13)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_RANLIB])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_NM])dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +dnl + +case "$target" in +NONE) lt_target="$host" ;; +*) lt_target="$target" ;; +esac + +# Check for any special flags to pass to ltconfig. +libtool_flags="--cache-file=$cache_file" +test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" +test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" +test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" +test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" +test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" +ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], +[libtool_flags="$libtool_flags --enable-dlopen"]) +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +[libtool_flags="$libtool_flags --enable-win32-dll"]) +AC_ARG_ENABLE(libtool-lock, + [ --disable-libtool-lock avoid locking (might break parallel builds)]) +test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock" +test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case "$lt_target" in +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +]) +esac +]) + +# AC_LIBTOOL_DLOPEN - enable checks for dlopen support +AC_DEFUN(AC_LIBTOOL_DLOPEN, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])]) + +# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's +AC_DEFUN(AC_LIBTOOL_WIN32_DLL, [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) + +# AC_ENABLE_SHARED - implement the --enable-shared flag +# Usage: AC_ENABLE_SHARED[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN(AC_ENABLE_SHARED, [dnl +define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(shared, +changequote(<<, >>)dnl +<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case "$enableval" in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl +]) + +# AC_DISABLE_SHARED - set the default shared flag to --disable-shared +AC_DEFUN(AC_DISABLE_SHARED, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no)]) + +# AC_ENABLE_STATIC - implement the --enable-static flag +# Usage: AC_ENABLE_STATIC[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN(AC_ENABLE_STATIC, [dnl +define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(static, +changequote(<<, >>)dnl +<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case "$enableval" in +yes) enable_static=yes ;; +no) enable_static=no ;; +*) + enable_static=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_static=AC_ENABLE_STATIC_DEFAULT)dnl +]) + +# AC_DISABLE_STATIC - set the default static flag to --disable-static +AC_DEFUN(AC_DISABLE_STATIC, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no)]) + + +# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag +# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN(AC_ENABLE_FAST_INSTALL, [dnl +define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(fast-install, +changequote(<<, >>)dnl +<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case "$enableval" in +yes) enable_fast_install=yes ;; +no) enable_fast_install=no ;; +*) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl +]) + +# AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install +AC_DEFUN(AC_DISABLE_FAST_INSTALL, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no)]) + +# AC_PROG_LD - find the path to the GNU or non-GNU linker +AC_DEFUN(AC_PROG_LD, +[AC_ARG_WITH(gnu-ld, +[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], +test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$ac_cv_prog_gcc" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. +changequote(,)dnl + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' +changequote([,])dnl + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(ac_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + ac_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + ac_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$ac_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_PROG_LD_GNU +]) + +AC_DEFUN(AC_PROG_LD_GNU, +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + ac_cv_prog_gnu_ld=yes +else + ac_cv_prog_gnu_ld=no +fi]) +]) + +# AC_PROG_NM - find the path to a BSD-compatible name lister +AC_DEFUN(AC_PROG_NM, +[AC_MSG_CHECKING([for BSD-compatible nm]) +AC_CACHE_VAL(ac_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + ac_cv_path_NM="$NM" +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -p" + break + else + ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm +fi]) +NM="$ac_cv_path_NM" +AC_MSG_RESULT([$NM]) +]) + +# AC_CHECK_LIBM - check for math library +AC_DEFUN(AC_CHECK_LIBM, +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case "$lt_target" in +*-*-beos* | *-*-cygwin*) + # These system don't have libm + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, main, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, main, LIBM="-lm") + ;; +esac +]) + +# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl convenience library and INCLTDL to the include flags for +# the libltdl header and adds --enable-ltdl-convenience to the +# configure arguments. Note that LIBLTDL and INCLTDL are not +# AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If DIR is not +# provided, it is assumed to be `libltdl'. LIBLTDL will be prefixed +# with '${top_builddir}/' and INCLTDL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case "$enable_ltdl_convenience" in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) +]) + +# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl installable library and INCLTDL to the include flags for +# the libltdl header and adds --enable-ltdl-install to the configure +# arguments. Note that LIBLTDL and INCLTDL are not AC_SUBSTed, nor is +# AC_CONFIG_SUBDIRS called. If DIR is not provided and an installed +# libltdl is not found, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and INCLTDL will be prefixed +# with '${top_srcdir}/' (note the single quotes!). If your package is +# not flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, main, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + INCLTDL= + fi +]) + +dnl old names +AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl +AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl +AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl +AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl +AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl +AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl +AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl + +dnl This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL])dnl + +# Add --enable-maintainer-mode option to configure. +# From Jim Meyering + +# serial 1 + +AC_DEFUN(AM_MAINTAINER_MODE, +[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode is disabled by default + AC_ARG_ENABLE(maintainer-mode, +[ --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer], + USE_MAINTAINER_MODE=$enableval, + USE_MAINTAINER_MODE=no) + AC_MSG_RESULT($USE_MAINTAINER_MODE) + AM_CONDITIONAL(MAINTAINER_MODE, test $USE_MAINTAINER_MODE = yes) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST(MAINT)dnl +] +) + +# Define a conditional. + +AC_DEFUN(AM_CONDITIONAL, +[AC_SUBST($1_TRUE) +AC_SUBST($1_FALSE) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi]) + +# Like AC_CONFIG_HEADER, but automatically create stamp file. + +AC_DEFUN(AM_CONFIG_HEADER, +[AC_PREREQ([2.12]) +AC_CONFIG_HEADER([$1]) +dnl When config.status generates a header, we must update the stamp-h file. +dnl This file resides in the same directory as the config header +dnl that is generated. We must strip everything past the first ":", +dnl and everything past the last "/". +AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl +ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, +<>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, +<>; do + case " <<$>>CONFIG_HEADERS " in + *" <<$>>am_file "*<<)>> + echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx + ;; + esac + am_indx=`expr "<<$>>am_indx" + 1` +done<<>>dnl>>) +changequote([,]))]) + diff --git a/config.guess b/config.guess new file mode 100755 index 00000000..0ce538bb --- /dev/null +++ b/config.guess @@ -0,0 +1,1183 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 +# Free Software Foundation, Inc. +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Written by Per Bothner . +# Please send patches to . +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit system type (host/target name). +# +# Only a few systems have been added to this list; please add others +# (but try to keep the structure clean). +# + +# Use $HOST_CC if defined. $CC may point to a cross-compiler +if test x"$CC_FOR_BUILD" = x; then + if test x"$HOST_CC" != x; then + CC_FOR_BUILD="$HOST_CC" + else + if test x"$CC" != x; then + CC_FOR_BUILD="$CC" + else + CC_FOR_BUILD=cc + fi + fi +fi + + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 8/24/94.) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +dummy=dummy-$$ +trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15 + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # Netbsd (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # Determine the machine/vendor (is the vendor relevant). + case "${UNAME_MACHINE}" in + amiga) machine=m68k-cbm ;; + arm32) machine=arm-unknown ;; + atari*) machine=m68k-atari ;; + sun3*) machine=m68k-sun ;; + mac68k) machine=m68k-apple ;; + macppc) machine=powerpc-apple ;; + hp3[0-9][05]) machine=m68k-hp ;; + ibmrt|romp-ibm) machine=romp-ibm ;; + *) machine=${UNAME_MACHINE}-unknown ;; + esac + # The Operating System including object format. + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + # The OS release + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + cat <$dummy.s + .data +\$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + + .text + .globl main + .align 4 + .ent main +main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main +EOF + $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null + if test "$?" = 0 ; then + case `./$dummy` in + 0-0) + UNAME_MACHINE="alpha" + ;; + 1-0) + UNAME_MACHINE="alphaev5" + ;; + 1-1) + UNAME_MACHINE="alphaev56" + ;; + 1-101) + UNAME_MACHINE="alphapca56" + ;; + 2-303) + UNAME_MACHINE="alphaev6" + ;; + 2-307) + UNAME_MACHINE="alphaev67" + ;; + esac + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-cbm-sysv4 + exit 0;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + arc64:OpenBSD:*:*) + echo mips64el-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hkmips:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + atari*:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + sun3*:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy \ + && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i?86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:4) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` + if /usr/sbin/lsattr -EHl ${IBM_CPU_ID} | grep POWER >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=4.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` + rm -f $dummy.c $dummy + esac + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i?86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + hppa*:OpenBSD:*:*) + echo hppa-unknown-openbsd + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*X-MP:*:*:*) + echo xmp-cray-unicos + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY-2:*:*:*) + echo cray2-cray-unicos + exit 0 ;; + F300:UNIX_System_V:*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + F301:UNIX_System_V:*:*) + echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'` + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + i?86:BSD/386:*:* | i?86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i386-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + *:Linux:*:*) + + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + ld_help_string=`cd /; ld --help 2>&1` + ld_supported_emulations=`echo $ld_help_string \ + | sed -ne '/supported emulations:/!d + s/[ ][ ]*/ /g + s/.*supported emulations: *// + s/ .*// + p'` + case "$ld_supported_emulations" in + *ia64) + echo "${UNAME_MACHINE}-unknown-linux" + exit 0 + ;; + i?86linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 + ;; + elf_i?86) + echo "${UNAME_MACHINE}-pc-linux" + exit 0 + ;; + i?86coff) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 + ;; + sparclinux) + echo "${UNAME_MACHINE}-unknown-linux-gnuaout" + exit 0 + ;; + armlinux) + echo "${UNAME_MACHINE}-unknown-linux-gnuaout" + exit 0 + ;; + elf32arm*) + echo "${UNAME_MACHINE}-unknown-linux-gnuoldld" + exit 0 + ;; + armelf_linux*) + echo "${UNAME_MACHINE}-unknown-linux-gnu" + exit 0 + ;; + m68klinux) + echo "${UNAME_MACHINE}-unknown-linux-gnuaout" + exit 0 + ;; + elf32ppc | elf32ppclinux) + # Determine Lib Version + cat >$dummy.c < +#if defined(__GLIBC__) +extern char __libc_version[]; +extern char __libc_release[]; +#endif +main(argc, argv) + int argc; + char *argv[]; +{ +#if defined(__GLIBC__) + printf("%s %s\n", __libc_version, __libc_release); +#else + printf("unkown\n"); +#endif + return 0; +} +EOF + LIBC="" + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null + if test "$?" = 0 ; then + ./$dummy | grep 1\.99 > /dev/null + if test "$?" = 0 ; then + LIBC="libc1" + fi + fi + rm -f $dummy.c $dummy + echo powerpc-unknown-linux-gnu${LIBC} + exit 0 + ;; + esac + + if test "${UNAME_MACHINE}" = "alpha" ; then + cat <$dummy.s + .data + \$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + + .text + .globl main + .align 4 + .ent main + main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main +EOF + LIBC="" + $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null + if test "$?" = 0 ; then + case `./$dummy` in + 0-0) + UNAME_MACHINE="alpha" + ;; + 1-0) + UNAME_MACHINE="alphaev5" + ;; + 1-1) + UNAME_MACHINE="alphaev56" + ;; + 1-101) + UNAME_MACHINE="alphapca56" + ;; + 2-303) + UNAME_MACHINE="alphaev6" + ;; + 2-307) + UNAME_MACHINE="alphaev67" + ;; + esac + + objdump --private-headers $dummy | \ + grep ld.so.1 > /dev/null + if test "$?" = 0 ; then + LIBC="libc1" + fi + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0 + elif test "${UNAME_MACHINE}" = "mips" ; then + cat >$dummy.c < /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif +#ifdef __MIPSEB__ + printf ("%s-unknown-linux-gnu\n", argv[1]); +#endif +#ifdef __MIPSEL__ + printf ("%sel-unknown-linux-gnu\n", argv[1]); +#endif + return 0; +} +EOF + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + elif test "${UNAME_MACHINE}" = "s390"; then + echo s390-ibm-linux && exit 0 + else + # Either a pre-BFD a.out linker (linux-gnuoldld) + # or one that does not give us useful --help. + # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout. + # If ld does not provide *any* "supported emulations:" + # that means it is gnuoldld. + echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:" + test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 + + case "${UNAME_MACHINE}" in + i?86) + VENDOR=pc; + ;; + *) + VENDOR=unknown; + ;; + esac + # Determine whether the default compiler is a.out or elf + cat >$dummy.c < +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif +#ifdef __ELF__ +# ifdef __GLIBC__ +# if __GLIBC__ >= 2 + printf ("%s-${VENDOR}-linux-gnu\n", argv[1]); +# else + printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); +# endif +# else + printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); +# endif +#else + printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]); +#endif + return 0; +} +EOF + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + fi ;; +# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions +# are messed up and put the nodename in both sysname and nodename. + i?86:DYNIX/ptx:4*:*) + echo i386-sequent-sysv4 + exit 0 ;; + i?86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i?86:*:5:7*) + # Fixed at (any) Pentium or better + UNAME_MACHINE=i586 + if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then + echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} + fi + exit 0 ;; + i?86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + i?86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:*:6*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + echo `uname -p`-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + if test "${UNAME_MACHINE}" = "x86pc"; then + UNAME_MACHINE=pc + fi + echo `uname -p`-${UNAME_MACHINE}-nto-qnx + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-W:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +#if !defined (ultrix) + printf ("vax-dec-bsd\n"); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0 +rm -f $dummy.c $dummy + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +#echo '(Unable to guess system type)' 1>&2 + +exit 1 diff --git a/config.h.in b/config.h.in new file mode 100644 index 00000000..e1ba8f2a --- /dev/null +++ b/config.h.in @@ -0,0 +1,106 @@ +/* config.h.in. Generated automatically from configure.in by autoheader. */ + +/* Define as the return type of signal handlers (int or void). */ +#undef RETSIGTYPE + +/* Define if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Define if the X Window System is missing or not being used. */ +#undef X_DISPLAY_MISSING + +/* Define if you have the basename function. */ +#undef HAVE_BASENAME + +/* Define if you have the catclose function. */ +#undef HAVE_CATCLOSE + +/* Define if you have the catgets function. */ +#undef HAVE_CATGETS + +/* Define if you have the catopen function. */ +#undef HAVE_CATOPEN + +/* Define if you have the getpid function. */ +#undef HAVE_GETPID + +/* Define if you have the setlocale function. */ +#undef HAVE_SETLOCALE + +/* Define if you have the sigaction function. */ +#undef HAVE_SIGACTION + +/* Define if you have the snprintf function. */ +#undef HAVE_SNPRINTF + +/* Define if you have the strcasestr function. */ +#undef HAVE_STRCASESTR + +/* Define if you have the strftime function. */ +#undef HAVE_STRFTIME + +/* Define if you have the vsnprintf function. */ +#undef HAVE_VSNPRINTF + +/* Define if you have the header file. */ +#undef HAVE_CTYPE_H + +/* Define if you have the header file. */ +#undef HAVE_DIRENT_H + +/* Define if you have the header file. */ +#undef HAVE_ERRNO_H + +/* Define if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define if you have the header file. */ +#undef HAVE_LIBGEN_H + +/* Define if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define if you have the header file. */ +#undef HAVE_NL_TYPES_H + +/* Define if you have the header file. */ +#undef HAVE_PROCESS_H + +/* Define if you have the header file. */ +#undef HAVE_SIGNAL_H + +/* Define if you have the header file. */ +#undef HAVE_STDARG_H + +/* Define if you have the header file. */ +#undef HAVE_STDIO_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_SELECT_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_SIGNAL_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_WAIT_H + +/* Define if you have the header file. */ +#undef HAVE_TIME_H + +/* Define if you have the header file. */ +#undef HAVE_UNISTD_H diff --git a/config.sub b/config.sub new file mode 100755 index 00000000..c8e77851 --- /dev/null +++ b/config.sub @@ -0,0 +1,1268 @@ +#! /bin/sh +# Configuration validation subroutine script, version 1.1. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 +# Free Software Foundation, Inc. +# +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Written by Per Bothner . +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +if [ x$1 = x ] +then + echo Configuration name missing. 1>&2 + echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 + echo "or $0 ALIAS" 1>&2 + echo where ALIAS is a recognized configuration type. 1>&2 + exit 1 +fi + +# First pass through any local machine types. +case $1 in + *local*) + echo $1 + exit 0 + ;; + *) + ;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \ + | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \ + | 580 | i960 | h8300 \ + | x86 | ppcbe | mipsbe | mipsle | shbe | shle | armbe | armle \ + | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ + | hppa64 \ + | alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \ + | alphaev6[78] \ + | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \ + | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \ + | mips64orion | mips64orionel | mipstx39 | mipstx39el \ + | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ + | mips64vr5000 | miprs64vr5000el | mcore \ + | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \ + | thumb | d10v | fr30 | avr) + basic_machine=$basic_machine-unknown + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65 | pj | pjl) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i[34567]86) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + # FIXME: clean up the formatting here. + vax-* | tahoe-* | i[34567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \ + | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \ + | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ + | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \ + | xmp-* | ymp-* \ + | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* | armbe-* | armle-* \ + | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \ + | hppa2.0n-* | hppa64-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \ + | alphaev6[78]-* \ + | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ + | clipper-* | orion-* \ + | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ + | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \ + | mips64el-* | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \ + | mipstx39-* | mipstx39el-* | mcore-* \ + | f301-* | armv*-* | s390-* | sv1-* | t3e-* \ + | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \ + | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* \ + | bs2000-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-cbm + ;; + amigaos | amigados) + basic_machine=m68k-cbm + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-cbm + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | ymp) + basic_machine=ymp-cray + os=-unicos + ;; + cray2) + basic_machine=cray2-cray + os=-unicos + ;; + [ctj]90-cray) + basic_machine=c90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i[34567]86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i[34567]86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i[34567]86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i[34567]86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + i386-go32 | go32) + basic_machine=i386-unknown + os=-go32 + ;; + i386-mingw32 | mingw32) + basic_machine=i386-unknown + os=-mingw32 + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mipsel*-linux*) + basic_machine=mipsel-unknown + os=-linux-gnu + ;; + mips*-linux*) + basic_machine=mips-unknown + os=-linux-gnu + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + msdos) + basic_machine=i386-unknown + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexen) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexen-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=rs6000-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=t3e-cray + os=-unicos + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xmp) + basic_machine=xmp-cray + os=-unicos + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + mips) + if [ x$os = x-linux-gnu ]; then + basic_machine=mips-unknown + else + basic_machine=mips-mips + fi + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sparc | sparcv9) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + c4x*) + basic_machine=c4x-none + os=-coff + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i[34567]86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto*) + os=-nto-qnx + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -*MiNT) + os=-mint + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f301-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -*MiNT) + vendor=atari + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os diff --git a/configure b/configure new file mode 100755 index 00000000..fea43df9 --- /dev/null +++ b/configure @@ -0,0 +1,3967 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.13 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: +ac_help="$ac_help + --enable-shared[=PKGS] build shared libraries [default=yes]" +ac_help="$ac_help + --enable-static[=PKGS] build static libraries [default=yes]" +ac_help="$ac_help + --enable-fast-install[=PKGS] optimize for fast installation [default=yes]" +ac_help="$ac_help + --with-gnu-ld assume the C compiler uses GNU ld [default=no]" +ac_help="$ac_help + --disable-libtool-lock avoid locking (might break parallel builds)" +ac_help="$ac_help + --with-x use the X Window System" +ac_help="$ac_help + --enable-shape enable support of the XShape extension [default=yes]" +ac_help="$ac_help + --enable-slit include code for the Slit [default=yes]" +ac_help="$ac_help + --enable-newspec include code for the new WM Spec (DOES NOTHING) + [default=no]" +ac_help="$ac_help + --enable-interlace include code for image interlacing [default=yes]" +ac_help="$ac_help + --enable-ordered-pseudo include code for ordered pseudocolor (8bpp) + dithering [default=no]" +ac_help="$ac_help + --enable-debug include verbose debugging code [default=no]" +ac_help="$ac_help + --enable-nls include natural language support [default=yes]" +ac_help="$ac_help + --enable-timed-cache use new timed pixmap cache [default=yes]" +ac_help="$ac_help + --enable-kde KDE slit support [default=no]" +ac_help="$ac_help + --enable-gnome GNOME support [default=no] (DEVELOPMENT)" +ac_help="$ac_help + --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer" + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.13" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=src/main.cc + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +ac_exeext= +ac_objext=o +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } +fi +ac_config_guess=$ac_aux_dir/config.guess +ac_config_sub=$ac_aux_dir/config.sub +ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +echo "configure:593: checking for a BSD compatible install" >&5 +if test -z "$INSTALL"; then +if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" + for ac_dir in $PATH; do + # Account for people who put trailing slashes in PATH elements. + case "$ac_dir/" in + /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if test -f $ac_dir/$ac_prog; then + if test $ac_prog = install && + grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + IFS="$ac_save_IFS" + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL="$ac_cv_path_install" + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL="$ac_install_sh" + fi +fi +echo "$ac_t""$INSTALL" 1>&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 +echo "configure:646: checking whether build environment is sane" >&5 +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "$*" != "X $srcdir/configure conftestfile" \ + && test "$*" != "X conftestfile $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { echo "configure: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" 1>&2; exit 1; } + fi + + test "$2" = conftestfile + ) +then + # Ok. + : +else + { echo "configure: error: newly created file is older than distributed files! +Check your system clock" 1>&2; exit 1; } +fi +rm -f conftest* +echo "$ac_t""yes" 1>&6 +if test "$program_transform_name" = s,x,x,; then + program_transform_name= +else + # Double any \ or $. echo might interpret backslashes. + cat <<\EOF_SED > conftestsed +s,\\,\\\\,g; s,\$,$$,g +EOF_SED + program_transform_name="`echo $program_transform_name|sed -f conftestsed`" + rm -f conftestsed +fi +test "$program_prefix" != NONE && + program_transform_name="s,^,${program_prefix},; $program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" + +# sed with no file args requires a program. +test "$program_transform_name" = "" && program_transform_name="s,x,x," + +echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 +echo "configure:703: checking whether ${MAKE-make} sets \${MAKE}" >&5 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftestmake <<\EOF +all: + @echo 'ac_maketemp="${MAKE}"' +EOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftestmake +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$ac_t""yes" 1>&6 + SET_MAKE= +else + echo "$ac_t""no" 1>&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + + +PACKAGE=fluxbox + +VERSION=0.1.5 + +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } +fi + + + +missing_dir=`cd $ac_aux_dir && pwd` +echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 +echo "configure:742: checking for working aclocal" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (aclocal --version) < /dev/null > /dev/null 2>&1; then + ACLOCAL=aclocal + echo "$ac_t""found" 1>&6 +else + ACLOCAL="$missing_dir/missing aclocal" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 +echo "configure:755: checking for working autoconf" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoconf --version) < /dev/null > /dev/null 2>&1; then + AUTOCONF=autoconf + echo "$ac_t""found" 1>&6 +else + AUTOCONF="$missing_dir/missing autoconf" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working automake""... $ac_c" 1>&6 +echo "configure:768: checking for working automake" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (automake --version) < /dev/null > /dev/null 2>&1; then + AUTOMAKE=automake + echo "$ac_t""found" 1>&6 +else + AUTOMAKE="$missing_dir/missing automake" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 +echo "configure:781: checking for working autoheader" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoheader --version) < /dev/null > /dev/null 2>&1; then + AUTOHEADER=autoheader + echo "$ac_t""found" 1>&6 +else + AUTOHEADER="$missing_dir/missing autoheader" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 +echo "configure:794: checking for working makeinfo" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (makeinfo --version) < /dev/null > /dev/null 2>&1; then + MAKEINFO=makeinfo + echo "$ac_t""found" 1>&6 +else + MAKEINFO="$missing_dir/missing makeinfo" + echo "$ac_t""missing" 1>&6 +fi + + + +test x$prefix = "xNONE" && prefix="$ac_default_prefix" + + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:814: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:844: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test -z "$CC"; then + case "`uname -s`" in + *win32* | *WIN32*) + # Extract the first word of "cl", so it can be a program name with args. +set dummy cl; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:895: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="cl" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + ;; + esac + fi + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:927: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext << EOF + +#line 938 "configure" +#include "confdefs.h" + +main(){return(0);} +EOF +if { (eval echo configure:943: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:969: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:974: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +else + GCC= +fi + +ac_test_CFLAGS="${CFLAGS+set}" +ac_save_CFLAGS="$CFLAGS" +CFLAGS= +echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:1002: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi + +for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl +do +# Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1038: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CXX="$ac_prog" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CXX="$ac_cv_prog_CXX" +if test -n "$CXX"; then + echo "$ac_t""$CXX" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +test -n "$CXX" && break +done +test -n "$CXX" || CXX="gcc" + + +echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:1070: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 + +ac_ext=C +# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cxx_cross + +cat > conftest.$ac_ext << EOF + +#line 1081 "configure" +#include "confdefs.h" + +int main(){return(0);} +EOF +if { (eval echo configure:1086: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cxx_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cxx_cross=no + else + ac_cv_prog_cxx_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cxx_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6 +if test $ac_cv_prog_cxx_works = no; then + { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:1112: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 +cross_compiling=$ac_cv_prog_cxx_cross + +echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 +echo "configure:1117: checking whether we are using GNU C++" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.C <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gxx=yes +else + ac_cv_prog_gxx=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gxx" 1>&6 + +if test $ac_cv_prog_gxx = yes; then + GXX=yes +else + GXX= +fi + +ac_test_CXXFLAGS="${CXXFLAGS+set}" +ac_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS= +echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 +echo "configure:1145: checking whether ${CXX-g++} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.cc +if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then + ac_cv_prog_cxx_g=yes +else + ac_cv_prog_cxx_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6 +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS="$ac_save_CXXFLAGS" +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +echo "configure:1188: checking for a BSD compatible install" >&5 +if test -z "$INSTALL"; then +if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" + for ac_dir in $PATH; do + # Account for people who put trailing slashes in PATH elements. + case "$ac_dir/" in + /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if test -f $ac_dir/$ac_prog; then + if test $ac_prog = install && + grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + IFS="$ac_save_IFS" + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL="$ac_cv_path_install" + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL="$ac_install_sh" + fi +fi +echo "$ac_t""$INSTALL" 1>&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +# Check whether --enable-shared or --disable-shared was given. +if test "${enable_shared+set}" = set; then + enableval="$enable_shared" + p=${PACKAGE-default} +case "$enableval" in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_shared=yes +fi + +# Check whether --enable-static or --disable-static was given. +if test "${enable_static+set}" = set; then + enableval="$enable_static" + p=${PACKAGE-default} +case "$enableval" in +yes) enable_static=yes ;; +no) enable_static=no ;; +*) + enable_static=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_static=yes +fi + +# Check whether --enable-fast-install or --disable-fast-install was given. +if test "${enable_fast_install+set}" = set; then + enableval="$enable_fast_install" + p=${PACKAGE-default} +case "$enableval" in +yes) enable_fast_install=yes ;; +no) enable_fast_install=no ;; +*) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_fast_install=yes +fi + + +# Make sure we can run config.sub. +if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : +else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } +fi + +echo $ac_n "checking host system type""... $ac_c" 1>&6 +echo "configure:1316: checking host system type" >&5 + +host_alias=$host +case "$host_alias" in +NONE) + case $nonopt in + NONE) + if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : + else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } + fi ;; + *) host_alias=$nonopt ;; + esac ;; +esac + +host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` +host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$host" 1>&6 + +echo $ac_n "checking build system type""... $ac_c" 1>&6 +echo "configure:1337: checking build system type" >&5 + +build_alias=$build +case "$build_alias" in +NONE) + case $nonopt in + NONE) build_alias=$host_alias ;; + *) build_alias=$nonopt ;; + esac ;; +esac + +build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias` +build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$build" 1>&6 + +# Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1357: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_RANLIB="ranlib" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" +fi +fi +RANLIB="$ac_cv_prog_RANLIB" +if test -n "$RANLIB"; then + echo "$ac_t""$RANLIB" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +# Check whether --with-gnu-ld or --without-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval="$with_gnu_ld" + test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$ac_cv_prog_gcc" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6 +echo "configure:1396: checking for ld used by GCC" >&5 + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + echo $ac_n "checking for GNU ld""... $ac_c" 1>&6 +echo "configure:1420: checking for GNU ld" >&5 +else + echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 +echo "configure:1423: checking for non-GNU ld" >&5 +fi +if eval "test \"`echo '$''{'ac_cv_path_LD'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + ac_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + ac_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$ac_cv_path_LD" +if test -n "$LD"; then + echo "$ac_t""$LD" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi +test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; } +echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6 +echo "configure:1458: checking if the linker ($LD) is GNU ld" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gnu_ld'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + ac_cv_prog_gnu_ld=yes +else + ac_cv_prog_gnu_ld=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gnu_ld" 1>&6 + + +echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6 +echo "configure:1474: checking for BSD-compatible nm" >&5 +if eval "test \"`echo '$''{'ac_cv_path_NM'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$NM"; then + # Let the user override the test. + ac_cv_path_NM="$NM" +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -p" + break + else + ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm +fi +fi + +NM="$ac_cv_path_NM" +echo "$ac_t""$NM" 1>&6 + +echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 +echo "configure:1510: checking whether ln -s works" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + rm -f conftestdata +if ln -s X conftestdata 2>/dev/null +then + rm -f conftestdata + ac_cv_prog_LN_S="ln -s" +else + ac_cv_prog_LN_S=ln +fi +fi +LN_S="$ac_cv_prog_LN_S" +if test "$ac_cv_prog_LN_S" = "ln -s"; then + echo "$ac_t""yes" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + +case "$target" in +NONE) lt_target="$host" ;; +*) lt_target="$target" ;; +esac + +# Check for any special flags to pass to ltconfig. +libtool_flags="--cache-file=$cache_file" +test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" +test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" +test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" +test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" +test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" + + +# Check whether --enable-libtool-lock or --disable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval="$enable_libtool_lock" + : +fi + +test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock" +test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case "$lt_target" in +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 1559 "configure"' > conftest.$ac_ext + if { (eval echo configure:1560: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 +echo "configure:1581: checking whether the C compiler needs -belf" >&5 +if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + lt_cv_cc_needs_belf=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + lt_cv_cc_needs_belf=no +fi +rm -f conftest* +fi + +echo "$ac_t""$lt_cv_cc_needs_belf" 1>&6 + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + + +esac + + +# Save cache, so that ltconfig can load it +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + + +# Actually configure libtool. ac_aux_dir is where install-sh is found. +CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ +LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ +LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \ +DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \ +${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ +$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \ +|| { echo "configure: error: libtool configure failed" 1>&2; exit 1; } + +# Reload cache, that may have been modified by ltconfig +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + +# Redirect the config.log output again, so that the ltconfig log is not +# clobbered by the next message. +exec 5>>./config.log + + +for ac_prog in sed +do +# Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1700: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_regex_cmd'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$regex_cmd"; then + ac_cv_prog_regex_cmd="$regex_cmd" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_regex_cmd="$ac_prog" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +regex_cmd="$ac_cv_prog_regex_cmd" +if test -n "$regex_cmd"; then + echo "$ac_t""$regex_cmd" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +test -n "$regex_cmd" && break +done + +if test x$regex_cmd = "x"; then + { echo "configure: error: error. sed is required to build the data files." 1>&2; exit 1; } +fi + +echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:1734: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1755: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1772: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -nologo -E" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1789: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + +echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 +echo "configure:1814: checking for ANSI C header files" >&5 +if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +#include +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1827: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + ac_cv_header_stdc=yes +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "memchr" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "free" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +if test "$cross_compiling" = yes; then + : +else + cat > conftest.$ac_ext < +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int main () { int i; for (i = 0; i < 256; i++) +if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); +exit (0); } + +EOF +if { (eval echo configure:1894: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_header_stdc=no +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_header_stdc" 1>&6 +if test $ac_cv_header_stdc = yes; then + cat >> confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + +for ac_hdr in errno.h ctype.h dirent.h fcntl.h libgen.h locale.h nl_types.h process.h signal.h stdarg.h stdio.h time.h unistd.h sys/param.h sys/select.h sys/signal.h sys/stat.h sys/time.h sys/types.h sys/wait.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:1921: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1931: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + +echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 +echo "configure:1958: checking whether time.h and sys/time.h may both be included" >&5 +if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +int main() { +struct tm *tp; +; return 0; } +EOF +if { (eval echo configure:1972: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_header_time=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_time=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_header_time" 1>&6 +if test $ac_cv_header_time = yes; then + cat >> confdefs.h <<\EOF +#define TIME_WITH_SYS_TIME 1 +EOF + +fi + + +for ac_func in basename +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:1996: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2024: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +echo $ac_n "checking for basename in -lgen""... $ac_c" 1>&6 +echo "configure:2046: checking for basename in -lgen" >&5 +ac_lib_var=`echo gen'_'basename | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lgen $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -lgen" +else + echo "$ac_t""no" 1>&6 +fi + +fi +done + +for ac_func in getpid setlocale sigaction strftime strcasestr snprintf vsnprintf catopen catgets catclose +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2091: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2119: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + +echo $ac_n "checking for t_open in -lnsl""... $ac_c" 1>&6 +echo "configure:2144: checking for t_open in -lnsl" >&5 +ac_lib_var=`echo nsl'_'t_open | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lnsl $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -lnsl" +else + echo "$ac_t""no" 1>&6 +fi + +echo $ac_n "checking for socket in -lsocket""... $ac_c" 1>&6 +echo "configure:2184: checking for socket in -lsocket" >&5 +ac_lib_var=`echo socket'_'socket | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lsocket $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -lsocket" +else + echo "$ac_t""no" 1>&6 +fi + + +# If we find X, set shell vars x_includes and x_libraries to the +# paths, otherwise set no_x=yes. +# Uses ac_ vars as temps to allow command line to override cache and checks. +# --without-x overrides everything else, but does not touch the cache. +echo $ac_n "checking for X""... $ac_c" 1>&6 +echo "configure:2229: checking for X" >&5 + +# Check whether --with-x or --without-x was given. +if test "${with_x+set}" = set; then + withval="$with_x" + : +fi + +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then + # Both variables are already set. + have_x=yes + else +if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=NO ac_x_libraries=NO +rm -fr conftestdir +if mkdir conftestdir; then + cd conftestdir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat > Imakefile <<'EOF' +acfindx: + @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' +EOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl; do + if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && + test -f $ac_im_libdir/libX11.$ac_extension; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case "$ac_im_incroot" in + /usr/include) ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;; + esac + case "$ac_im_usrlibdir" in + /usr/lib | /lib) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;; + esac + fi + cd .. + rm -fr conftestdir +fi + +if test "$ac_x_includes" = NO; then + # Guess where to find include files, by looking for this one X11 .h file. + test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h + + # First, try using that file with no special directory specified. +cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:2296: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + # We can compile using X headers with no special include directory. +ac_x_includes= +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + # Look for the header file in a standard set of common directories. +# Check X11 before X11Rn because it is often a symlink to the current release. + for ac_dir in \ + /usr/X11/include \ + /usr/X11R6/include \ + /usr/X11R5/include \ + /usr/X11R4/include \ + \ + /usr/include/X11 \ + /usr/include/X11R6 \ + /usr/include/X11R5 \ + /usr/include/X11R4 \ + \ + /usr/local/X11/include \ + /usr/local/X11R6/include \ + /usr/local/X11R5/include \ + /usr/local/X11R4/include \ + \ + /usr/local/include/X11 \ + /usr/local/include/X11R6 \ + /usr/local/include/X11R5 \ + /usr/local/include/X11R4 \ + \ + /usr/X386/include \ + /usr/x386/include \ + /usr/XFree86/include/X11 \ + \ + /usr/include \ + /usr/local/include \ + /usr/unsupported/include \ + /usr/athena/include \ + /usr/local/x11r5/include \ + /usr/lpp/Xamples/include \ + \ + /usr/openwin/include \ + /usr/openwin/share/include \ + ; \ + do + if test -r "$ac_dir/$x_direct_test_include"; then + ac_x_includes=$ac_dir + break + fi + done +fi +rm -f conftest* +fi # $ac_x_includes = NO + +if test "$ac_x_libraries" = NO; then + # Check for the libraries. + + test -z "$x_direct_test_library" && x_direct_test_library=Xt + test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc + + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS="$LIBS" + LIBS="-l$x_direct_test_library $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + LIBS="$ac_save_LIBS" +# We can link X programs with no special library path. +ac_x_libraries= +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + LIBS="$ac_save_LIBS" +# First see if replacing the include by lib works. +# Check X11 before X11Rn because it is often a symlink to the current release. +for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \ + /usr/X11/lib \ + /usr/X11R6/lib \ + /usr/X11R5/lib \ + /usr/X11R4/lib \ + \ + /usr/lib/X11 \ + /usr/lib/X11R6 \ + /usr/lib/X11R5 \ + /usr/lib/X11R4 \ + \ + /usr/local/X11/lib \ + /usr/local/X11R6/lib \ + /usr/local/X11R5/lib \ + /usr/local/X11R4/lib \ + \ + /usr/local/lib/X11 \ + /usr/local/lib/X11R6 \ + /usr/local/lib/X11R5 \ + /usr/local/lib/X11R4 \ + \ + /usr/X386/lib \ + /usr/x386/lib \ + /usr/XFree86/lib/X11 \ + \ + /usr/lib \ + /usr/local/lib \ + /usr/unsupported/lib \ + /usr/athena/lib \ + /usr/local/x11r5/lib \ + /usr/lpp/Xamples/lib \ + /lib/usr/lib/X11 \ + \ + /usr/openwin/lib \ + /usr/openwin/share/lib \ + ; \ +do + for ac_extension in a so sl; do + if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f conftest* +fi # $ac_x_libraries = NO + +if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then + # Didn't find X anywhere. Cache the known absence of X. + ac_cv_have_x="have_x=no" +else + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" +fi +fi + fi + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + echo "$ac_t""$have_x" 1>&6 + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$x_includes ac_x_libraries=$x_libraries" + echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6 +fi + +if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + cat >> confdefs.h <<\EOF +#define X_DISPLAY_MISSING 1 +EOF + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + case "`(uname -sr) 2>/dev/null`" in + "SunOS 5"*) + echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6 +echo "configure:2478: checking whether -R must be followed by a space" >&5 + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries" + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + ac_R_nospace=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_R_nospace=no +fi +rm -f conftest* + if test $ac_R_nospace = yes; then + echo "$ac_t""no" 1>&6 + X_LIBS="$X_LIBS -R$x_libraries" + else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + ac_R_space=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_R_space=no +fi +rm -f conftest* + if test $ac_R_space = yes; then + echo "$ac_t""yes" 1>&6 + X_LIBS="$X_LIBS -R $x_libraries" + else + echo "$ac_t""neither works" 1>&6 + fi + fi + LIBS="$ac_xsave_LIBS" + esac + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn.Johnson@cl.cam.ac.uk says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And karl@cs.umb.edu says + # the Alpha needs dnet_stub (dnet does not exist). + echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6 +echo "configure:2543: checking for dnet_ntoa in -ldnet" >&5 +ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldnet $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +else + echo "$ac_t""no" 1>&6 +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6 +echo "configure:2584: checking for dnet_ntoa in -ldnet_stub" >&5 +ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldnet_stub $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +else + echo "$ac_t""no" 1>&6 +fi + + fi + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # chad@anasazi.com says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to dickey@clark.net. + echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6 +echo "configure:2632: checking for gethostbyname" >&5 +if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname) +choke me +#else +gethostbyname(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2660: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_gethostbyname=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_gethostbyname=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +fi + + if test $ac_cv_func_gethostbyname = no; then + echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 +echo "configure:2681: checking for gethostbyname in -lnsl" >&5 +ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lnsl $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +else + echo "$ac_t""no" 1>&6 +fi + + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says simon@lia.di.epfl.ch: it contains + # gethostby* variants that don't use the nameserver (or something). + # -lsocket must be given before -lnsl if both are needed. + # We assume that if connect needs -lnsl, so does gethostbyname. + echo $ac_n "checking for connect""... $ac_c" 1>&6 +echo "configure:2730: checking for connect" >&5 +if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_connect) || defined (__stub___connect) +choke me +#else +connect(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2758: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_connect=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_connect=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'connect`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +fi + + if test $ac_cv_func_connect = no; then + echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6 +echo "configure:2779: checking for connect in -lsocket" >&5 +ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +else + echo "$ac_t""no" 1>&6 +fi + + fi + + # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX. + echo $ac_n "checking for remove""... $ac_c" 1>&6 +echo "configure:2822: checking for remove" >&5 +if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_remove) || defined (__stub___remove) +choke me +#else +remove(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2850: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_remove=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_remove=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'remove`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +fi + + if test $ac_cv_func_remove = no; then + echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6 +echo "configure:2871: checking for remove in -lposix" >&5 +ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lposix $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +else + echo "$ac_t""no" 1>&6 +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + echo $ac_n "checking for shmat""... $ac_c" 1>&6 +echo "configure:2914: checking for shmat" >&5 +if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shmat) || defined (__stub___shmat) +choke me +#else +shmat(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2942: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_shmat=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_shmat=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'shmat`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +fi + + if test $ac_cv_func_shmat = no; then + echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6 +echo "configure:2963: checking for shmat in -lipc" >&5 +ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lipc $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +else + echo "$ac_t""no" 1>&6 +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS="$LDFLAGS" + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # --interran@uluru.Stanford.EDU, kb@cs.umb.edu. + echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6 +echo "configure:3015: checking for IceConnectionNumber in -lICE" >&5 +ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +else + echo "$ac_t""no" 1>&6 +fi + + LDFLAGS="$ac_save_LDFLAGS" + +fi + + +test x$no_x = "xyes" && { echo "configure: error: Fluxbox requires the X Window System libraries and headers." 1>&2; exit 1; } + +test x$x_includes = "x" && x_includes="/usr/include" +test x$x_libraries = "x" && x_libraries="/usr/lib" + +CFLAGS="$CFLAGS $X_CFLAGS" +CXXFLAGS="$CXXFLAGS $X_CFLAGS" +LIBS="$LIBS $X_LIBS" +LDFLAGS="$LDFLAGS $LIBS $X_PRE_LIBS" + +echo $ac_n "checking for XOpenDisplay in -lX11""... $ac_c" 1>&6 +echo "configure:3070: checking for XOpenDisplay in -lX11" >&5 +ac_lib_var=`echo X11'_'XOpenDisplay | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lX11 $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -lX11" +else + echo "$ac_t""no" 1>&6 +{ echo "configure: error: Could not find XOpenDisplay in -lX11." 1>&2; exit 1; } + +fi + + +LIBS="$LIBS $X_EXTRA_LIBS" + +Xext_lib="" + +SHAPE="" +echo $ac_n "checking whether to build support for the XShape extension""... $ac_c" 1>&6 +echo "configure:3118: checking whether to build support for the XShape extension" >&5 +# Check whether --enable-shape or --disable-shape was given. +if test "${enable_shape+set}" = set; then + enableval="$enable_shape" + : +fi + + +: ${enableval="yes"} +if test x$enableval = "xyes"; then + echo "$ac_t""yes" 1>&6 + echo $ac_n "checking for XShapeCombineShape in -lXext""... $ac_c" 1>&6 +echo "configure:3130: checking for XShapeCombineShape in -lXext" >&5 +ac_lib_var=`echo Xext'_'XShapeCombineShape | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lXext $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + echo $ac_n "checking for X11/extensions/shape.h""... $ac_c" 1>&6 +echo "configure:3165: checking for X11/extensions/shape.h" >&5 + cat > conftest.$ac_ext < +#include +#include + +int main() { +long foo = ShapeSet +; return 0; } +EOF +if { (eval echo configure:3177: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + echo "$ac_t""yes" 1>&6 + SHAPE="-DSHAPE"; Xext_lib="-lXext" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + echo "$ac_t""no" 1>&6 + +fi +rm -f conftest* + +else + echo "$ac_t""no" 1>&6 +fi + +else + echo "$ac_t""no" 1>&6 +fi + + +LIBS="$LIBS $Xext_lib" + +SLIT="" +echo $ac_n "checking whether to include the Slit""... $ac_c" 1>&6 +echo "configure:3203: checking whether to include the Slit" >&5 +# Check whether --enable-slit or --disable-slit was given. +if test "${enable_slit+set}" = set; then + enableval="$enable_slit" + if test x$enableval = "xyes"; then + echo "$ac_t""yes" 1>&6 + SLIT="-DSLIT" + else + echo "$ac_t""no" 1>&6 + fi +else + echo "$ac_t""yes" 1>&6 + SLIT="-DSLIT" + +fi + + + +NEWWMSPEC="" +echo $ac_n "checking whether to include the new WM Spec (DOES NOTHING)""... $ac_c" 1>&6 +echo "configure:3223: checking whether to include the new WM Spec (DOES NOTHING)" >&5 +# Check whether --enable-newspec or --disable-newspec was given. +if test "${enable_newspec+set}" = set; then + enableval="$enable_newspec" + if test x$enableval = "xyes"; then + echo "$ac_t""yes" 1>&6 + NEWWMSPEC="-DNEWWMSPEC" + else + echo "$ac_t""no" 1>&6 + fi +else + echo "$ac_t""no" 1>&6 + +fi + + + + +INTERLACE="" +echo $ac_n "checking whether to include interlacing image code""... $ac_c" 1>&6 +echo "configure:3243: checking whether to include interlacing image code" >&5 +# Check whether --enable-interlace or --disable-interlace was given. +if test "${enable_interlace+set}" = set; then + enableval="$enable_interlace" + if test x$enableval = "xyes"; then + echo "$ac_t""yes" 1>&6 + INTERLACE="-DINTERLACE" + else + echo "$ac_t""no" 1>&6 + fi +else + echo "$ac_t""yes" 1>&6 + INTERLACE="-DINTERLACE" + +fi + + + +ORDEREDPSEUDO="" +echo $ac_n "checking whether to include Pseudocolor ordered dithering code""... $ac_c" 1>&6 +echo "configure:3263: checking whether to include Pseudocolor ordered dithering code" >&5 +# Check whether --enable-ordered-pseudo or --disable-ordered-pseudo was given. +if test "${enable_ordered_pseudo+set}" = set; then + enableval="$enable_ordered_pseudo" + if test x$enableval = "xyes"; then + echo "$ac_t""yes" 1>&6 + ORDEREDPSEUDO="-DORDEREDPSEUDO" + else + echo "$ac_t""no" 1>&6 + fi +else + echo "$ac_t""no" 1>&6 + +fi + + + +DEBUG="" +echo $ac_n "checking whether to include verbose debugging code""... $ac_c" 1>&6 +echo "configure:3282: checking whether to include verbose debugging code" >&5 +# Check whether --enable-debug or --disable-debug was given. +if test "${enable_debug+set}" = set; then + enableval="$enable_debug" + if test x$enableval = "xyes"; then + echo "$ac_t""yes" 1>&6 + DEBUG="-DDEBUG" + else + echo "$ac_t""no" 1>&6 + fi +else + echo "$ac_t""no" 1>&6 + +fi + + + +NLS="" +echo $ac_n "checking whether to include NLS support""... $ac_c" 1>&6 +echo "configure:3301: checking whether to include NLS support" >&5 +# Check whether --enable-nls or --disable-nls was given. +if test "${enable_nls+set}" = set; then + enableval="$enable_nls" + if test x$enableval = "xyes"; then + echo "$ac_t""yes" 1>&6 + NLS="-DNLS" + else + echo "$ac_t""no" 1>&6 + fi +else + echo "$ac_t""yes" 1>&6 + NLS="-DNLS" + +fi + + + +echo $ac_n "checking for setlocale in -lxpg4""... $ac_c" 1>&6 +echo "configure:3320: checking for setlocale in -lxpg4" >&5 +ac_lib_var=`echo xpg4'_'setlocale | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lxpg4 $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -lxpg4" +else + echo "$ac_t""no" 1>&6 +fi + + +for ac_prog in gencat +do +# Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3365: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gencat_cmd'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$gencat_cmd"; then + ac_cv_prog_gencat_cmd="$gencat_cmd" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_gencat_cmd="$ac_prog" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +gencat_cmd="$ac_cv_prog_gencat_cmd" +if test -n "$gencat_cmd"; then + echo "$ac_t""$gencat_cmd" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +test -n "$gencat_cmd" && break +done + +if test x$gencat_cmd = "x"; then + NLS="" +fi + + +TIMEDCACHE="" +echo $ac_n "checking whether to use the new timed pixmap cache""... $ac_c" 1>&6 +echo "configure:3401: checking whether to use the new timed pixmap cache" >&5 +# Check whether --enable-timed-cache or --disable-timed-cache was given. +if test "${enable_timed_cache+set}" = set; then + enableval="$enable_timed_cache" + if test x$enableval = "xyes"; then + echo "$ac_t""yes" 1>&6 + TIMEDCACHE="-DTIMEDCACHE" + else + echo "$ac_t""no" 1>&6 + fi +else + echo "$ac_t""yes" 1>&6 + TIMEDCACHE="-DTIMEDCACHE" + +fi + + + +KDE="" +echo $ac_n "checking whether to have KDE slit support""... $ac_c" 1>&6 +echo "configure:3421: checking whether to have KDE slit support" >&5 +# Check whether --enable-kde or --disable-kde was given. +if test "${enable_kde+set}" = set; then + enableval="$enable_kde" + if test x$enableval = "xyes"; then + echo "$ac_t""yes" 1>&6 + KDE="-DKDE" + else + echo "$ac_t""no" 1>&6 + fi +else + echo "$ac_t""no" 1>&6 + +fi + + + +GNOME="" +echo $ac_n "checking whether to have GNOME support""... $ac_c" 1>&6 +echo "configure:3440: checking whether to have GNOME support" >&5 +# Check whether --enable-gnome or --disable-gnome was given. +if test "${enable_gnome+set}" = set; then + enableval="$enable_gnome" + if test x$enableval = "xyes"; then + echo "$ac_t""yes" 1>&6 + GNOME="-DGNOME" + else + echo "$ac_t""no" 1>&6 + fi +else + echo "$ac_t""no" 1>&6 + +fi + + + +echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 +echo "configure:3458: checking return type of signal handlers" >&5 +if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#ifdef signal +#undef signal +#endif +#ifdef __cplusplus +extern "C" void (*signal (int, void (*)(int)))(int); +#else +void (*signal ()) (); +#endif + +int main() { +int i; +; return 0; } +EOF +if { (eval echo configure:3480: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_type_signal=void +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_type_signal=int +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_type_signal" 1>&6 +cat >> confdefs.h <&6 +echo "configure:3500: checking whether to enable maintainer-specific portions of Makefiles" >&5 + # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then + enableval="$enable_maintainer_mode" + USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi + + echo "$ac_t""$USE_MAINTAINER_MODE" 1>&6 + + +if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + MAINT=$MAINTAINER_MODE_TRUE + + + +echo "$ac_t""" 1>&6 +echo "$ac_t"" $PACKAGE version $VERSION configured successfully." 1>&6 +echo "$ac_t""" 1>&6 +echo "$ac_t""Using '$prefix' for installation." 1>&6 +echo "$ac_t""Using '$CXX' for C++ compiler." 1>&6 +echo "$ac_t""Building with '$CXXFLAGS' for C++ compiler flags." 1>&6 +echo "$ac_t""Building with '$LIBS' for linker flags." 1>&6 +echo "$ac_t""" 1>&6 + + + + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +DEFS=-DHAVE_CONFIG_H + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir +ac_given_INSTALL="$INSTALL" + +trap 'rm -fr `echo "Makefile +src/Makefile +util/Makefile +data/Makefile +data/styles/Makefile +doc/Makefile +nls/Makefile +nls/C/Makefile +nls/da_DK/Makefile +nls/es_ES/Makefile +nls/et_EE/Makefile +nls/fr_FR/Makefile +nls/pt_BR/Makefile +nls/ru_RU/Makefile +nls/sv_SE/Makefile +nls/tr_TR/Makefile +nls/it_IT/Makefile +version.h config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@FFLAGS@%$FFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g +s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g +s%@INSTALL_DATA@%$INSTALL_DATA%g +s%@PACKAGE@%$PACKAGE%g +s%@VERSION@%$VERSION%g +s%@ACLOCAL@%$ACLOCAL%g +s%@AUTOCONF@%$AUTOCONF%g +s%@AUTOMAKE@%$AUTOMAKE%g +s%@AUTOHEADER@%$AUTOHEADER%g +s%@MAKEINFO@%$MAKEINFO%g +s%@SET_MAKE@%$SET_MAKE%g +s%@CC@%$CC%g +s%@CXX@%$CXX%g +s%@host@%$host%g +s%@host_alias@%$host_alias%g +s%@host_cpu@%$host_cpu%g +s%@host_vendor@%$host_vendor%g +s%@host_os@%$host_os%g +s%@build@%$build%g +s%@build_alias@%$build_alias%g +s%@build_cpu@%$build_cpu%g +s%@build_vendor@%$build_vendor%g +s%@build_os@%$build_os%g +s%@RANLIB@%$RANLIB%g +s%@LN_S@%$LN_S%g +s%@LIBTOOL@%$LIBTOOL%g +s%@regex_cmd@%$regex_cmd%g +s%@CPP@%$CPP%g +s%@X_CFLAGS@%$X_CFLAGS%g +s%@X_PRE_LIBS@%$X_PRE_LIBS%g +s%@X_LIBS@%$X_LIBS%g +s%@X_EXTRA_LIBS@%$X_EXTRA_LIBS%g +s%@SHAPE@%$SHAPE%g +s%@SLIT@%$SLIT%g +s%@NEWWMSPEC@%$NEWWMSPEC%g +s%@INTERLACE@%$INTERLACE%g +s%@ORDEREDPSEUDO@%$ORDEREDPSEUDO%g +s%@DEBUG@%$DEBUG%g +s%@NLS@%$NLS%g +s%@gencat_cmd@%$gencat_cmd%g +s%@TIMEDCACHE@%$TIMEDCACHE%g +s%@KDE@%$KDE%g +s%@GNOME@%$GNOME%g +s%@MAINTAINER_MODE_TRUE@%$MAINTAINER_MODE_TRUE%g +s%@MAINTAINER_MODE_FALSE@%$MAINTAINER_MODE_FALSE%g +s%@MAINT@%$MAINT%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + case "$ac_given_INSTALL" in + [/$]*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +s%@INSTALL@%$INSTALL%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in + +EOF + +# Transform confdefs.h into a sed script conftest.vals that substitutes +# the proper values into config.h.in to produce config.h. And first: +# Protect against being on the right side of a sed subst in config.status. +# Protect against being in an unquoted here document in config.status. +rm -f conftest.vals +cat > conftest.hdr <<\EOF +s/[\\&%]/\\&/g +s%[\\$`]%\\&%g +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%ac_d%ac_u%gp +s%ac_u%ac_e%gp +EOF +sed -n -f conftest.hdr confdefs.h > conftest.vals +rm -f conftest.hdr + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >> conftest.vals <<\EOF +s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% +EOF + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +while : +do + ac_lines=`grep -c . conftest.vals` + # grep -c gives empty output for an empty file on some AIX systems. + if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi + # Write a limited-size here document to conftest.frag. + echo ' cat > conftest.frag <> $CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS + echo 'CEOF + sed -f conftest.frag conftest.in > conftest.out + rm -f conftest.in + mv conftest.out conftest.in +' >> $CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +cat >> $CONFIG_STATUS <<\EOF + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + diff --git a/configure.in b/configure.in new file mode 100644 index 00000000..7b58aa06 --- /dev/null +++ b/configure.in @@ -0,0 +1,279 @@ +dnl configure.in for Fluxbox - created from configure.in Blackbox 0.61.1 +dnl Initialize autoconf and automake +AC_INIT(src/main.cc) +AM_INIT_AUTOMAKE(fluxbox,0.1.5,no-define) + +dnl Determine default prefix +test x$prefix = "xNONE" && prefix="$ac_default_prefix" + +dnl Check for various flavors of UNIX(r) +dnl AC_AIX +dnl AC_ISC_POSIX + +dnl TODO: do this +dnl AC_LANG_CPLUSPLUS + +dnl Locate required external software +AC_PROG_CC +AC_PROG_CXX +AC_PROG_INSTALL +AM_PROG_LIBTOOL + +AC_CHECK_PROGS(regex_cmd, sed) +if test x$regex_cmd = "x"; then + AC_MSG_ERROR([error. sed is required to build the data files.]) +fi + +dnl Check for system header files +AC_HEADER_STDC +AC_CHECK_HEADERS(errno.h ctype.h dirent.h fcntl.h libgen.h locale.h nl_types.h process.h signal.h stdarg.h stdio.h time.h unistd.h sys/param.h sys/select.h sys/signal.h sys/stat.h sys/time.h sys/types.h sys/wait.h) +AC_HEADER_TIME + +dnl Check for existance of basename(), setlocale() and strftime() +AC_CHECK_FUNCS(basename, , AC_CHECK_LIB(gen, basename, LIBS="$LIBS -lgen")) +AC_CHECK_FUNCS(getpid setlocale sigaction strftime strcasestr snprintf vsnprintf catopen catgets catclose) +AC_CHECK_LIB(nsl, t_open, LIBS="$LIBS -lnsl") +AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket") + +dnl Check for X headers and libraries +AC_PATH_X +AC_PATH_XTRA + +test x$no_x = "xyes" && AC_MSG_ERROR([Fluxbox requires the X Window System libraries and headers.]) + +test x$x_includes = "x" && x_includes="/usr/include" +test x$x_libraries = "x" && x_libraries="/usr/lib" + +CFLAGS="$CFLAGS $X_CFLAGS" +CXXFLAGS="$CXXFLAGS $X_CFLAGS" +LIBS="$LIBS $X_LIBS" +LDFLAGS="$LDFLAGS $LIBS $X_PRE_LIBS" + +dnl Check for required functions in -lX11 +AC_CHECK_LIB(X11, XOpenDisplay, + LIBS="$LIBS -lX11", + AC_MSG_ERROR([Could not find XOpenDisplay in -lX11.]) +) + +LIBS="$LIBS $X_EXTRA_LIBS" + +Xext_lib="" + +dnl Check for XShape extension support and proper library files. +SHAPE="" +AC_MSG_CHECKING([whether to build support for the XShape extension]) +AC_ARG_ENABLE( + shape, [ --enable-shape enable support of the XShape extension [default=yes]]) + +: ${enableval="yes"} +if test x$enableval = "xyes"; then + AC_MSG_RESULT([yes]) + AC_CHECK_LIB(Xext, XShapeCombineShape, + AC_MSG_CHECKING([for X11/extensions/shape.h]) + AC_TRY_LINK( +#include +#include +#include +, long foo = ShapeSet, + AC_MSG_RESULT([yes]) + SHAPE="-DSHAPE"; Xext_lib="-lXext", + AC_MSG_RESULT([no]) + ) + ) +else + AC_MSG_RESULT([no]) +fi +AC_SUBST(SHAPE) + +LIBS="$LIBS $Xext_lib" + +dnl Check for the Slit +SLIT="" +AC_MSG_CHECKING([whether to include the Slit]) +AC_ARG_ENABLE( + slit, [ --enable-slit include code for the Slit [default=yes]], + if test x$enableval = "xyes"; then + AC_MSG_RESULT([yes]) + SLIT="-DSLIT" + else + AC_MSG_RESULT([no]) + fi, + AC_MSG_RESULT([yes]) + SLIT="-DSLIT" +) +AC_SUBST(SLIT) + +dnl Check for the new WM Spec +NEWWMSPEC="" +AC_MSG_CHECKING([whether to include the new WM Spec (DOES NOTHING)]) +AC_ARG_ENABLE( + newspec, +[ --enable-newspec include code for the new WM Spec (DOES NOTHING) + [default=no]], + if test x$enableval = "xyes"; then + AC_MSG_RESULT([yes]) + NEWWMSPEC="-DNEWWMSPEC" + else + AC_MSG_RESULT([no]) + fi, + AC_MSG_RESULT([no]) +) +AC_SUBST(NEWWMSPEC) + + +dnl Check for Interlacing +INTERLACE="" +AC_MSG_CHECKING([whether to include interlacing image code]) +AC_ARG_ENABLE( + interlace, [ --enable-interlace include code for image interlacing [default=yes]], + if test x$enableval = "xyes"; then + AC_MSG_RESULT([yes]) + INTERLACE="-DINTERLACE" + else + AC_MSG_RESULT([no]) + fi, + AC_MSG_RESULT([yes]) + INTERLACE="-DINTERLACE" +) +AC_SUBST(INTERLACE) + +dnl Check for ordered 8bpp dithering +ORDEREDPSEUDO="" +AC_MSG_CHECKING([whether to include Pseudocolor ordered dithering code]) +AC_ARG_ENABLE(ordered-pseudo, +[ --enable-ordered-pseudo include code for ordered pseudocolor (8bpp) + dithering [default=no]], + if test x$enableval = "xyes"; then + AC_MSG_RESULT([yes]) + ORDEREDPSEUDO="-DORDEREDPSEUDO" + else + AC_MSG_RESULT([no]) + fi, + AC_MSG_RESULT([no]) +) +AC_SUBST(ORDEREDPSEUDO) + +dnl Check whether to include debugging code +DEBUG="" +AC_MSG_CHECKING([whether to include verbose debugging code]) +AC_ARG_ENABLE(debug, + [ --enable-debug include verbose debugging code [default=no]], + if test x$enableval = "xyes"; then + AC_MSG_RESULT([yes]) + DEBUG="-DDEBUG" + else + AC_MSG_RESULT([no]) + fi, + AC_MSG_RESULT([no]) +) +AC_SUBST(DEBUG) + +dnl Check whether to include natural language support (i18n) +NLS="" +AC_MSG_CHECKING([whether to include NLS support]) +AC_ARG_ENABLE(nls, + [ --enable-nls include natural language support [default=yes]], + if test x$enableval = "xyes"; then + AC_MSG_RESULT([yes]) + NLS="-DNLS" + else + AC_MSG_RESULT([no]) + fi, + AC_MSG_RESULT([yes]) + NLS="-DNLS" +) +AC_SUBST(NLS) + +AC_CHECK_LIB(xpg4, setlocale, LIBS="$LIBS -lxpg4") + +AC_CHECK_PROGS(gencat_cmd, gencat) +if test x$gencat_cmd = "x"; then + NLS="" +fi + + +dnl Check for new timed pixmap cache +TIMEDCACHE="" +AC_MSG_CHECKING([whether to use the new timed pixmap cache]) +AC_ARG_ENABLE( + timed-cache, +[ --enable-timed-cache use new timed pixmap cache [default=yes]], + if test x$enableval = "xyes"; then + AC_MSG_RESULT([yes]) + TIMEDCACHE="-DTIMEDCACHE" + else + AC_MSG_RESULT([no]) + fi, + AC_MSG_RESULT([yes]) + TIMEDCACHE="-DTIMEDCACHE" +) +AC_SUBST(TIMEDCACHE) + +dnl Check KDE +KDE="" +AC_MSG_CHECKING([whether to have KDE slit support]) +AC_ARG_ENABLE( + kde, +[ --enable-kde KDE slit support [default=no]], + if test x$enableval = "xyes"; then + AC_MSG_RESULT([yes]) + KDE="-DKDE" + else + AC_MSG_RESULT([no]) + fi, + AC_MSG_RESULT([no]) +) +AC_SUBST(KDE) + +dnl Check GNOME +GNOME="" +AC_MSG_CHECKING([whether to have GNOME support]) +AC_ARG_ENABLE( + gnome, +[ --enable-gnome GNOME support [default=no] (DEVELOPMENT)], + if test x$enableval = "xyes"; then + AC_MSG_RESULT([yes]) + GNOME="-DGNOME" + else + AC_MSG_RESULT([no]) + fi, + AC_MSG_RESULT([no]) +) +AC_SUBST(GNOME) + +dnl Determine the return type of signal handlers +AC_TYPE_SIGNAL + +dnl Determine if maintainer portions of the Makefiles should be included. +AM_MAINTAINER_MODE + +dnl Print results +AC_MSG_RESULT([]) +AC_MSG_RESULT([ $PACKAGE version $VERSION configured successfully.]) +AC_MSG_RESULT([]) +AC_MSG_RESULT([Using '$prefix' for installation.]) +AC_MSG_RESULT([Using '$CXX' for C++ compiler.]) +AC_MSG_RESULT([Building with '$CXXFLAGS' for C++ compiler flags.]) +AC_MSG_RESULT([Building with '$LIBS' for linker flags.]) +AC_MSG_RESULT([]) + +dnl Output files +AM_CONFIG_HEADER(config.h) +AC_OUTPUT(Makefile +src/Makefile +util/Makefile +data/Makefile +data/styles/Makefile +doc/Makefile +nls/Makefile +nls/C/Makefile +nls/da_DK/Makefile +nls/es_ES/Makefile +nls/et_EE/Makefile +nls/fr_FR/Makefile +nls/pt_BR/Makefile +nls/ru_RU/Makefile +nls/sv_SE/Makefile +nls/tr_TR/Makefile +nls/it_IT/Makefile +version.h) diff --git a/data/Makefile.am b/data/Makefile.am new file mode 100644 index 00000000..c586c77b --- /dev/null +++ b/data/Makefile.am @@ -0,0 +1,16 @@ +# data/Makefile.am for Fluxbox - an X11 Window manager + +SUBDIRS = styles +CLEANFILES = menu menu.in menu.pre init +MAINTAINERCLEANFILES = Makefile.in +pkgdata_DATA = titlebar keys menu init +EXTRA_DIST= titlebar keys init.in generate_menu README.style README.menu README +all-local: menu init +distclean-local: + rm -f *\~ +init: init.in + @regex_cmd@ -e "s,@pkgdatadir@,$(pkgdatadir)," init.in > init +menu: generate_menu + ./generate_menu + @regex_cmd@ -e "s,\@VERSION\@,$(VERSION)," menu.in > menu.pre + @regex_cmd@ -e "s,@pkgdatadir@,$(pkgdatadir)," menu.pre > menu diff --git a/data/Makefile.in b/data/Makefile.in new file mode 100644 index 00000000..c1c77251 --- /dev/null +++ b/data/Makefile.in @@ -0,0 +1,333 @@ +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# data/Makefile.am for Fluxbox - an X11 Window manager + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +AS = @AS@ +CC = @CC@ +CXX = @CXX@ +DEBUG = @DEBUG@ +DLLTOOL = @DLLTOOL@ +GNOME = @GNOME@ +INTERLACE = @INTERLACE@ +KDE = @KDE@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +NEWWMSPEC = @NEWWMSPEC@ +NLS = @NLS@ +OBJDUMP = @OBJDUMP@ +ORDEREDPSEUDO = @ORDEREDPSEUDO@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +SHAPE = @SHAPE@ +SLIT = @SLIT@ +TIMEDCACHE = @TIMEDCACHE@ +VERSION = @VERSION@ +gencat_cmd = @gencat_cmd@ +regex_cmd = @regex_cmd@ + +SUBDIRS = styles +CLEANFILES = menu menu.in menu.pre init +MAINTAINERCLEANFILES = Makefile.in +pkgdata_DATA = titlebar keys menu init +EXTRA_DIST = titlebar keys init.in generate_menu README.style README.menu README +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = +DATA = $(pkgdata_DATA) + +DIST_COMMON = README Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps data/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +install-pkgdataDATA: $(pkgdata_DATA) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) + @list='$(pkgdata_DATA)'; for p in $$list; do \ + if test -f $(srcdir)/$$p; then \ + echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkgdatadir)/$$p"; \ + $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkgdatadir)/$$p; \ + else if test -f $$p; then \ + echo " $(INSTALL_DATA) $$p $(DESTDIR)$(pkgdatadir)/$$p"; \ + $(INSTALL_DATA) $$p $(DESTDIR)$(pkgdatadir)/$$p; \ + fi; fi; \ + done + +uninstall-pkgdataDATA: + @$(NORMAL_UNINSTALL) + list='$(pkgdata_DATA)'; for p in $$list; do \ + rm -f $(DESTDIR)$(pkgdatadir)/$$p; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. + +@SET_MAKE@ + +all-recursive install-data-recursive install-exec-recursive \ +installdirs-recursive install-recursive uninstall-recursive \ +check-recursive installcheck-recursive info-recursive dvi-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ + rev="$$subdir $$rev"; \ + test "$$subdir" = "." && dot_seen=yes; \ + done; \ + test "$$dot_seen" = "no" && rev=". $$rev"; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = data + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + for subdir in $(SUBDIRS); do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + chmod 777 $(distdir)/$$subdir; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \ + || exit 1; \ + fi; \ + done +info-am: +info: info-recursive +dvi-am: +dvi: dvi-recursive +check-am: all-am +check: check-recursive +installcheck-am: +installcheck: installcheck-recursive +install-exec-am: +install-exec: install-exec-recursive + +install-data-am: install-pkgdataDATA +install-data: install-data-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-recursive +uninstall-am: uninstall-pkgdataDATA +uninstall: uninstall-recursive +all-am: Makefile $(DATA) all-local +all-redirect: all-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: installdirs-recursive +installdirs-am: + $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) + + +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +mostlyclean-am: mostlyclean-tags mostlyclean-generic + +mostlyclean: mostlyclean-recursive + +clean-am: clean-tags clean-generic mostlyclean-am + +clean: clean-recursive + +distclean-am: distclean-tags distclean-generic clean-am distclean-local + -rm -f libtool + +distclean: distclean-recursive + +maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \ + distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-recursive + +.PHONY: uninstall-pkgdataDATA install-pkgdataDATA install-data-recursive \ +uninstall-data-recursive install-exec-recursive \ +uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \ +all-recursive check-recursive installcheck-recursive info-recursive \ +dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \ +maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ +distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ +dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ +install-exec install-data-am install-data install-am install \ +uninstall-am uninstall all-local all-redirect all-am all installdirs-am \ +installdirs mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + +all-local: menu init +distclean-local: + rm -f *\~ +init: init.in + @regex_cmd@ -e "s,@pkgdatadir@,$(pkgdatadir)," init.in > init +menu: generate_menu + ./generate_menu + @regex_cmd@ -e "s,\@VERSION\@,$(VERSION)," menu.in > menu.pre + @regex_cmd@ -e "s,@pkgdatadir@,$(pkgdatadir)," menu.pre > menu + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/data/README b/data/README new file mode 100644 index 00000000..63844b4c --- /dev/null +++ b/data/README @@ -0,0 +1,17 @@ +-- data/README for Blackbox 0.61.x - an X11 Window manager + +The data/ directory holds some menu and style (or theme) examples for Blackbox. +These are installed as system defaults, and are ALWAYS overwritten when +upgrading or otherwise re-installing Blackbox. Changes to them are +discouraged, because of this reason. + +In the data/ directory, you will find a file named `menu' and a directory +named `styles.' These are the system defaults that are installed when +Blackbox is built, and they are intended as examples on how to customize and +control the appearance of Blackbox. In the event that a user does not have +a defined menu and/or style, Blackbox falls back on the example menu and/or +styles included here. + +For information on creating/editing a menu, see the file README.menu. + +For information on creating/editing a style, see the file README.style. diff --git a/data/README.menu b/data/README.menu new file mode 100644 index 00000000..ecee95f6 --- /dev/null +++ b/data/README.menu @@ -0,0 +1,372 @@ +-- data/README.menu for Blackbox 0.61.x - an X11 Window manager + +Creating a user defined menu: +----------------------------- +Creating a menu for Blackbox requires a text editor of some sort. Familiarity +with your choice of text editor is assumed, since editor preference differs +as much (if not more than) window manager preference. + +First, we need to decide on a location for our custom menu. Your home +directory is the most logical solution, since you will most likely not have +write access anywhere else. You place the menu file in any directory, and +give it any name you choose, as we will later tell Blackbox the path or +location for this file. + +As an example, let's assume that my home directory is `/home/bhughes' (which it +is). I've decided to keep all my Blackbox related files in a directory named +`blackbox.' After creating the directory, I now have two options for creating +my new menu. I can either copy the system default (usually in +`/usr/local/share/Blackbox/menu') to this directory, or I can create a new +one from scratch. Let's do the latter, for the sake of completeness. + +I've decided to name the file `rootmenu.' I fire up my favorite text editor +and now have a clean file. So let's begin. + + +Menu syntax: +------------ +The menu syntax is very simple and very effective. There are upto three +fields in a menu line. They are of the form: + + [tag] (label or filename) {command or filename} + +The supported tags are as follows: + +[begin] (label for root menu) + + This tells Blackbox to start parsing the menu file. This tag is + required for Blackbox to parse your menu file. If it cannot find it, + the system default menu is used instead. + +[end] + + This tells Blackbox that it is at the end of a menu. This can either + be a submenu or the main root menu. There must be at least one + of these tags in your menu to correspond to the required [begin] tag. + +[exec] (label for command) {shell command} + + This tells Blackbox to insert a command item into the menu. When you + select the menu item from the menu, Blackbox runs `shell command.' + +[exit] (label for exit) + + This tells Blackbox to insert an item that shuts down and exits + Blackbox. Any open windows are reparented to the root window before + Blackbox exits. + +[include] (filename) + + This tells Blackbox to parse the file specified by `filename' inline + with the current menu. `filename' can be the full path to a file + (such as /usr/local/share/Blackbox/brueghel/stylesmenu) or it can + begin with `~/', which will be expanded into your home directory + (e.g. [include] (~/blackbox/stylesmenu) will include + /home/bhughes/blackbox/stylesmenu in my menu) + +[nop] (label - optional) + + This tells Blackbox to insert a non-operational item into the current + menu. This can be used to help format the menu into blocks or sections + if so desired (e.g. you could put all your ssh accounts together, add + a [nop] and then add all your telnet accounts together). [nop] does + accept a label, but it is not required, and a blank item will be used + if none is supplied. + +[style] (label) {filename} + + This tells Blackbox to read `filename' and apply the new textures, + colors and fonts to the current running session. The filename is + just like the [include] tag, it can be the full path to the file, + or it can be of the form `~/path/from/home/dir.' Blackbox also + re-reads the entire menu structure from disk, incase the menu has + changed. + +[submenu] (label) {title for menu - optional} + + This tells Blackbox to create and parse a new menu. This menu is + inserted as a submenu into the parent menu. These menus are parsed + recursively, so there is no limit to the number of levels or nested + submenus you can have. The title for the new menu is optional, if + none is supplied, the new menu's title is the same as the item label. + +[reconfig] (label) + + This tells Blackbox to reread the current style and menu files and + apply any changes. This is useful for creating a new style or theme, + as you don't have to constantly restart Blackbox every time you save + your style. + +[restart] (label) {shell command - optional} + + This tells Blackbox to restart. If `shell command' is supplied, it + shuts down and runs the command (which is commonly the name of another + window manager). If the command is omitted, Blackbox restarts itself. + +[workspaces] (label) + + This tells Blackbox to insert a "link" to the workspaces menu directly + into your menu. This is handy for those users who can't access the + workspace menu directly (e.g. if you don't have a 3 button mouse, it's + rather hard to middle click to show the workspace menu). This is a + "link" to the systems workspace menu, so multiple [workspaces] tags + will display the same workspace menu, so expect it to move around if + you do so. ;) + +[config] (label) + + This tells Blackbox to insert the ConfigMenu into your menu. From + this menu you can configure several options stored in your + ~/.blackboxrc, and the changes take effect immediately. + +Comments may be inserted on any line of the file, as long as the first +character on the line is a `#.' + +Also, in the labels/commands/filenames fields, you can escape any character +like so: + + [exec] (\(my cool\) \{XTERM\}) {\(xterm -T \\\"cool XTERM\\\"\)} + +Using `\\' inserts a literal back-slash into the label/command/filename field. + + +Putting it all together: +------------------------ +Alrighty, so let's see if we can understand the arcane incantation above. It +says we have to have a [begin] and an [end] tag, which create our menu and +give it a title. Let's do that first: + + + [begin] (Example \[Menu\]) + + [end] + +Simple enough. Now let's add some items to the list. We always want to have +access to a terminal emulator, be it a regular xterm or something else. +So we add the item to our menu, and it now looks like this: + +... +[begin] (Example \[Menu\]) +[exec] (xterm) {xterm -ls} +[end] +... + +Great! Now let's add us some items to run an irc client, netscape, xv and +some other common programs. This gives up this: + +... +[begin] (Example \[Menu\]) +[exec] (xterm) {xterm -ls} +[exec] (efnet irc) {xterm -e irc fnord irc.efnet.net} +[exec] (Netscape Navigator) {netscape} +[exec] (xv 3.10a) {xv} +[exec] (XEmacs) {xemacs} +[exec] (The GIMP) {gimp} +[exec] (Video Tune) {xvidtune} +[end] +... + +Whoa, wait a second. This menu file is beginning to look a little cluttered. +Not a problem, just like programmers indent and space their code, we can +do this with our menu file, so let's clean it up a bit: + +... +[begin] (Example \[Menu\]) + [exec] (xterm) {xterm -ls} + [exec] (efnet irc) {xterm -e irc fnord irc.efnet.net} + + [exec] (Netscape Navigator) {netscape} + [exec] (XEmacs) {xemacs} + + [exec] (xv 3.10a) {xv} + [exec] (The GIMP) {gimp} + + [exec] (Video Tune) {xvidtune} +[end] +... + +Ahh... now that looks a little better. Now we decide that we kind of like the +spacing in the file, and decide we want to apply it to the menu itself. Now +we take advantage of the [nop] tag: + +... +[begin] (Example \[Menu\]) + [exec] (xterm) {xterm -ls} + [exec] (efnet irc) {xterm -e irc fnord irc.efnet.net} + + [nop] + + [exec] (Netscape Navigator) {netscape} + [exec] (XEmacs) {xemacs} + + [nop] + + [exec] (xv 3.10a) {xv} + [exec] (The GIMP) {gimp} + + [nop] + + [exec] (Video Tune) {xvidtune} +[end] +... + +Now, let's create a submenu to put some items to change between all these +themes we downloaded from http://blackbox.themes.org/. Let's assume we +untarred the themes into the ~/.blackbox directory like the documentation on +the themes.org site recommends. + +... +[begin] (Example \[Menu\]) + [exec] (xterm) {xterm -ls} + [exec] (efnet irc) {xterm -e irc fnord irc.efnet.net} + + [nop] + + [exec] (Netscape Navigator) {netscape} + [exec] (XEmacs) {xemacs} + + [nop] + + [exec] (xv 3.10a) {xv} + [exec] (The GIMP) {gimp} + + [nop] + + [exec] (Video Tune) {xvidtune} + + [submenu] (Themes) {Themes from blackbox.themes.org} + [style] (Blackbox) {~/.blackbox/Styles/blackbox} + [style] (Blackbox II) {~/.blackbox/Styles/blackbox2} + [style] (Hardware) {~/.blackbox/Styles/hardware} + [style] (Nova) {~/.blackbox/Styles/nova} + [style] (Orbital) {~/.blackbox/Styles/orbital} + [style] (Orbital II) {~/.blackbox/Styles/orbital2} + [style] (Seething) {~/.blackbox/Styles/seething} + [style] (Zero) {~/.blackbox/Styles/zero} + [style] (Cold Fusion) {~/.blackbox/Styles/coldfusion} + [end] +[end] +... + +Even better. Now hold on a second, if we have our themes and styles in +~/.blackbox why do we have to have our menu in ~/blackbox? Answer: WE DON'T! +This is where the choice comes. Do we keep our stuff in two separate +directories? Do we put it all in one directory? That is up to you to decide. +I personally prefer to keep everything in one directory (but, I use ~/blackbox +and have been for a long, long time; long before blackbox.themes.org was +even thought of... and again that is *personal* preference, not a hard-fast +rule). + +Now that we've gotten a feel for the menu syntax, we decide to finish off our +menu. In addition to the styles we downloaded, we decide we also want to +keep a submenu for the default styles that came with Blackbox. All we need +to do is [include] the styles file from the share directory for Blackbox. +After putting everything together, we have: + + +... +# custom menu file for Blackbox + +[begin] (Example \[Menu\]) + [exec] (xterm) {xterm -ls} + [exec] (efnet irc) {xterm -e irc fnord irc.efnet.net} + + [nop] + + [exec] (Netscape Navigator) {netscape} + [exec] (XEmacs) {xemacs} + + [nop] + + [exec] (xv 3.10a) {xv} + [exec] (The GIMP) {gimp} + + [nop] + + [exec] (Video Tune) {xvidtune} + + [nop] (...) + + [submenu] (Themes) {Themes from blackbox.themes.org} + [style] (Blackbox) {~/.blackbox/Styles/blackbox} + [style] (Blackbox II) {~/.blackbox/Styles/blackbox2} + [style] (Hardware) {~/.blackbox/Styles/hardware} + [style] (Nova) {~/.blackbox/Styles/nova} + [style] (Orbital) {~/.blackbox/Styles/orbital} + [style] (Orbital II) {~/.blackbox/Styles/orbital2} + [style] (Seething) {~/.blackbox/Styles/seething} + [style] (Zero) {~/.blackbox/Styles/zero} + [style] (Cold Fusion) {~/.blackbox/Styles/coldfusion} + +# include the default style menu... this is assuming Blackbox was installed +# into /usr/local + + [nop] + + [include] (/usr/local/share/Blackbox/styles/stylesmenu) + [end] + + [workspaces] (Workspace list) + + [submenu] (Restart) {Restart which?} + [restart] (Blackbox) + +# let's also give us access to some other window managers + + [restart] (Window Maker) {wmaker} + [restart] (Enlightenment) {enlightenment} + [restart] (KWM) {kwm} + [restart] (TWM) {twm} + [end] + + [nop] (...) + + [reconfig] (Reconfigure) + [exit] (Quit!) +[end] +... + +And voila! our menu file is finished. Now we need to tell Blackbox to read +this menu file. We do this by editing the file ~/.blackboxrc. + +NOTE: your ~/.blackboxrc is auotmatically updated every time Blackbox restarts, +reconfigures, changes styles or exits. Changes to dynamic data like workspace +count, names, etc. is lost. About the only thing you can change and have it +preserved is the menu filename, which is what we are about to change. + +The format of ~/.blackboxrc is in the X resource database format (just like +~/.Xdefaults). Since the file is updated automatically, it may be full of +stuff or it may not even exist (especially if this is the first time we've +ran Blackbox). Don't worry if you have to create ~/.blackboxrc, Blackbox will +see the file the next time it starts. + +What we need to do is change the resource for the menu's filename. This is +done by changing (or adding) the line that looks like so: + +... +session.menuFile: /path/to/some/file +... + +If this resource exists, we change it. If it does not, we add it. Depending +on where we put the menu file, our new resource could look like this: + +... +session.menuFile: /home/bhughes/blackbox/rootmenu +... + +We save ~/.blackboxrc and then restart Blackbox (reconfiguring doesn't work, +we need Blackbox to completely shutdown and reread ALL of it's configuration +files, not just the ones that control colors/fonts/etc.) + +If we've done everything correctly, Blackbox restarts itself and our new menu +is now ready for use. If something doesn't work, read over the above example +again to make sure you didn't forget a step or leave out the necessary tags. + +Now that Blackbox has been told where to find it's menu, it does a little more. +Blackbox 0.51.x introduces automagic menu updates. As long as you never +change session.menuFile, you will never have to restart or reconfigure Blackbox +whenever you change your menu. Blackbox watches the timestamps on all the +files it reads to build your menu. If any of them change, they are reread and +your menu updated. This check is done everytime you open the root menu. Like +I said... it is a check, it doesn't reread the menu everytime, it just looks +at the modification time and rereads when it changes. diff --git a/data/README.style b/data/README.style new file mode 100644 index 00000000..90678068 --- /dev/null +++ b/data/README.style @@ -0,0 +1,330 @@ +-- data/README.style for Blackbox 0.61.x - an X11 Window manager + +Creating a new style (aka "theme"): +----------------------------------- +After getting Blackbox up and running, the next thing you want to do is change +the colors/fonts/etc. on the screen. Blackbox uses a "style" to read its +configuration information. A style in Blackbox consists of X resources placed +in a file. Just like the menu file (see README.menu), the style file can be +put anywhere on the filesystem; as long as you have read access to the file, +Blackbox can use it. + +First, we need to decide where to put our style file, and what to name it. +I recommend using the naming scheme described on http://blackbox.themes.org/ +when creating styles. + +Let's get started. Let's put our new style into a file named `results.' +Following the themes.org naming scheme, this file will go into +.blackbox/Styles. Same as with the menu file, we use our favorite text editor +to create the new style. + +X resources consist of a key and a value. The key is constructed of several +smaller keys, delimited by a period (`.'). Keys may also contain a star (`*') +to serve as a wildcard, which means that one line of typed text will match +several keys. This is useful for styles that are based on one or two colors. + +Blackbox allows you to configure it's three main components: the toolbar, the +menus and the window decorations. Lets begin by creating a style for our +toolbar. + +First we need to define a "texture" for the toolbar and it's components. +Textures tell Blackbox how to mold or shape the colors we supply. + +A texture is comprised of the following elements: + + Raised / Sunken / Flat give the component a raised, sunken + or flat appearance (respectively) + + Solid / Gradient tell Blackbox whether to draw a solid + or gradiented texture + + Interlaced tells Blackbox to interlace a + gradient (and gradient ONLY) texture + + Bevel1 / Bevel2 tells Blackbox which type of bevel + to use. + +NOTE on Bevel1 / Bevel2: + +Bevel1 is the default bevel. The shading is placed on the edge of the image. +Bevel2 is an alternative. The shading is placed one pixel in from the edge +of the image. + +Now that we understand that, let's define the textures for the toolbar. The +toolbar has a main frame, buttons, two labels and a clock label. The buttons +have 2 states, so we provide textures for both the normal and the pressed +state. + +... +toolbar: Raised Diagonal Gradient Bevel1 +toolbar.button: Raised Diagonal Gradient Bevel1 +toolbar.button.pressed: Sunken Diagonal Interlaced Gradient Bevel1 +toolbar.clock: Flat Interlaced Gradient +toolbar.label: Flat Interlaced Gradient +... + +NOTE: the texture strings don't have to be capitalized like they did in +previous versions. They are still placed in capitals here, because things like +the bbtools still use the old method. + +Next we define colors for the textures. Colors can be any valid X colorname +(from the RGB database) or it can be a color specifier, as described by +'man 1 X.' + +Let's see how our file looks after adding colors: + +... +toolbar: Raised Diagonal Gradient Bevel1 +toolbar.button: Raised Diagonal Gradient Bevel1 +toolbar.button.pressed: Sunken Diagonal Interlaced Gradient Bevel1 +toolbar.clock: Flat Interlaced Gradient +toolbar.label: Flat Interlaced Gradient + +toolbar.color: rgb:8/8/7 +toolbar.colorTo: grey20 +toolbar.button.color: grey +toolbar.button.colorTo: grey20 +toolbar.button.pressed.color: rgb:4/4/38 +toolbar.button.pressed.colorTo: rgb:f/f/d +toolbar.clock.color: grey20 +toolbar.clock.colorTo: rgb:8/8/7 +toolbar.label.color: grey20 +toolbar.label.colorTo: rgb:8/8/7 +toolbar.textColor: grey85 +... + +As you have noticed, all textures have a color and a colorTo key. These keys +are required for gradient images. For solids, only color is needed. You will +also notice that we have supplied the color for the text on the toolbar. Not +all textures have a text color, just certain base textures. + +Next, let's move onto the menus. Since Blackbox was written in C++, all of +the menus used in it are subclasses of one generic base class. Blackbox reads +the style for the configuration for that base class, which applies to all +the menus used in Blackbox. + +The menu has two main parts, the title and the frame. There is nothing +visible under them, so we only configure these two components. The menu frame +and menu title BOTH have a configurable text color, and the menu frame has a +highlight color and the corresponding highlighted text color key. Let's assign +some textures and colors to our menu, and see what our style file looks like +so far: + +... +toolbar: Raised Diagonal Gradient Bevel1 +toolbar.button: Raised Diagonal Gradient Bevel1 +toolbar.button.pressed: Sunken Diagonal Interlaced Gradient Bevel1 +toolbar.clock: Flat Interlaced Gradient +toolbar.label: Flat Interlaced Gradient + +toolbar.color: rgb:8/8/7 +toolbar.colorTo: grey20 +toolbar.button.color: grey +toolbar.button.colorTo: grey20 +toolbar.button.pressed.color: rgb:4/4/38 +toolbar.button.pressed.colorTo: rgb:f/f/d +toolbar.clock.color: grey20 +toolbar.clock.colorTo: rgb:8/8/7 +toolbar.label.color: grey20 +toolbar.label.colorTo: rgb:8/8/7 +toolbar.textColor: grey85 + +menu.title: Raised Diagonal Interlaced Gradient Bevel1 +menu.frame: Raised Diagonal Gradient Bevel1 + +menu.title.color: grey20 +menu.title.colorTo: rgb:8/8/7 +menu.title.textColor: grey85 +menu.frame.color: rgb:8/8/7 +menu.frame.colorTo: grey10 +menu.frame.textColor: white +menu.frame.highlightColor: grey85 +menu.frame.hiTextColor: grey20 +... + +Next, we need to configure our windows. Windows are like buttons, they have +two states, focused and unfocused. There for we define a separate texture +for unfocused windows and focused windows. The buttons on the titlebar +are focus dependant also, so we need to configure them as well. The buttons +only have one "pressed" state, so we only have to define that once, instead of +having a focus.pressed state and an unfocus.pressed state. The window frame +is the thin border around the client window. Let's be sure to catch it as well. + +After adding the window config, our style now looks like this: + +... + +toolbar: Raised Diagonal Gradient Bevel1 +toolbar.button: Raised Diagonal Gradient Bevel1 +toolbar.button.pressed: Sunken Diagonal Interlaced Gradient Bevel1 +toolbar.clock: Flat Interlaced Gradient +toolbar.label: Flat Interlaced Gradient + +toolbar.color: rgb:8/8/7 +toolbar.colorTo: grey20 +toolbar.button.color: grey +toolbar.button.colorTo: grey20 +toolbar.button.pressed.color: rgb:4/4/38 +toolbar.button.pressed.colorTo: rgb:f/f/d +toolbar.clock.color: grey20 +toolbar.clock.colorTo: rgb:8/8/7 +toolbar.label.color: grey20 +toolbar.label.colorTo: rgb:8/8/7 +toolbar.textColor: grey85 + +menu.title: Raised Diagonal Interlaced Gradient Bevel1 +menu.frame: Raised Diagonal Gradient Bevel1 + +menu.title.color: grey20 +menu.title.colorTo: rgb:8/8/7 +menu.title.textColor: grey85 +menu.frame.color: rgb:8/8/7 +menu.frame.colorTo: grey10 +menu.frame.textColor: white +menu.frame.highlightColor: grey85 +menu.frame.hiTextColor: grey20 + +window.focus: Raised Diagonal Interlaced Gradient Bevel1 +window.focus.button: Raised Diagonal Gradient Bevel1 +window.unfocus: Raised Diagonal Gradient Bevel1 +window.unfocus.button: Sunken Diagonal Gradient Bevel1 +window.button.pressed: Flat Diagonal Interlaced Gradient +window.frame: Raised Solid Bevel1 + +window.focus.color: grey +window.focus.colorTo: grey20 +window.focus.textColor: grey85 +window.focus.button.color: grey +window.focus.button.colorTo: grey20 +window.unfocus.color: rgb:8/8/7 +window.unfocus.colorTo: grey20 +window.unfocus.textColor: grey +window.unfocus.button.color: grey20 +window.unfocus.button.colorTo: grey +window.button.pressed.color: rgb:4/4/38 +window.button.pressed.colorTo: rgb:f/f/d +window.frame.color: grey85 +... + +Now all we have to do is finish off the style with a few miscellanous options. +These include the title and menu fonts/justification, border color, bevel and +handle widths, window move style and the root command. + +Fonts must be a valid X11 font screen, or a valid font alias. Use a utility +like `xfontsel' (and others) to preview fonts. Also use the utility +`xlsfonts' to spit out all the current X font names and aliases stored in +the X server. + +Justification can be one of three things: LeftJustify, CenterJustify or +RightJustify. + +The border color is the color applied to the 1 pixel border around the menu +frame/title and the window titlebar/buttons/handle/etc. Setting this color +can have drastic effects on your style, so don't just leave it set to `black' +all the time. ;) + +The bevel and handle widths control the size and spacing of decorations in +Blackbox. The larger the number, the more space Blackbox takes up. + +The window move style tells Blackbox how to move windows when you drag them +with your mouse. There are two options for it: Opaque or Wire. + +The root command is the command run every time the style is loaded (either at +startup or after a reconfigure/style-change). It is used to run a program +like xv, Esetroot, wmsetbg, etc. to set an image/color/pattern on the root +window. Just supply a command and it will be run. + +Also, as a note, an X resource file can have comments. Precede the line with +and exclamation mark `!' and the rest of the line will be ignored. + +Let's finish off the details and take a look at our finished style: + +... +! Results - theme for Blackbox 0.51.x +! by Brad Hughes bhughes@tcac.net + +! define the toolbars textures... note that the interlaced option is new +! in 0.51.x +toolbar: Raised Diagonal Gradient Bevel1 +toolbar.button: Raised Diagonal Gradient Bevel1 +toolbar.button.pressed: Sunken Diagonal Interlaced Gradient Bevel1 +toolbar.clock: Flat Interlaced Gradient +toolbar.label: Flat Interlaced Gradient + +! toolbar colors +toolbar.color: rgb:8/8/7 +toolbar.colorTo: grey20 +toolbar.button.color: grey +toolbar.button.colorTo: grey20 +toolbar.button.pressed.color: rgb:4/4/38 +toolbar.button.pressed.colorTo: rgb:f/f/d +toolbar.clock.color: grey20 +toolbar.clock.colorTo: rgb:8/8/7 +toolbar.label.color: grey20 +toolbar.label.colorTo: rgb:8/8/7 +toolbar.textColor: grey85 + +! menu textures +menu.title: Raised Diagonal Interlaced Gradient Bevel1 +menu.frame: Raised Diagonal Gradient Bevel1 + +! menu colors +menu.title.color: grey20 +menu.title.colorTo: rgb:8/8/7 +menu.title.textColor: grey85 +menu.frame.color: rgb:8/8/7 +menu.frame.colorTo: grey10 +menu.frame.textColor: white +menu.frame.highlightColor: grey85 +menu.frame.hiTextColor: grey20 + +! window textures +window.focus: Raised Diagonal Interlaced Gradient Bevel1 +window.focus.button: Raised Diagonal Gradient Bevel1 +window.unfocus: Raised Diagonal Gradient Bevel1 +window.unfocus.button: Sunken Diagonal Gradient Bevel1 +window.button.pressed: Flat Diagonal Interlaced Gradient +window.frame: Raised Solid Bevel1 + +! window colors +window.focus.color: grey +window.focus.colorTo: grey20 +window.focus.textColor: grey85 +window.focus.button.color: grey +window.focus.button.colorTo: grey20 +window.unfocus.color: rgb:8/8/7 +window.unfocus.colorTo: grey20 +window.unfocus.textColor: grey +window.unfocus.button.color: grey20 +window.unfocus.button.colorTo: grey +window.button.pressed.color: rgb:4/4/38 +window.button.pressed.colorTo: rgb:f/f/d +window.frame.color: grey85 + +! misc... +borderColor: rgb:2/2/1c + +moveStyle: Opaque + +menuJustify: CenterJustify +titleJustify: CenterJustify + +bevelWidth: 2 +handleWidth: 4 + +menuFont: lucidasans-10 +titleFont: lucidasans-bold-10 + +rootCommand: bsetroot -mod 4 4 -fg rgb:6/6/5c -bg grey20 +... + +Alright! Our style is finished. Let's see how the sucker looks. First we +need to tell Blackbox to use the new style. The way to do that is to edit +your menu (refer to README.menu for this) and add: + +[style] (Results) {~/.blackbox/Styles/results} + +somewhere in our menu. Taking advantage of Blackbox 0.51.x's (and up) +automagic menu updates, all we have to do is close and reopen the root menu +and our new style entry will be visible. Select it and Blackbox will apply +the new style we just created. diff --git a/data/generate_menu b/data/generate_menu new file mode 100755 index 00000000..49b5adc7 --- /dev/null +++ b/data/generate_menu @@ -0,0 +1,232 @@ +# generate_menu for Fluxbox +# Copyright (c) 2001 Henrik Kinnunen (fluxgen@linuxmail.org) +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +#!/bin/sh + +FILENAME=menu.in + + +# Start of menu + +echo "[begin] (Fluxbox @VERSION@)" > $FILENAME + +if [ -x `which xterm` ]; then + echo " [exec] (xterm) {xterm -fg white -bg black}" >> $FILENAME +fi + +if [ -x `which nedit` ]; then + echo " [exec] (nedit) {nedit}" >> $FILENAME +fi + +echo "[submenu] (Browsers)" >> $FILENAME + if [ -x `which netscape` ]; then + echo " [exec] (netscape) {netscape}" >> $FILENAME + fi + if [ -x `which opera` ]; then + echo " [exec] (opera) {opera}" >> $FILENAME + fi + if [ -x `which galeon` ]; then + echo " [exec] (galeon) {galeon}" >> $FILENAME + fi + if [ -x `which mozilla` ]; then + echo " [exec] (mozilla) {mozilla}" >> $FILENAME + fi + if [ -x `which konqueror` ]; then + echo " [exec] (konqueror) {konqueror}" >> $FILENAME + fi +echo "[end]" >> $FILENAME + + +echo "[submenu] (Editors)" >> $FILENAME + if [ -x `which nedit` ]; then + echo " [exec] (nedit) {nedit}" >> $FILENAME + fi + if [ -x `which vim` ]; then + echo " [exec] (vim) {vim -g}" >> $FILENAME + fi + if [ -x `which xemacs` ]; then + echo " [exec] (xemacs) {xemacs}" >> $FILENAME + fi + if [ -x `which gedit` ]; then + echo " [exec] (gedit) {gedit}" >> $FILENAME + fi + if [ -x `which xedit` ]; then + echo " [exec] (xedit) {xedit}" >> $FILENAME + fi + if [ -x `which kword` ]; then + echo " [exec] (kword) {kword}" >> $FILENAME + fi + +echo "[end]" >> $FILENAME + +echo "[submenu] (Net)" >> $FILENAME + if [ -x `which realplay` ]; then + echo " [exec] (realplay) {realplay}" >> $FILENAME + fi + + if [ -x `which licq` ]; then + echo " [exec] (licq) {licq}" >> $FILENAME + fi + if [ -x `which xchat` ]; then + echo " [exec] (xchat) {xchat}" >> $FILENAME + fi + if [ -x `which sylpheed` ]; then + echo " [exec] (sylpheed) {sylpheed}" >> $FILENAME + fi + if [ -x `which gftp` ]; then + echo " [exec] (gftp) {gftp}" >> $FILENAME + fi + if [ -x `which BitchX` ]; then + echo " [exec] (BitchX) {xterm -title BitchX -fg white -bg black -e BitchX -N}" >> $FILENAME + else + if [ -x `which bitchx` ]; then + echo " [exec] (BitchX) {xterm -title BitchX -fg white -bg black -e bitchx -N}" >> $FILENAME + fi + fi + if [ -x `which ircii` ]; then + echo " [exec] (ircii) {xterm -title ircii -fg white -bg black -e ircii -s}" >> $FILENAME + fi +echo "[end]" >> $FILENAME + + +echo "[submenu] (Graphics)" >> $FILENAME + if [ -x `which gimp` ]; then + echo " [exec] (gimp) {gimp}" >> $FILENAME + fi + if [ -x `which xv` ]; then + echo " [exec] (xv) {xv}" >> $FILENAME + fi + if [ -x `which gqview` ]; then + echo " [exec] (gqview) {gqview}" >> $FILENAME + fi + if [ -x `which xpaint` ]; then + echo " [exec] (xpaint) {xpaint}" >> $FILENAME + fi +echo "[end]" >> $FILENAME + +echo "[submenu] (Music)" >> $FILENAME + if [ -x `which xmms` ]; then + echo " [exec] (xmms) {xmms}" >> $FILENAME + fi + if [ -x `which gqmpeg` ]; then + echo " [exec] (gqmpeg) {gqmpeg}" >> $FILENAME + fi + if [ -x `which xmixer` ]; then + echo " [exec] (xmixer) {xmixer}" >> $FILENAME + fi + if [ -x `which gmix` ]; then + echo " [exec] (gmix) {gmix}" >> $FILENAME + fi + if [ -x `which xplaycd` ]; then + echo " [exec] (xplaycd) {xplaycd}" >> $FILENAME + fi + if [ -x `which soundtracker` ]; then + echo " [exec] (soundtracker) {soundtracker}" >> $FILENAME + fi +echo "[end]" >> $FILENAME + +echo "[submenu] (Terminals)" >> $FILENAME + if [ -x `which xterm` ]; then + echo " [exec] (xterm) {xterm -fg white -bg black}" >> $FILENAME + fi + if [ -x `which gnome-terminal` ]; then + echo " [exec] (gnome-terminal) {gnome-terminal}" >> $FILENAME + fi + if [ -x `which Eterm` ]; then + echo " [exec] (Eterm) {Eterm}" >> $FILENAME + fi + if [ -x `which konsole` ]; then + echo " [exec] (konsole) {konsole}" >> $FILENAME + fi + if [ -x `which aterm` ]; then + echo " [exec] (aterm) {aterm}" >> $FILENAME + fi + if [ -x `which rxvt` ]; then + echo " [exec] (rxvt) {rxvt}" >> $FILENAME + fi +echo "[end]" >> $FILENAME + + +echo "[submenu] (Misc)" >> $FILENAME + if [ -x `which acroread` ]; then + echo " [exec] (acroread) {acroread}" >> $FILENAME + fi + if [ -x `which gcalc` ]; then + echo " [exec] (gcalc) {gcalc}" >> $FILENAME + fi + if [ -x `which xgdb` ]; then + echo " [exec] (xgdb) {xgdb}" >> $FILENAME + fi + if [ -x `which ddd` ]; then + echo " [exec] (ddd) {ddd}" >> $FILENAME + fi + if [ -x `which xterm` ]; then + echo " [exec] (tail access_log) {xterm -fg white -bg black -title access_log -e tail -f /var/log/access_log}" >> $FILENAME + fi +echo "[end]" >> $FILENAME + +echo "[submenu] (X utils)" >> $FILENAME + if [ -x `which xpenguins` ]; then + echo " [exec] (xpenguins) {xpenguins}" >> $FILENAME + fi + if [ -x `which xcalc` ]; then + echo " [exec] (xcalc) {xcalc}" >> $FILENAME + fi + if [ -x `which xfontsel` ]; then + echo " [exec] (xfontsel) {xfontsel}" >> $FILENAME + fi + if [ -x `which xman` ]; then + echo " [exec] (xman) {xman}" >> $FILENAME + fi + if [ -x `which xload` ]; then + echo " [exec] (xload) {xload}" >> $FILENAME + fi + if [ -x `which xfig` ]; then + echo " [exec] (xfig) {xfig}" >> $FILENAME + fi + if [ -x `which xbiff` ]; then + echo " [exec] (xbiff) {xbiff}" >> $FILENAME + fi + if [ -x `which editres` ]; then + echo " [exec] (editres) {editres}" >> $FILENAME + fi + if [ -x `which viewres` ]; then + echo " [exec] (viewres) {viewres}" >> $FILENAME + fi + if [ -x `which xsnow` ]; then + echo " [exec] (xsnow) {xsnow}" >> $FILENAME + fi + if [ -x `which xclock` ]; then + echo " [exec] (xclock) {xclock}" >> $FILENAME + fi +echo "[end]" >> $FILENAME + + +echo "[workspaces] (Workspace List)" >> $FILENAME +echo "[submenu] (Styles) {Choose a style...}" >> $FILENAME +echo "[stylesdir] (@pkgdatadir@/styles)" >> $FILENAME +echo "[end]" >> $FILENAME +echo "[config] (Configuration)" >> $FILENAME +echo "[reconfig] (Reconfigure)" >> $FILENAME +echo "[restart] (Restart)" >> $FILENAME +echo "[exit] (Exit)" >> $FILENAME + +echo "[end]" >> $FILENAME diff --git a/data/init.in b/data/init.in new file mode 100644 index 00000000..4c799455 --- /dev/null +++ b/data/init.in @@ -0,0 +1,36 @@ +session.screen0.slit.placement: BottomRight +session.screen0.slit.direction: Vertical +session.screen0.slit.onTop: False +session.screen0.slit.autoHide: False +session.screen0.tab.placement: Top +session.screen0.tab.alignment: Left +session.screen0.tab.rotatevertical: True +session.screen0.toolbar.onTop: False +session.screen0.toolbar.autoHide: False +session.screen0.toolbar.placement: BottomCenter +session.screen0.toolbar.widthPercent: 66 +session.screen0.workspaceNames: one,two,three,four +session.screen0.strftimeFormat: %I:%M %p +session.screen0.focusNewWindows: True +session.screen0.focusModel: ClickToFocus +session.screen0.fullMaximization: False +session.screen0.edgeSnapThreshold: 0 +session.screen0.rowPlacementDirection: LeftToRight +session.screen0.workspaces: 4 +session.screen0.focusLastWindow: True +session.screen0.colPlacementDirection: TopToBottom +session.screen0.windowPlacement: RowSmartPlacement +session.opaqueMove: False +session.autoRaiseDelay: 250 +session.menuFile: @pkgdatadir@/menu +session.cacheLife: 5 +session.styleFile: @pkgdatadir@/styles/Clean +session.titlebarFile: @pkgdatadir@/titlebar +session.keyFile: @pkgdatadir@/keys +session.colorsPerChannel: 4 +session.doubleClickInterval: 250 +session.cacheMax: 200 +session.imageDither: True +session.iconbar: true +session.tab.width: 64 +session.tab.height: 16 diff --git a/data/keys b/data/keys new file mode 100644 index 00000000..0755e4fc --- /dev/null +++ b/data/keys @@ -0,0 +1,14 @@ +Mod1 Tab :NextWindow +Mod1 Shift Tab :PrevWindow +Mod1 F1 :Workspace1 +Mod1 F2 :Workspace2 +Mod1 F3 :Workspace3 +Mod1 F4 :Workspace4 +Mod1 F5 :Workspace5 +Mod1 F6 :Workspace6 +Mod1 F7 :Workspace7 +Mod1 F8 :Workspace8 +Mod1 F9 :Workspace9 +Mod1 F10 :Workspace10 +Mod1 F11 :Workspace11 +Mod1 F12 :Workspace12 diff --git a/data/styles/Artwiz b/data/styles/Artwiz new file mode 100644 index 00000000..c08b5eae --- /dev/null +++ b/data/styles/Artwiz @@ -0,0 +1,109 @@ +toolbar: raised gradient vertical +toolbar.color: rgb:80/84/88 +toolbar.colorTo: rgb:30/34/38 + +toolbar.button: raised gradient diagonal +toolbar.button.color: rgb:90/94/98 +toolbar.button.colorTo: rgb:20/24/28 +toolbar.button.picColor: white + +toolbar.button.pressed: sunken gradient diagonal +toolbar.button.pressed.color: black +toolbar.button.pressed.colorTo: rgb:80/98/d0 + +toolbar.clock: sunken gradient diagonal +toolbar.clock.color: rgb:10/20/30 +toolbar.clock.colorTo: rgb:70/80/90 +toolbar.clock.textColor: white + +toolbar.label: sunken gradient diagonal +toolbar.label.color: rgb:10/20/30 +toolbar.label.colorTo: rgb:70/80/90 +toolbar.label.textColor: white + +toolbar.windowLabel: sunken gradient diagonal +toolbar.windowLabel.color: rgb:10/20/30 +toolbar.windowLabel.colorTo: rgb:70/80/90 +toolbar.windowLabel.textColor: white + +toolbar.justify: center + + +menu.title: raised gradient diagonal +menu.title.color: rgb:90/94/98 +menu.title.colorTo: rgb:20/24/28 +menu.title.textColor: white +menu.title.justify: center + +menu.frame: sunken gradient diagonal +menu.frame.color: rgb:10/20/30 +menu.frame.colorTo: rgb:70/80/90 +menu.frame.textColor: rgb:90/a0/b0 +menu.frame.justify: center + +menu.hilite: raised gradient diagonal +menu.hilite.color: rgb:90/94/98 +menu.hilite.colorTo: rgb:20/24/28 +menu.hilite.textColor: white + +menu.bullet: empty +menu.bullet.position: right + + +window.title.focus: raised gradient vertical +window.title.focus.color: rgb:80/84/88 +window.title.focus.colorTo: rgb:30/34/38 +window.title.unfocus: raised vertical gradient +window.title.unfocus.color: rgb:50/54/58 +window.title.unfocus.colorTo: black + +window.label.focus: sunken diagonal gradient +window.label.focus.color: rgb:10/20/30 +window.label.focus.colorTo: rgb:70/80/90 +window.label.focus.textColor: white +window.label.unfocus: sunken gradient diagonal +window.label.unfocus.color: black +window.label.unfocus.colorTo: rgb:40/50/60 +window.label.unfocus.textColor: rgb:60/64/68 + +window.button.focus: raised gradient diagonal +window.button.focus.color: rgb:90/94/98 +window.button.focus.colorTo: rgb:20/24/28 +window.button.focus.picColor: white +window.button.unfocus: raised gradient diagonal +window.button.unfocus.color: rgb:50/54/58 +window.button.unfocus.colorTo: black +window.button.unfocus.picColor: rgb:70/74/78 +window.button.pressed: sunken gradient diagonal +window.button.pressed.color: rgb:20/40/50 +window.button.pressed.colorTo: rgb:60/70/80 + +window.frame.focusColor: rgb:40/44/48 +window.frame.unfocusColor: rgb:20/24/28 + +window.handle.focus: raised gradient diagonal +window.handle.focus.color: rgb:70/74/78 +window.handle.focus.colorTo: rgb:40/44/48 +window.handle.unfocus: raised gradient diagonal +window.handle.unfocus.color: rgb:50/54/58 +window.handle.unfocus.colorTo: black + +window.grip.focus: sunken diagonal gradient +window.grip.focus.color: rgb:20/30/40 +window.grip.focus.colorTo: rgb:60/70/80 +window.grip.unfocus: sunken diagonal gradient +window.grip.unfocus.color: black +window.grip.unfocus.colorTo: rgb:30/40/50 + +window.justify: center + + +borderColor: black + +bevelWidth: 2 +borderWidth: 1 +handleWidth: 5 + +rootCommand: bsetroot -mod 4 4 -bg rgb:10/18/20 -fg rgb:30/38/40 + +*Font: -*-lucidatypewriter-medium-r-*-*-*-100-*-*-*-*-*-* diff --git a/data/styles/Blue b/data/styles/Blue new file mode 100644 index 00000000..14b6fcdc --- /dev/null +++ b/data/styles/Blue @@ -0,0 +1,145 @@ +! Blue for Fluxbox by Fluxgen +! http://fluxbox.sourceforge.net +! Oct 31 2001 + +! Miscellaneous settings... +style.name: Blue +style.author: Henrik Kinnunen +style.date: Wed Oct 31 2001 +style.credits: +style.comments: + + +! Toolbar settings... +toolbar.button: Raised Bevel1 Gradient Diagonal +toolbar.button.color: gray +toolbar.button.colorTo: gray +toolbar.button.picColor: black + +toolbar.button.pressed: Sunken Bevel1 Gradient Diagonal +toolbar.button.pressed.color: gray +toolbar.button.pressed.colorTo: gray + +toolbar.label: parentrelative +toolbar.label.color: gray +toolbar.label.textColor: black + +toolbar.windowLabel: Sunken Bevel1 Gradient PipeCross +toolbar.windowLabel.color: gray +toolbar.windowLabel.colorTo: gray +toolbar.windowLabel.textColor: black + +toolbar.clock: Sunken +toolbar.clock.color: gray +toolbar.clock.textColor: #000000 + +toolbar: Sunken Bevel1 Gradient Pyramid +toolbar.color: gray +toolbar.colorTo: gray +toolbar.textColor: black +toolbar.justify: Center + + +! Menu settings... +menu.frame: Flat Gradient Vertical +menu.frame.color: lightblue +menu.frame.colorTo: blue +menu.frame.textColor: #000000 +menu.frame.justify: Left + +menu.title: Raised Bevel1 Gradient CrossDiagonal +menu.title.font: -adobe-helvetica-bold-r-normal--12-* +menu.title.color: Lightblue +menu.title.colorTo: blue +menu.title.textColor: black +menu.title.justify: center + +menu.hilite: Sunken Bevel1 Gradient PipeCross +menu.hilite.color: #7f7f7f +menu.hilite.colorTo: #FFFFFF +menu.hilite.textColor: #000000 + +menu.bullet: Triangle +menu.bullet.position: Right +menu.frame.disableColor: #ffffff + +! Window settings... +window.button.focus: Raised Bevel1 Gradient Elliptic +window.button.focus.color: #9d9d9d +window.button.focus.colorTo: #535353 +window.button.focus.picColor: #000000 + +window.button.unfocus: Flat Gradient Diagonal +window.button.unfocus.color: #5e5e5e +window.button.unfocus.colorTo: #414141 +window.button.unfocus.picColor: #000000 + +window.grip.focus: Raised Bevel2 Gradient Rectangle +window.grip.focus.color: Lightblue +window.grip.focus.colorTo: Lightblue + +window.grip.unfocus: Flat Gradient Vertical +window.grip.unfocus.color: DarkBlue +window.grip.unfocus.colorTo: DarkBlue + +window.handle.focus: Raised Bevel1 Gradient Rectangle +window.handle.focus.color: LightBlue +window.handle.focus.colorTo: Blue + +window.handle.unfocus: Flat Gradient Vertical +window.handle.unfocus.color: DarkBlue +window.handle.unfocus.colorTo: DarkBlue + +window.label.focus: parentrelative +window.label.focus.color: blue +window.label.focus.colorTo: blue +window.label.focus.textColor: black +window.label.focus.justify: Left + +window.font: -adobe-helvetica-bold-r-normal--12-* +window.justify: Left +window.label.unfocus: Sunken Bevel1 Solid Diagonal +window.label.unfocus.color: #70707F +window.label.unfocus.colorTo: #ffffff +window.label.unfocus.textColor: white + +window.title.focus: Raised Bevel1 Gradient CrossDiagonal +window.title.focus.color: Lightblue +window.title.focus.colorTo: blue + +window.title.unfocus: Raised Bevel2 Gradient Vertical +window.title.unfocus.color: #4d4d4d +window.title.unfocus.colorTo: #55484e +! ----------- tab +window.tab.font: -adobe-helvetica-bold-r-normal--10-* +window.tab.justify: Left +window.tab.label.unfocus: Sunken Bevel1 Solid Diagonal +window.tab.label.unfocus.color: DarkBlue +window.tab.label.unfocus.colorTo: black +window.tab.label.unfocus.textColor: Lightblue +window.tab.label.focus: Raised Bevel1 Gradient CrossDiagonal +window.tab.label.focus.color: LightBlue +window.tab.label.focus.colorTo: blue +window.tab.label.focus.textColor: black +window.tab.borderWidth: 1 +window.tab.borderColor: black +! ----------- + + + +window.button.pressed: Raised Bevel2 Gradient Diagonal +window.button.pressed.color: #000000 +window.button.pressed.colorTo: #808080 + +window.frame.focusColor: #4f4f4f +window.frame.unfocusColor: #000000 +handleWidth: 4 +frameWidth: 1 +bevelWidth: 1 +borderWidth: 1 +borderColor: blue + + +rootCommand: bsetroot -gradient flatverticalgradient -from lightblue -to blue + +*Font: -adobe-helvetica-medium-r-normal--12-* diff --git a/data/styles/Carbondioxide b/data/styles/Carbondioxide new file mode 100644 index 00000000..2976eb00 --- /dev/null +++ b/data/styles/Carbondioxide @@ -0,0 +1,135 @@ +# carbondioxide. +# A fluxbox theme by skypher. +# 2001. + +toolbar: Raised Gradient Veritcal +toolbar.color: rgb:85/85/85 +toolbar.colorTo: rgb:FF/FF/FF + +toolbar.button: Raised Gradient Horizontal +toolbar.button.color: rgb:85/85/85 +toolbar.button.colorTo: rgb:FF/FF/FF +toolbar.button.picColor: rgb:00/00/00 + +toolbar.button.pressed: Sunken Horizontal +toolbar.button.pressed.color: rgb:70/70/70 + +toolbar.clock: Sunken Gradient Vertical +toolbar.clock.color: rgb:85/85/85 +toolbar.clock.colorTo: rgb:FF/FF/FF +toolbar.clock.textColor: rgb:00/00/00 + +toolbar.label: Sunken Gradient Vertical +toolbar.label.color: rgb:85/85/85 +toolbar.label.colorTo: rgb:FF/FF/FF +toolbar.label.textColor: rgb:10/10/10 + +toolbar.windowLabel: Raised Gradient Vertical +toolbar.windowLabel.color: rgb:85/85/85 +toolbar.windowLabel.colorTo: rgb:FF/FF/FF +toolbar.windowLabel.textColor: rgb:00/00/00 + +toolbar.justify: right + +menu.title: Gradient Horizontal Interlaced +menu.title.color: rgb:FF/FF/FF +menu.title.colorTo: rgb:85/85/85 +menu.title.textColor: rgb:00/00/00 +menu.title.justify: Center + +menu.frame: Sunken Gradient +menu.frame.color: rgb:70/70/70 +menu.frame.colorTo: rgb:FF/FF/FF +menu.frame.textColor: rgb:10/10/10 +menu.frame.justify: Left + +menu.hilite: Gradient +menu.hilite.color: rgb:10/10/10 +menu.hilite.colorTo: rgb:42/42/42 +menu.hilite.textColor: rgb:FF/FF/FF + +menu.bullet: Diamond +menu.bullet.position: Right + +window.title.focus: Raised Gradient Vertical Interlaced +window.title.focus.color: rgb:FF/FF/FF +window.title.focus.colorTo: rgb:85/85/85 +window.title.unfocus: Raised Gradient Vertical Interlaced +window.title.unfocus.color: rgb:70/70/70 +window.title.unfocus.colorTo: rgb:85/85/85 + +window.label.focus: Flat Gradient Vertical Interlaced +window.label.focus.color: rgb:FF/FF/FF +window.label.focus.colorTo: rgb:85/85/85 +window.label.focus.textColor: rgb:00/00/00 +window.label.unfocus: Flat Gradient Vertical Interlaced +window.label.unfocus.color: rgb:70/70/70 +window.label.unfocus.colorTo: rgb:85/85/85 +window.label.unfocus.textColor: rgb:10/10/10 + +# nedan ej klart. +window.button.focus: Raised Gradient Diagonal +window.button.focus.color: rgb:9B/9B/9B +window.button.focus.colorTo: rgb:42/42/42 +window.button.focus.picColor: rgb:E2/E2/E2 +window.button.unfocus: Raised Gradient Diagonal +window.button.unfocus.color: rgb:9B/9B/9B +window.button.unfocus.colorTo: rgb:42/42/42 +window.button.unfocus.picColor: rgb:C1/C1/C1 +window.button.pressed: Sunken Gradient Diagonal +window.button.pressed.color: rgb:9B/9B/9B +window.button.pressed.colorTo: rgb:42/42/42 + +window.frame.focus: Sunken +window.frame.focus.color: rgb:89/89/89 +window.frame.unfocus: Sunken +window.frame.unfocus.color: rgb:68/68/68 + +window.handle.focus: Raised Gradient Diagonal +window.handle.focus.color: rgb:66/66/66 +window.handle.focus.colorTo: rgb:66/66/68 +window.handle.unfocus: Raised Gradient Diagonal +window.handle.unfocus.color: rgb:66/66/66 +window.handle.unfocus.colorTo: rgb:60/60/60 + +window.grip.focus: Raised Gradient Diagonal Interlaced +window.grip.focus.color: rgb:FF/FF/FF +window.grip.focus.colorTo: rgb:85/85/85 +window.grip.unfocus: Raised Gradient Diagonal +window.grip.unfocus.color: rgb:70/70/70 +window.grip.unfocus.colorTo: rgb:85/85/85 + +! ----------- tab - explicit for fluxbox, the best wm out there[tm] (; +window.tab.justify: Left +window.tab.label.unfocus: Flat Gradient Vertical +window.tab.label.unfocus.color: rgb:70/70/70 +window.tab.label.unfocus.colorTo: rgb:85/85/85 +window.tab.label.unfocus.textColor: rgb:15/15/15 +window.tab.label.focus: Flat Gradient Vertical +window.tab.label.focus.color: rgb:FF/FF/FF +window.tab.label.focus.colorTo: rgb:85/85/85 +window.tab.label.focus.textColor: black +window.tab.borderWidth: 1 +window.tab.borderColor: rgb:10/10/10 +! ----------- (fluxbox.sourceforge.net) +window.tab.font: snap + +window.justify: Center + +toolbar.font: snap +window.font: snap +menu.title.font: -*-lucida-medium-r-*-*-*-100-*-*-*-*-*-* +menu.frame.font: -*-lucida-medium-r-*-*-*-100-*-*-*-*-*-* + +#toolbar.font: -*-lucida-bold-r-*-*-*-100-*-*-*-*-*-* +#window.font: -*-lucida-bold-r-*-*-*-100-*-*-*-*-*-* +#menu.title.font: -*-lucida-bold-r-*-*-*-100-*-*-*-*-*-* +#menu.frame.font: -*-lucida-medium-r-*-*-*-100-*-*-*-*-*-* + +borderColor: rgb:00/00/00 + +bevelWidth: 2 +borderWidth: 1 +handleWidth: 3 + +rootCommand: bsetroot -gradient flatverticalgradient -from black -to white diff --git a/data/styles/Clean b/data/styles/Clean new file mode 100644 index 00000000..d9f7f7d9 --- /dev/null +++ b/data/styles/Clean @@ -0,0 +1,117 @@ +# "Clean" +# A Fluxbox theme by: skypher of perplexity +# 2001 + +toolbar: Interlaced +toolbar.color: rgb:CC/CC/CC + +toolbar.button: Raised +toolbar.button.color: rgb:CC/CC/CC +toolbar.button.picColor: rgb:10/10/10 + +toolbar.button.pressed: Sunken +toolbar.button.pressed.color: rgb:80/80/80 + +toolbar.clock: Raised +toolbar.clock.color: rgb:CC/CC/CC +toolbar.clock.textColor: rgb:10/10/10 + +toolbar.label: Raised +toolbar.label.color: rgb:CC/CC/CC +toolbar.label.textColor: rgb:10/10/10 + +toolbar.windowLabel: Raised +toolbar.windowLabel.color: rgb:CC/CC/CC +toolbar.windowLabel.textColor: rgb:10/10/10 + +toolbar.justify: right + +menu.title: Raised Gradient Horizontal Interlaced +menu.title.color: rgb:90/BB/CC +menu.title.colorTo: rgb:CA/CD/CF +menu.title.textColor: rgb:10/10/10 +menu.title.justify: Right + +menu.frame: Gradient PipeCross +menu.frame.color: rgb:CC/CC/CD +menu.frame.colorTo: rgb:CA/CD/CE +menu.frame.textColor: rgb:10/10/10 +menu.frame.justify: Right + +menu.hilite: Raised +menu.hilite.color: rgb:40/40/40 +menu.hilite.textColor: rgb:CC/CC/CC + +menu.bullet: Diamond +menu.bullet.position: Right + + +window.title.focus: Raised Interlaced +window.title.focus.color: rgb:CC/CC/CD + +window.title.unfocus: Flat Solid +window.title.unfocus.color: rgb:BE/BE/BE + +window.label.focus: Solid Interlaced Flat +window.label.focus.color: rgb:CA/CA/CB +window.label.focus.textColor: rgb:10/10/10 + +window.label.unfocus: Flat Solid +window.label.unfocus.color: rgb:BE/BE/BE +window.label.unfocus.textColor: rgb:09/09/09 + +window.button.focus: Raised Bevel1 Solid +window.button.focus.color: rgb:CC/CC/CC +window.button.focus.picColor: rgb:10/10/10 + +window.button.unfocus: Flat Solid +window.button.unfocus.color: rgb:CA/CA/CA +window.button.unfocus.picColor: rgb:09/09/09 + +window.button.pressed: Sunken Bevel1 Solid +window.button.pressed.color: rgb:80/80/80 + +window.frame.focus: Flat +window.frame.focus.color: rgb:CC/CC/CC +window.frame.unfocus: Flat +window.frame.unfocus.color: rgb:BE/BE/BE + +window.handle.focus: Raised Solid +window.handle.focus.color: rgb:CC/CC/CC +window.handle.unfocus: Flat Solid +window.handle.unfocus.color: rgb:BC/BC/BC + +window.grip.focus: Raised Gradient Diagonal Interlaced +window.grip.focus.color: rgb:9B/9B/9B +window.grip.focus.colorTo: rgb:80/80/80 +window.grip.unfocus: Raised Gradient Diagonal +window.grip.unfocus.color: rgb:9B/9B/9B +window.grip.unfocus.colorTo: rgb:80/80/80 + +! ----------- tab - explicit for fluxbox, the best wm out there[tm] (; +window.tab.justify: Right +window.tab.label.unfocus: Flat Solid +window.tab.label.unfocus.color: rgb:AC/AC/AC +window.tab.label.unfocus.textColor: black +window.tab.label.focus: Raised Solid +window.tab.label.focus.color: rgb:CC/CC/CC +window.tab.label.focus.textColor: black +window.tab.borderWidth: 1 +window.tab.borderColor: rgb:10/10/10 +! ----------- (fluxbox.sourceforge.net) +window.tab.font: -*-lucidatypewriter-medium-r-normal-*-10-100-75-75-m-60-iso8859-1 + +window.justify: Right + +toolbar.font: -*-lucidatypewriter-medium-r-normal-*-10-100-75-75-m-60-iso8859-1 +window.font: -misc-8x8\ system\ font-medium-r-normal--9-90-100-100-m-100-iso8859-1 +menu.title.font: -*-lucidatypewriter-medium-r-normal-*-10-100-75-75-m-60-iso8859-1 +menu.frame.font: -*-lucida-medium-r-normal-*-10-100-*-*-*-*-iso8859-1 + +borderColor: rgb:10/10/10 + +bevelWidth: 1 +borderWidth: 1 +handleWidth: 2 + +rootCommand: bsetroot -solid rgb:9A/9A/90 diff --git a/data/styles/CleanColor b/data/styles/CleanColor new file mode 100644 index 00000000..7fd15133 --- /dev/null +++ b/data/styles/CleanColor @@ -0,0 +1,120 @@ +# "Clean Color" +# A Fluxbox theme by: skypher of perplexity +# 2001 + +toolbar: Interlaced +toolbar.color: rgb:CC/CC/CC + +toolbar.button: Raised +toolbar.button.color: rgb:CC/CC/CC +toolbar.button.picColor: rgb:10/10/10 + +toolbar.button.pressed: Sunken +toolbar.button.pressed.color: rgb:80/80/80 + +toolbar.clock: Raised +toolbar.clock.color: rgb:CC/CC/CC +toolbar.clock.textColor: rgb:10/10/10 + +toolbar.label: Raised +toolbar.label.color: rgb:CC/CC/CC +toolbar.label.textColor: rgb:10/10/10 + +toolbar.windowLabel: Raised +toolbar.windowLabel.color: rgb:CC/CC/CC +toolbar.windowLabel.textColor: rgb:10/10/10 + +toolbar.justify: right + +menu.title: Raised Gradient Horizontal Interlaced +menu.title.color: rgb:90/BB/CC +menu.title.colorTo: rgb:CA/CD/CF +menu.title.textColor: rgb:10/10/10 +menu.title.justify: Right + +menu.frame: Gradient PipeCross +menu.frame.color: rgb:CC/CC/CD +menu.frame.colorTo: rgb:CA/CD/CE +menu.frame.textColor: rgb:10/10/10 +menu.frame.justify: Right + +menu.hilite: Raised +menu.hilite.color: rgb:40/40/40 +menu.hilite.textColor: rgb:CC/CC/CC + +menu.bullet: Diamond +menu.bullet.position: Right + + +window.title.focus: Raised Interlaced Gradient Horizontal +window.title.focus.color: rgb:90/BB/CC +window.title.focus.colorTo: rgb:CA/CD/CF + +window.title.unfocus: Flat Solid +window.title.unfocus.color: rgb:BE/BE/BE + +window.label.focus: Gradient Horizontal Flat +window.label.focus.color: rgb:90/BB/CC +window.label.focus.colorTo: rgb:CA/CD/CF +window.label.focus.textColor: rgb:10/10/10 + +window.label.unfocus: Flat Solid +window.label.unfocus.color: rgb:BE/BE/BE +window.label.unfocus.textColor: rgb:09/09/09 + +window.button.focus: Raised Bevel1 Solid +window.button.focus.color: rgb:CC/CC/CC +window.button.focus.picColor: rgb:10/10/10 + +window.button.unfocus: Flat Solid +window.button.unfocus.color: rgb:CA/CA/CA +window.button.unfocus.picColor: rgb:09/09/09 + +window.button.pressed: Sunken Bevel1 Solid +window.button.pressed.color: rgb:80/80/80 + +window.frame.focus: Flat +window.frame.focus.color: rgb:CC/CC/CC +window.frame.unfocus: Flat +window.frame.unfocus.color: rgb:BE/BE/BE + +window.handle.focus: Raised Solid +window.handle.focus.color: rgb:CC/CC/CC +window.handle.unfocus: Flat Solid +window.handle.unfocus.color: rgb:BC/BC/BC + +window.grip.focus: Raised Gradient Diagonal Interlaced +window.grip.focus.color: rgb:9B/9B/9B +window.grip.focus.colorTo: rgb:80/80/80 +window.grip.unfocus: Raised Gradient Diagonal +window.grip.unfocus.color: rgb:9B/9B/9B +window.grip.unfocus.colorTo: rgb:80/80/80 + +! ----------- tab - explicit for fluxbox, the best wm out there[tm] (; +window.tab.justify: Left +window.tab.label.unfocus: Flat Solid +window.tab.label.unfocus.color: rgb:BE/BE/BE +window.tab.label.unfocus.textColor: rgb:20/20/20 +window.tab.label.focus: Gradient Horizontal Flat +window.tab.label.focus.color: rgb:90/BB/CC +window.tab.label.focus.colorTo: rgb:CA/CD/CF +window.tab.label.focus.textColor: rgb:10/10/10 +window.tab.borderWidth: 1 +window.tab.borderColor: rgb:10/10/10 +! ----------- (fluxbox.sourceforge.net) +window.tab.font: -*-lucidatypewriter-medium-r-normal-*-10-100-75-75-m-60-iso8859-1 + +window.justify: Right + +toolbar.font: -*-lucidatypewriter-medium-r-normal-*-10-100-75-75-m-60-iso8859-1 +window.font: -*-lucidatypewriter-medium-r-normal-*-10-100-75-75-m-60-iso8859-1 +menu.title.font: -*-lucidatypewriter-medium-r-normal-*-10-100-75-75-m-60-iso8859-1 +menu.frame.font: -*-lucida-medium-r-normal-*-10-100-*-*-*-*-iso8859-1 + +borderColor: rgb:10/10/10 + +bevelWidth: 1 +borderWidth: 1 +handleWidth: 2 + +rootCommand: bsetroot -mod 4 4 -bg rgb:9A/9A/9A -fg rgb:30/60/90 diff --git a/data/styles/Cthulhain b/data/styles/Cthulhain new file mode 100644 index 00000000..028662eb --- /dev/null +++ b/data/styles/Cthulhain @@ -0,0 +1,140 @@ +! Title: cthulhain +! By: cthulhain (http://lordzork.com/blackbox/ +! Email: cthulhain@lordzork.com +! Comment: no comment + +! ***** toolbar ***** +toolbar: raised gradient vertical + toolbar.color: #585858 + toolbar.colorTo: #0f1319 + +toolbar.label: parentrelative + toolbar.label.textColor: #cccccc + +toolbar.windowLabel: sunken gradient crossdiagonal + toolbar.windowLabel.color: #151a22 + toolbar.windowLabel.colorTo: #7a8290 + toolbar.windowLabel.textColor: #ffffff + +toolbar.clock: parentrelative + toolbar.clock.textColor: #cccccc + +toolbar.button: parentrelative + toolbar.button.picColor: #cccccc + +toolbar.button.pressed: flat gradient vertical + toolbar.button.pressed.color: #0f1319 + toolbar.button.pressed.colorTo: #7a8290 + + +! ***** menu ***** +menu.title: raised gradient crossdiagonal + menu.title.color: #151a22 + menu.title.colorTo: #7a8290 + menu.title.textColor: #ffffff + +menu.frame: sunken gradient crossdiagonal + menu.frame.color: #0f1319 + menu.frame.colorTo: gray40 + menu.frame.textColor: #cccccc + +menu.hilite: sunken gradient crossdiagonal + menu.hilite.color: #151a22 + menu.hilite.colorTo: #7a8290 + menu.hilite.textColor: #ffffff + +menu.bullet: triangle + menu.bullet.position: right + + +! ***** window focused ***** +window.title.focus: raised gradient diagonal + window.title.focus.color: gray40 + window.title.focus.colorTo: #0f1319 + +window.label.focus: sunken gradient crossdiagonal + window.label.focus.color: #151a22 + window.label.focus.colorTo: #7a8290 + window.label.focus.textColor: gray90 + +window.button.focus: parentrelative + window.button.focus.picColor: #cccccc + +window.button.pressed: flat gradient vertical + window.button.pressed.color: #0f1319 + window.button.pressed.colorTo: #7a8290 + +window.handle.focus: raised gradient diagonal + window.handle.focus.color: gray50 + window.handle.focus.colorTo: #0f1319 + +window.grip.focus: raised gradient diagonal + window.grip.focus.color: #7a8290 + window.grip.focus.colorTo: #151a22 + +window.frame.focusColor: #858585 +window.frame.focus.color: #858585 + + +! ***** window unfocused ***** +window.title.unfocus: raised gradient diagonal + window.title.unfocus.color: gray40 + window.title.unfocus.colorTo: #0f1319 + +window.label.unfocus: parentrelative + window.label.unfocus.textColor: #808080 + +window.button.unfocus: parentrelative + window.button.unfocus.picColor: #727272 + +window.handle.unfocus: raised gradient diagonal + window.handle.unfocus.color: gray50 + window.handle.unfocus.colorTo: #0f1319 + +window.grip.unfocus: raised gradient diagonal + window.grip.unfocus.color: gray50 + window.grip.unfocus.colorTo: #0f1319 + +window.frame.unfocusColor: #5e6166 +window.frame.unfocus.color: #5e6166 + + +! ***** fonts ***** +*.font: -*-lucida-medium-r-*-*-*-100-*-*-*-*-* + toolbar.justify: center + window.justify: right + menu.title.justify: center + menu.frame.justify: right + +! ***** the rest ***** +borderColor: #202020 +borderWidth: 1 +bevelWidth: 2 +handleWidth: 4 +frameWidth: 0 + +rootCommand: bsetbg -solid "#3a404b" + +! ***** bbpager ***** +bbpager.frame: sunken gradient crossdiagonal + bbpager.frame.color: #151a22 + bbpager.frame.colorTo: #7a8290 + +bbpager.desktop: parentrelative + +bbpager.desktop.focus: flat gradient vertical + bbpager.desktop.focus.color: #0f1319 + bbpager.desktop.focus.colorTo: gray40 + +bbpager.window: raised gradient vertical + bbpager.window.color: gray40 + bbpager.window.colorTo: #0f1319 + +bbpager.window.focus: raised gradient crossdiagonal + bbpager.window.focus.color: #151a22 + bbpager.window.focus.colorTo: #7a8290 + +bbpager.desktop.focusStyle: border +bbpager.active.window.borderColor: #202020 +bbpager.inactive.window.borderColor: #202020 +bbpager.active.desktop.borderColor: #0f1319 diff --git a/data/styles/Flux b/data/styles/Flux new file mode 100644 index 00000000..5bdca879 --- /dev/null +++ b/data/styles/Flux @@ -0,0 +1,91 @@ +toolbar: flat solid +toolbar.color: rgb:6/6/54 +toolbar.button: flat solid +toolbar.button.color: rgb:6/6/54 +toolbar.button.picColor: rgb:2/2/1c +toolbar.label: flat crossdiagonal gradient +toolbar.label.color: rgb:8/8/7 +toolbar.label.colorTo: rgb:f/f/d +toolbar.label.textColor: rgb:2/2/1c +toolbar.windowLabel: flat crossdiagonal gradient +toolbar.windowLabel.color: rgb:8/8/7 +toolbar.windowLabel.colorTo: rgb:f/f/d +toolbar.windowLabel.textColor: rgb:2/2/1c +toolbar.clock: flat crossdiagonal gradient +toolbar.clock.color: rgb:8/8/7 +toolbar.clock.colorTo: rgb:f/f/d +toolbar.clock.textColor: rgb:2/2/1c +toolbar.justify: right +toolbar.font: lucidasans-10 + +menu.title: flat crossdiagonal gradient +menu.title.color: rgb:8/8/7 +menu.title.colorTo: rgb:f/f/d +menu.title.textColor: rgb:2/2/1c +menu.title.font: lucidasans-10 +menu.title.justify: right + +menu.frame: flat solid +menu.frame.color: rgb:6/6/54 +menu.frame.textColor: grey85 +menu.frame.disableColor: rgb:4/4/38 +menu.frame.font: lucidasans-10 +menu.frame.justify: center + +menu.bullet.position: right +menu.bullet: triangle + +menu.hilite: flat solid +menu.hilite.color: rgb:4/4/38 +menu.hilite.textColor: white + +window.title.focus: flat solid +window.title.focus.color: rgb:6/6/54 +window.title.unfocus: flat solid +window.title.unfocus.color: rgb:4/4/38 + +window.label.focus: flat crossdiagonal gradient +window.label.focus.color: rgb:8/8/7 +window.label.focus.colorTo: rgb:f/f/d +window.label.focus.textColor: rgb:2/2/1c +window.label.unfocus: flat solid +window.label.unfocus.color: rgb:4/4/38 +window.label.unfocus.textColor: rgb:2/2/1c + +window.button.focus: flat solid +window.button.focus.color: rgb:6/6/54 +window.button.focus.picColor: rgb:2/2/1c +window.button.unfocus: flat solid +window.button.unfocus.color: rgb:4/4/38 +window.button.unfocus.picColor: rgb:2/2/1c + +window.handle.focus: flat crossdiagonal gradient +window.handle.focus.color: rgb:8/8/7 +window.handle.focus.colorTo: rgb:f/f/d +window.handle.unfocus: flat solid +window.handle.unfocus.color: rgb:4/4/38 + +window.grip.focus: flat solid +window.grip.focus.color: rgb:8/8/7 +window.grip.unfocus: flat solid +window.grip.unfocus.color: rgb:4/4/38 + +window.frame.focusColor: rgb:f/f/d +window.frame.unfocusColor: rgb:6/6/54 + +window.font: lucidasans-10 +window.justify: right + +*button.pressed: flat solid +*button.pressed.color: rgb:a/a/8c + +borderColor: rgb:2/2/1c + +bevelWidth: 2 +borderWidth: 2 +handleWidth: 3 + +*textColor: grey20 +*Font: lucidasans-10 + +rootCommand: bsetroot -solid rgb:4/4/38 diff --git a/data/styles/Makefile.am b/data/styles/Makefile.am new file mode 100644 index 00000000..61ae0e04 --- /dev/null +++ b/data/styles/Makefile.am @@ -0,0 +1,12 @@ +# data/styles/Makefile.am for Blackbox 0.61.x - an X11 Window manager + +styledir = $(pkgdatadir)/styles +MAINTAINERCLEANFILES = Makefile.in + +style_DATA = Makro MerleyKay Clean CleanColor Artwiz Cthulhain Flux Minimal Nyz Operation Outcomes Rampage Rancor Results Shade Spiff TDF Twice Blue Carbondioxide qnx-photon +EXTRA_DIST=$(style_DATA) + +uninstall-local: + rmdir $(styledir) +distclean-local: + rm -f *\~ diff --git a/data/styles/Makefile.in b/data/styles/Makefile.in new file mode 100644 index 00000000..8e3e3f47 --- /dev/null +++ b/data/styles/Makefile.in @@ -0,0 +1,224 @@ +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# data/styles/Makefile.am for Blackbox 0.61.x - an X11 Window manager + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = ../.. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +AS = @AS@ +CC = @CC@ +CXX = @CXX@ +DEBUG = @DEBUG@ +DLLTOOL = @DLLTOOL@ +GNOME = @GNOME@ +INTERLACE = @INTERLACE@ +KDE = @KDE@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +NEWWMSPEC = @NEWWMSPEC@ +NLS = @NLS@ +OBJDUMP = @OBJDUMP@ +ORDEREDPSEUDO = @ORDEREDPSEUDO@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +SHAPE = @SHAPE@ +SLIT = @SLIT@ +TIMEDCACHE = @TIMEDCACHE@ +VERSION = @VERSION@ +gencat_cmd = @gencat_cmd@ +regex_cmd = @regex_cmd@ + +styledir = $(pkgdatadir)/styles +MAINTAINERCLEANFILES = Makefile.in + +style_DATA = Makro MerleyKay Clean CleanColor Artwiz Cthulhain Flux Minimal Nyz Operation Outcomes Rampage Rancor Results Shade Spiff TDF Twice Blue Carbondioxide qnx-photon +EXTRA_DIST = $(style_DATA) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../../config.h +CONFIG_CLEAN_FILES = +DATA = $(style_DATA) + +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps data/styles/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +install-styleDATA: $(style_DATA) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(styledir) + @list='$(style_DATA)'; for p in $$list; do \ + if test -f $(srcdir)/$$p; then \ + echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(styledir)/$$p"; \ + $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(styledir)/$$p; \ + else if test -f $$p; then \ + echo " $(INSTALL_DATA) $$p $(DESTDIR)$(styledir)/$$p"; \ + $(INSTALL_DATA) $$p $(DESTDIR)$(styledir)/$$p; \ + fi; fi; \ + done + +uninstall-styleDATA: + @$(NORMAL_UNINSTALL) + list='$(style_DATA)'; for p in $$list; do \ + rm -f $(DESTDIR)$(styledir)/$$p; \ + done +tags: TAGS +TAGS: + + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = data/styles + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: install-styleDATA +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: uninstall-styleDATA uninstall-local +uninstall: uninstall-am +all-am: Makefile $(DATA) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + $(mkinstalldirs) $(DESTDIR)$(styledir) + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +mostlyclean-am: mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-generic clean-am distclean-local + -rm -f libtool + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: uninstall-styleDATA install-styleDATA tags distdir info-am info \ +dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ +install-exec install-data-am install-data install-am install \ +uninstall-local uninstall-am uninstall all-redirect all-am all \ +installdirs mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +uninstall-local: + rmdir $(styledir) +distclean-local: + rm -f *\~ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/data/styles/Makro b/data/styles/Makro new file mode 100644 index 00000000..4cdcf0d6 --- /dev/null +++ b/data/styles/Makro @@ -0,0 +1,116 @@ +# "Makro" +# A Fluxbox theme by: skypher of perplexity +# 2001 + +toolbar: Gradient Vertical Sunken +toolbar.color: rgb:CC/CC/AA + +toolbar.button: Flat Solid +toolbar.button.color: rgb:AB/90/40 +toolbar.button.picColor: rgb:50/30/10 + +toolbar.button.pressed: Sunken Flat +toolbar.button.pressed.color: rgb:90/70/20 + +toolbar.clock: Flat +toolbar.clock.color: rgb:AB/90/40 +toolbar.clock.textColor: rgb:40/20/05 + +toolbar.label: Flat +toolbar.label.color: rgb:AB/90/40 +toolbar.label.textColor: rgb:40/20/05 + +toolbar.windowLabel: Flat +toolbar.windowLabel.color: rgb:AB/90/40 +toolbar.windowLabel.textColor: rgb:40/20/05 + +toolbar.justify: Left + +menu.title: Raised Flat +menu.title.color: rgb:AB/90/40 +menu.title.textColor: rgb:40/20/05 +menu.title.justify: Left + +menu.frame: Gradient PipeCross +menu.frame.color: rgb:CC/CC/AA +menu.frame.colorTo: rgb:AB/AA/90 +menu.frame.textColor: rgb:10/10/01 +menu.frame.justify: Right + +menu.hilite: Flat +menu.hilite.color: rgb:DF/CF/BF +menu.hilite.textColor: rgb:00/00/00 + +menu.bullet: Square +menu.bullet.position: Right + + +window.title.focus: Gradient Vertical Sunken +window.title.focus.color: rgb:CC/CC/AA + +window.title.unfocus: Gradient Vertical Sunken +window.title.unfocus.color: rgb:AC/AC/90 + +window.label.focus: Solid Flat +window.label.focus.color: rgb:AB/90/40 +window.label.focus.textColor: rgb:40/20/05 + +window.label.unfocus: Flat Solid +window.label.unfocus.color: rgb:AA/80/30 +window.label.unfocus.textColor: rgb:45/25/10 + +window.button.focus: Flat Solid +window.button.focus.color: rgb:AC/99/50 +window.button.focus.picColor: rgb:40/20/05 + +window.button.unfocus: Flat Solid +window.button.unfocus.color: rgb:AA/80/30 +window.button.unfocus.picColor: rgb:45/25/10 + +window.button.pressed: Sunken Solid +window.button.pressed.color: rgb:90/70/20 + +window.frame.focus: Flat +window.frame.focus.color: rgb:00/00/00 +window.frame.unfocus: Flat +window.frame.unfocus.color: rgb:10/10/10 + +window.handle.focus: Sunken Solid +window.handle.focus.color: rgb:AC/99/50 +window.handle.unfocus: Flat Solid +window.handle.unfocus.color: rgb:AA/80/30 + +window.grip.focus: Sunken Gradient Diagonal Interlaced +window.grip.focus.color: rgb:AC/99/50 +window.grip.focus.colorTo: rgb:AA/80/30 +window.grip.unfocus: Raised Gradient Diagonal +window.grip.unfocus.color: rgb:AA/80/30 +window.grip.unfocus.colorTo: rgb:AC/99/50 + +! ----------- tab - explicit for fluxbox, the best wm out there[tm] (; +window.tab.justify: Center +window.tab.label.unfocus: Flat Solid +window.tab.label.unfocus.color: rgb:AA/80/30 +window.tab.label.unfocus.textColor: rgb:45/25/10 +window.tab.label.focus: Solid Flat +window.tab.label.focus.color: rgb:AB/90/40 +window.tab.label.focus.textColor: rgb:40/20/05 +window.tab.borderWidth: 1 +window.tab.borderColor: rgb:10/10/10 +! ----------- (fluxbox.sourceforge.net) +window.tab.font: -*-helvetica-medium-r-*-*-11-*-*-*-*-*-iso8859-1 + +window.justify: Left + +toolbar.font: -*-helvetica-medium-r-*-*-11-*-*-*-*-*-iso8859-1 +window.font: -*-helvetica-bold-r-*-*-11-*-*-*-*-*-iso8859-1 +menu.title.font: -*-helvetica-bold-r-*-*-11-*-*-*-*-*-iso8859-1 +menu.frame.font: -*-helvetica-medium-r-*-*-10-*-*-*-*-*-iso8859-1 + +borderColor: rgb:10/10/10 + +bevelWidth: 2 +borderWidth: 1 +handleWidth: 3 + +rootCommand: bsetroot -solid rgb:9A/9A/90 diff --git a/data/styles/MerleyKay b/data/styles/MerleyKay new file mode 100644 index 00000000..2c5a22d1 --- /dev/null +++ b/data/styles/MerleyKay @@ -0,0 +1,134 @@ +# Merely Kay +# A Fluxbox theme by: skypher of perplexity +# 2001 +# (Not created from scratch, basicly a modification of "Simple Elegance" +# by Pax, thanks!) +# update: added *.tab.* stuff to make fluxbox look real cool :) + +toolbar: Raised Gradient Veritcal +toolbar.color: rgb:62/70/85 +toolbar.colorTo: rgb:56/66/75 + +toolbar.button: Raised Gradient Horizontal Interlaced +toolbar.button.color: rgb:62/70/85 +toolbar.button.colorTo: rgb:56/66/75 +toolbar.button.picColor: rgb:FF/FF/FF + +toolbar.button.pressed: Sunken Gradient Horizontal +toolbar.button.pressed.color: rgb:42/50/65 +toolbar.button.pressed.colorTo: rgb:36/46/55 + +toolbar.clock: Sunken Gradient Vertical Interlaced +toolbar.clock.color: rgb:62/70/85 +toolbar.clock.colorTo: rgb:56/66/75 +toolbar.clock.textColor: rgb:FF/FF/FF + +toolbar.label: Sunken Gradient Vertical Interlaced +toolbar.label.color: rgb:62/70/85 +toolbar.label.colorTo: rgb:56/66/75 +toolbar.label.textColor: rgb:FF/FF/FF + +toolbar.windowLabel: Raised Gradient Vertical Interlaced +toolbar.windowLabel.color: rgb:62/70/85 +toolbar.windowLabel.colorTo: rgb:56/66/75 +toolbar.windowLabel.textColor: rgb:FF/FF/FF + +toolbar.justify: center + +menu.title: Raised Gradient Horizontal Interlaced +menu.title.color: rgb:62/66/70 +menu.title.colorTo: rgb:56/60/68 +menu.title.textColor: rgb:E9/E9/E9 +menu.title.justify: Center + +menu.frame: Sunken Gradient PipeCross +menu.frame.color: rgb:62/70/85 +menu.frame.colorTo: rgb:56/66/75 +menu.frame.textColor: rgb:E2/E2/E2 +menu.frame.justify: Left + +menu.hilite: Raised Gradient PipeCross +menu.hilite.color: rgb:50/50/50 +menu.hilite.colorTo: rgb:42/42/42 +menu.hilite.textColor: rgb:FF/FF/FF + +menu.bullet: Triangle +menu.bullet.position: Right + +window.title.focus: Raised Gradient Vertical Interlaced +window.title.focus.color: rgb:62/70/85 +window.title.focus.colorTo: rgb:56/66/75 +window.title.unfocus: Raised Gradient Vertical +window.title.unfocus.color: rgb:60/66/70 +window.title.unfocus.colorTo: rgb:54/60/68 + +window.label.focus: Flat Gradient Vertical Interlaced +window.label.focus.color: rgb:62/70/85 +window.label.focus.colorTo: rgb:56/66/75 +window.label.focus.textColor: rgb:FF/FF/FF +window.label.unfocus: Flat Gradient Vertical +window.label.unfocus.color: rgb:60/66/70 +window.label.unfocus.colorTo: rgb:54/60/68 +window.label.unfocus.textColor: rgb:C1/C1/C1 + +window.button.focus: Raised Gradient Diagonal Bevel1 +window.button.focus.color: rgb:9B/9B/9B +window.button.focus.colorTo: rgb:42/42/42 +window.button.focus.picColor: rgb:E2/E2/E2 +window.button.unfocus: Raised Gradient Diagonal Bevel1 +window.button.unfocus.color: rgb:9B/9B/9B +window.button.unfocus.colorTo: rgb:42/42/42 +window.button.unfocus.picColor: rgb:C1/C1/C1 +window.button.pressed: Sunken Gradient Diagonal Bevel1 +window.button.pressed.color: rgb:9B/9B/9B +window.button.pressed.colorTo: rgb:42/42/42 + +window.frame.focus: Sunken +window.frame.focus.color: rgb:87/99/9F +window.frame.unfocus: Sunken +window.frame.unfocus.color: rgb:87/99/9F + +window.handle.focus: Raised Gradient Diagonal +window.handle.focus.color: rgb:62/70/85 +window.handle.focus.colorTo: rgb:56/66/75 +window.handle.unfocus: Raised Gradient Diagonal +window.handle.unfocus.color: rgb:60/66/70 +window.handle.unfocus.colorTo: rgb:54/60/68 + +window.grip.focus: Raised Gradient Diagonal Interlaced +window.grip.focus.color: rgb:9B/9B/9B +window.grip.focus.colorTo: rgb:42/42/42 +window.grip.unfocus: Raised Gradient Diagonal +window.grip.unfocus.color: rgb:9B/9B/9B +window.grip.unfocus.colorTo: rgb:42/42/42 + +! ----------- tab - explicit for fluxbox, the best wm out there[tm] (; +window.tab.justify: Left +window.tab.label.unfocus: Sunken Gradient Vertical +window.tab.label.unfocus.color: rgb:50/50/50 +window.tab.label.unfocus.colorTo: rgb:54/60/68 +window.tab.label.unfocus.textColor: rgb:AA/AA/AA +window.tab.label.focus: Raised Gradient Vertical +window.tab.label.focus.color: rgb:62/70/85 +window.tab.label.focus.colorTo: rgb:556/66/75 +window.tab.label.focus.textColor: #FFFFFF +window.tab.borderWidth: 2 +window.tab.borderColor: black +! ----------- (fluxbox.sourceforge.net) + +window.justify: Center + +window.tab.font: -*-clean-medium-r-*-*-12-*-*-*-*-60-iso8859-* +toolbar.font: -*-lucida-bold-r-*-*-*-100-*-*-*-*-*-* +window.font: -*-helvetica-medium-r-normal-*-12-*-*-*-*-*-iso8859-1 +#menu.title.font: -*-lucida-bold-r-*-*-*-100-*-*-*-*-*-* +menu.title.font: -*-lucida-bold-r-*-*-*-100-*-*-*-*-*-* +menu.frame.font: -*-lucida-medium-r-*-*-*-100-*-*-*-*-*-* + +borderColor: rgb:00/00/00 + +bevelWidth: 2 +borderWidth: 2 +handleWidth: 3 + +rootCommand: bsetroot -mod 5 5 -fg rgb:62/70/85 -bg rgb:52/60/75 diff --git a/data/styles/Minimal b/data/styles/Minimal new file mode 100644 index 00000000..ca0d2c1a --- /dev/null +++ b/data/styles/Minimal @@ -0,0 +1,79 @@ +! Minimal (c) 2000 Jeff Raven +! Blackbox window manager resource defaults, with an +! eye towards consuming as little of an 8-bit palette +! as possible. As an additional bonus, with the changes +! as of Blackbox 0.60.3, it should also use very little +! memory. + +toolbar: Flat Solid +toolbar.color: MidnightBlue + +toolbar.clock: ParentRelative +toolbar.label: ParentRelative +toolbar.windowLabel: ParentRelative + +toolbar.button: ParentRelative +toolbar.button.pressed: Flat Solid +toolbar.button.pressed.color: SteelBlue +toolbar.button*picColor: White + +toolbar.textColor: White +toolbar.justify: center + +window.title.focus: Flat Solid +window.title.focus.color: SteelBlue +window.title.unfocus: Flat Solid +window.title.unfocus.color: MidnightBlue + +window.label.focus: ParentRelative +window.label.focus.textColor: White +window.label.unfocus: ParentRelative +window.label.unfocus.textColor: Grey + +window.button.focus: ParentRelative +window.button.focus.picColor: White +window.button.unfocus: ParentRelative +window.button.unfocus.picColor: Grey +window.button.pressed: ParentRelative + +window.handle.focus: Flat Solid +window.handle.focus.color: SteelBlue +window.handle.unfocus: Flat Solid +window.handle.unfocus.color: MidnightBlue + +window.grip.focus: Flat Solid +window.grip.unfocus: Flat Solid +window.grip*color: Grey + +window.frame.focusColor: SteelBlue +window.frame.unfocusColor: MidnightBlue + +window.justify: center + +menu.title: Flat Solid +menu.frame: Flat Solid +menu.hilite: Flat Solid + +menu.title.color: Black +menu.title.textColor: White +menu.title.justify: center + +menu.frame.color: MidnightBlue +menu.frame.textColor: White +menu.frame.justify: left + +menu.hilite.color: White +menu.hilite.textColor: Black + +menu.bullet: Triangle +menu.bullet.position: Right + +borderColor: Black + +bevelWidth: 1 +borderWidth: 1 +handleWidth: 4 + +*Font: -*-helvetica-*-r-*-*-12-*-*-*-*-*-*-* + +rootCommand: bsetroot -solid SlateGrey diff --git a/data/styles/Nyz b/data/styles/Nyz new file mode 100644 index 00000000..97794409 --- /dev/null +++ b/data/styles/Nyz @@ -0,0 +1,103 @@ +toolbar: flat diagonal gradient +toolbar.color: rgb:6/9/c +toolbar.colorTo: rgb:4/6/8 +toolbar.button: flat diagonal gradient +toolbar.button.color: rgb:3/48/6 +toolbar.button.colorTo: rgb:5/78/a +toolbar.button.picColor: rgb:1/18/2 +toolbar.button.pressed: flat crossdiagonal gradient +toolbar.button.pressed.color: grey40 +toolbar.button.pressed.colorTo: grey20 +toolbar.label: flat crossdiagonal gradient +toolbar.label.color: grey40 +toolbar.label.colorTo: grey20 +toolbar.label.textColor: grey85 +toolbar.windowLabel: flat crossdiagonal gradient +toolbar.windowLabel.color: grey40 +toolbar.windowLabel.colorTo: grey20 +toolbar.windowLabel.textColor: grey85 +toolbar.clock: flat crossdiagonal gradient +toolbar.clock.color: grey40 +toolbar.clock.colorTo: grey20 +toolbar.clock.textColor: grey85 +toolbar.justify: right +toolbar.font: lucidasans-10 + +menu.title: flat crossdiagonal gradient +menu.title.color: rgb:6/9/c +menu.title.colorTo: rgb:3/48/6 +menu.title.textColor: white +menu.title.font: lucidasans-10 +menu.title.justify: right + +menu.frame: flat crossdiagonal gradient +menu.frame.color: grey40 +menu.frame.colorTo: grey20 +menu.frame.textColor: grey85 +menu.frame.disableColor: rgb:4/4/38 +menu.frame.font: lucidasans-10 +menu.frame.justify: center + +menu.bullet.position: right +menu.bullet: triangle + +menu.hilite: flat crossdiagonal gradient +menu.hilite.color: rgb:6/9/c +menu.hilite.colorTo: rgb:3/48/6 +menu.hilite.textColor: white + +window.title.focus: flat diagonal gradient +window.title.focus.color: rgb:6/9/c +window.title.focus.colorTo: rgb:4/6/8 +window.title.unfocus: flat solid +window.title.unfocus.color: grey30 + +window.label.focus: flat crossdiagonal gradient +window.label.focus.color: grey40 +window.label.focus.colorTo: grey20 +window.label.focus.textColor: white +window.label.unfocus: flat crossdiagonal gradient +window.label.unfocus.color: grey30 +window.label.unfocus.colorTo: grey20 +window.label.unfocus.textColor: grey60 + +window.button.focus: flat diagonal gradient +window.button.focus.color: rgb:4/6/8 +window.button.focus.colorTo: rgb:5/78/a +window.button.focus.picColor: rgb:1/18/2 +window.button.unfocus: flat solid +window.button.unfocus.color: grey30 +window.button.unfocus.picColor: grey20 +window.button.pressed: flat crossdiagonal gradient +window.button.pressed.color: grey40 +window.button.pressed.colorTo: grey20 + +window.handle.focus: flat crossdiagonal gradient +window.handle.focus.color: rgb:6/9/c +window.handle.focus.colorTo: rgb:3/48/6 +window.handle.unfocus: flat solid +window.handle.unfocus.color: grey30 + +window.grip.focus: flat crossdiagonal gradient +window.grip.focus.color: grey40 +window.grip.focus.colorTo: grey20 +window.grip.unfocus: flat crossdiagonal gradient +window.grip.unfocus.color: grey30 +window.grip.unfocus.colorTo: grey20 + +window.frame.focusColor: rgb:6/9/c +window.frame.unfocusColor: grey30 + +window.font: lucidasans-10 +window.justify: right + +borderColor: grey10 + +bevelWidth: 1 +borderWidth: 2 +handleWidth: 4 + +*textColor: grey85 +*Font: lucidasans-10 + +rootCommand: bsetroot -solid grey20 diff --git a/data/styles/Operation b/data/styles/Operation new file mode 100644 index 00000000..03d16ec6 --- /dev/null +++ b/data/styles/Operation @@ -0,0 +1,91 @@ +toolbar: flat crossdiagonal gradient +toolbar.color: rgb:6/9/c +toolbar.colorTo: rgb:4/6/8 +toolbar.button: parentrelative +toolbar.button.picColor: grey85 +toolbar.button.pressed: flat crossdiagonal gradient +toolbar.button.pressed.color: grey50 +toolbar.button.pressed.colorTo: grey80 +toolbar.label: parentrelative +toolbar.label.textColor: grey85 +toolbar.windowLabel: parentrelative +toolbar.windowLabel.textColor: grey85 +toolbar.clock: parentrelative +toolbar.clock.textColor: grey85 +toolbar.justify: right +toolbar.font: lucidasans-10 + +menu.title: flat crossdiagonal gradient +menu.title.color: rgb:6/9/c +menu.title.colorTo: rgb:3/48/6 +menu.title.textColor: white +menu.title.font: lucidasans-10 +menu.title.justify: right + +menu.frame: flat crossdiagonal gradient +menu.frame.color: grey50 +menu.frame.colorTo: grey80 +menu.frame.textColor: grey20 +menu.frame.disableColor: grey40 +menu.frame.font: lucidasans-10 +menu.frame.justify: center + +menu.bullet.position: right +menu.bullet: triangle + +menu.hilite: flat crossdiagonal gradient +menu.hilite.color: rgb:6/9/c +menu.hilite.colorTo: rgb:3/48/6 +menu.hilite.textColor: white + +window.title.focus: flat crossdiagonal gradient +window.title.focus.color: rgb:6/9/c +window.title.focus.colorTo: rgb:3/48/6 +window.title.unfocus: flat diagonal gradient +window.title.unfocus.color: grey50 +window.title.unfocus.colorTo: grey20 + +window.label.focus: parentrelative +window.label.focus.textColor: white +window.label.unfocus: parentrelative +window.label.unfocus.textColor: grey60 + +window.button.focus: parentrelative +window.button.focus.picColor: grey85 +window.button.unfocus: parentrelative +window.button.unfocus.picColor: grey60 +window.button.pressed: flat crossdiagonal gradient +window.button.pressed.color: grey50 +window.button.pressed.colorTo: grey80 + +window.handle.focus: flat crossdiagonal gradient +window.handle.focus.color: rgb:6/9/c +window.handle.focus.colorTo: rgb:3/48/6 +window.handle.unfocus: flat diagonal gradient +window.handle.unfocus.color: grey50 +window.handle.unfocus.colorTo: grey20 + +window.grip.focus: parentrelative +window.grip.unfocus: parentrelative + +window.frame.focusColor: rgb:6/9/c +window.frame.unfocusColor: grey50 + +window.font: lucidasans-10 +window.justify: right + +borderColor: rgb:2/3/4 + +bevelWidth: 1 +borderWidth: 1 +handleWidth: 4 + +*textColor: grey85 +*Font: lucidasans-10 + +rootCommand: bsetroot -gradient flatcrossdiagonalgradient -from rgb:4/6/8 -to rgb:3/48/6 + +bbpager.desktop.focus: flat interlaced crossdiagonal gradient +bbpager.desktop.focus.color: rgb:6/9/c +bbpager.desktop.focus.colorTo: rgb:3/48/6 + diff --git a/data/styles/Outcomes b/data/styles/Outcomes new file mode 100644 index 00000000..94838148 --- /dev/null +++ b/data/styles/Outcomes @@ -0,0 +1,114 @@ +toolbar: raised diagonal gradient bevel1 +toolbar.color: rgb:7/8/8 +toolbar.colorTo: grey20 + +toolbar.button: raised diagonal gradient bevel1 +toolbar.button.color: grey +toolbar.button.colorTo: grey20 +toolbar.button.picColor: black +toolbar.button.pressed: sunken diagonal interlaced gradient bevel1 +toolbar.button.pressed.color: rgb:38/4/4 +toolbar.button.pressed.colorTo: rgb:d/f/f + +toolbar.label: flat interlaced diagonal gradient +toolbar.label.color: grey20 +toolbar.label.colorTo: rgb:7/8/8 +toolbar.label.textColor: grey85 + +toolbar.windowLabel: flat interlaced diagonal gradient +toolbar.windowLabel.color: grey20 +toolbar.windowLabel.colorTo: rgb:7/8/8 +toolbar.windowLabel.textColor: grey85 + +toolbar.clock: flat interlaced diagonal gradient +toolbar.clock.color: grey20 +toolbar.clock.colorTo: rgb:7/8/8 +toolbar.clock.textColor: grey85 + +toolbar.justify: center +toolbar.font: lucidasans-bold-10 + +menu.title: raised diagonal interlaced gradient bevel1 +menu.title.color: grey20 +menu.title.colorTo: rgb:7/8/8 +menu.title.textColor: grey85 +menu.title.font: lucidasans-bold-10 +menu.title.justify: center + +menu.frame: raised diagonal gradient bevel1 +menu.frame.color: rgb:7/8/8 +menu.frame.colorTo: grey10 +menu.frame.textColor: white +menu.frame.disableColor: rgb:38/4/4 +menu.frame.font: lucidasans-10 +menu.frame.justify: center + +menu.bullet: triangle +menu.bullet.position: right + +menu.hilite: raised diagonal gradient bevel1 +menu.hilite.color: grey60 +menu.hilite.colorTo: white +menu.hilite.textColor: grey20 + +window.title.focus: raised diagonal gradient bevel1 +window.title.focus.color: rgb:7/8/8 +window.title.focus.colorTo: grey20 +window.title.unfocus: raised diagonal gradient bevel1 +window.title.unfocus.color: rgb:54/6/6 +window.title.unfocus.colorTo: grey20 + +window.label.focus: interlaced sunken diagonal gradient bevel1 +window.label.focus.color: grey20 +window.label.focus.colorTo: grey +window.label.focus.textColor: white +window.label.unfocus: interlaced flat gradient +window.label.unfocus.color: grey20 +window.label.unfocus.colorTo: rgb:54/6/6 +window.label.unfocus.textColor: grey + +window.handle.focus: raised diagonal gradient bevel1 +window.handle.focus.color: rgb:7/8/8 +window.handle.focus.colorTo: grey20 +window.handle.unfocus: raised diagonal gradient bevel1 +window.handle.unfocus.color: rgb:54/6/6 +window.handle.unfocus.colorTo: grey20 + +window.grip.focus: raised diagonal gradient bevel1 +window.grip.focus.color: grey +window.grip.focus.colorTo: grey20 +window.grip.unfocus: sunken diagonal gradient bevel1 +window.grip.unfocus.color: grey20 +window.grip.unfocus.colorTo: grey + + +window.button.focus: raised diagonal gradient bevel1 +window.button.focus.color: grey +window.button.focus.colorTo: grey20 +window.button.focus.picColor: black +window.button.unfocus: sunken diagonal gradient bevel1 +window.button.unfocus.color: grey20 +window.button.unfocus.colorTo: grey +window.button.unfocus.picColor: grey40 +window.button.pressed: flat diagonal interlaced gradient +window.button.pressed.color: rgb:38/4/4 +window.button.pressed.colorTo: rgb:d/f/f + +window.frame.focusColor: grey85 +window.frame.unfocusColor: rgb:54/6/6 + +window.font: lucidasans-bold-10 +window.justify: center + +! misc... +borderColor: rgb:1c/2/2 + +borderWidth: 1 +bevelWidth: 2 +handleWidth: 4 + +rootCommand: bsetroot -mod 4 4 -fg rgb:54/6/6 -bg grey20 + +! for the bbtools +menuFont: lucidasans-10 +titleFont: lucidasans-bold-10 diff --git a/data/styles/Rampage b/data/styles/Rampage new file mode 100644 index 00000000..056aea74 --- /dev/null +++ b/data/styles/Rampage @@ -0,0 +1,102 @@ + +toolbar: sunken +toolbar.color: grey68 + +toolbar.button: flat +toolbar.button.color: grey68 +toolbar.button.picColor: rgb:0/8/8 +toolbar.button.pressed: sunken +toolbar.button.pressed.color: rgb:c/c/c +toolbar.button.pressed.colorTo: rgb:8/8/8 + +toolbar.label: flat +toolbar.label.color: grey68 +toolbar.label.textColor: black + +toolbar.windowLabel: flat +toolbar.windowLabel.color: grey68 +toolbar.windowLabel.textColor: black + +toolbar.clock: flat +toolbar.clock.color: grey68 +toolbar.clock.textColor: black + +toolbar.justify: Left + +menu.title: Raised Diagonal Gradient Bevel1 +menu.title.color: rgb:b/b/b +menu.title.colorTo: rgb:1/9/9 +menu.title.textColor: black +menu.title.justify: center + +menu.frame: Raised Diagonal Gradient Bevel1 +menu.frame.color: rgb:b/b/b +menu.frame.colorTo: rgb:c/c/c +menu.frame.textColor: black +menu.frame.justify: center + +menu.hilite: Raised diagonal gradient bevel1 +menu.hilite.color: grey77 +menu.hilite.colorTo: grey74 +menu.hilite.textColor: rgb:0/8/8 + +menu.bullet: square +menu.bullet.position: right + +window.title.focus: sunken diagonal gradient bevel1 +window.title.focus.color: rgb:c/c/c +window.title.focus.colorTo: rgb:b/b/b +window.title.unfocus: sunken +window.title.unfocus.color: grey70 + +window.label.focus: Flat pyramid interlaced gradient +window.label.focus.color: rgb:c/c/c +window.label.focus.colorTo: rgb:b/b/b +window.label.focus.textColor: black +window.label.unfocus: flat +window.label.unfocus.color: grey70 +window.label.unfocus.textColor: black + +window.handle.focus: flat diagonal gradient bevel1 +window.handle.focus.color: rgb:c/c/c +window.handle.focus.colorTo: rgb:0/8/8 +window.handle.unfocus: raised pyramid gradient bevel1 +window.handle.unfocus.color: rgb:c/c/c +window.handle.unfocus.colorTo: rgb:0/8/8 + +window.grip.focus: flat diagonal interlaced gradient bevel1 +window.grip.focus.color: grey90 +window.grip.focus.colorTo: grey40 +window.grip.unfocus: flat diagonal gradient bevel1 +window.grip.unfocus.color: grey40 +window.grip.unfocus.colorTo: grey90 + +window.button.focus: sunken diagonal gradient bevel1 +window.button.focus.color: grey90 +window.button.focus.colorTo: grey40 +window.button.focus.picColor: grey20 + +window.button.unfocus: flat +window.button.unfocus.color: grey70 +window.button.unfocus.colorTo: grey70 +window.button.unfocus.picColor: grey70 + +window.button.pressed: sunken interlaced diagonal gradient bevel1 +window.button.pressed.color: rgb:38/4/4 +window.button.pressed.colorTo: rgb:d/f/f + +window.frame.focusColor: grey72 +window.frame.unfocusColor: grey72 + +window.justify: center + +borderColor: rgb:0/0/0 + +borderWidth: 1 +bevelWidth: 2 +handleWidth: 5 + +*font: -b&h-lucida-medium-r-normal-*-*-100-*-*-p-*-iso8859-1 +*textColor: black + +rootCommand: bsetroot -mod 16 8 -bg rgb:0/8/8 -fg rgb:0/9/9 diff --git a/data/styles/Rancor b/data/styles/Rancor new file mode 100644 index 00000000..4051d811 --- /dev/null +++ b/data/styles/Rancor @@ -0,0 +1,107 @@ +toolbar: flat solid +toolbar.color: #980806 + +toolbar.button: raised crossdiagonal gradient bevel2 +toolbar.button.color: #a8a6a6 +toolbar.button.colorTo: black +toolbar.button.picColor: white + +toolbar.button.pressed: flat solid +toolbar.button.pressed.color: grey20 + +toolbar.label: raised diagonal gradient bevel2 +toolbar.label.color: #a8a6a6 +toolbar.label.colorTo: black +toolbar.label.textColor: white + +toolbar.windowLabel: raised crossdiagonal gradient bevel2 +toolbar.windowLabel.color: #a8a6a6 +toolbar.windowLabel.colorTo: black +toolbar.windowLabel.textColor: white + +toolbar.clock: raised crossdiagonal gradient bevel2 +toolbar.clock.color: black +toolbar.clock.colorTo: #a8a6a6 +toolbar.clock.textColor: white + +toolbar.justify: center +toolbar.font: lucidasans-10 + +menu.title: raised crossdiagonal gradient +menu.title.color: #980806 +menu.title.colorTo: black +menu.title.textColor: white +menu.title.font: lucidasans-10 +menu.title.justify: right + +menu.frame: flat crossdiagonal gradient bevel2 +menu.frame.color: black +menu.frame.colorTo: #a8a6a6 +menu.frame.textColor: white +menu.frame.disableColor: grey20 +menu.frame.font: lucidasans-10 +menu.frame.justify: left + +menu.bullet.position: right +menu.bullet: round + +menu.hilite: raised crossdiagonal gradient bevel1 +menu.hilite.color: #a8a6a6 +menu.hilite.colorTo: black +menu.hilite.textColor: white + +window.title.focus: flat solid +window.title.focus.color: #980806 + +window.title.unfocus: flat solid +window.title.unfocus.color: black + +window.label.focus: raised crossdiagonal gradient bevel1 +window.label.focus.color: black +window.label.focus.colorTo: #a8a6a6 +window.label.focus.textColor: white + +window.label.unfocus: flat solid +window.label.unfocus.color: black +window.label.unfocus.textColor: grey60 + +window.button.focus: raised crossdiagonal gradient bevel2 +window.button.focus.color: #a8a6a6 +window.button.focus.colorTo: black +window.button.focus.picColor: white + +window.button.unfocus: flat solid +window.button.unfocus.color: black +window.button.unfocus.picColor: black +window.button.pressed: flat crossdiagonal gradient +window.button.pressed.color: grey40 +window.button.pressed.colorTo: grey20 + +window.handle.focus: raised crossdiagonal gradient +window.handle.focus.color: #980806 +window.handle.focus.colorTo: black +window.handle.unfocus: flat solid +window.handle.unfocus.color: black + +window.grip.focus: raised crossdiagonal gradient +window.grip.focus.color: #a8a6a6 +window.grip.focus.colorTo: black +window.grip.unfocus: flat solid +window.grip.unfocus.color: black + +window.frame.focusColor: #980806 +window.frame.unfocusColor: black + +window.font: lucidasans-10 +window.justify: center + +borderColor: black + +bevelWidth: 1 +borderWidth: 1 +handleWidth: 4 + +*textColor: white +*Font: lucidasans-10 + +rootCommand: bsetroot -gradient interlacedflatcrossdiagonalgradient -from rgb:4c/04/03 -to black diff --git a/data/styles/Results b/data/styles/Results new file mode 100644 index 00000000..bb5c9880 --- /dev/null +++ b/data/styles/Results @@ -0,0 +1,114 @@ +toolbar: raised diagonal gradient bevel1 +toolbar.color: rgb:8/8/7 +toolbar.colorTo: grey20 + +toolbar.button: raised diagonal gradient bevel1 +toolbar.button.color: grey +toolbar.button.colorTo: grey20 +toolbar.button.picColor: black +toolbar.button.pressed: sunken diagonal interlaced gradient bevel1 +toolbar.button.pressed.color: rgb:4/4/38 +toolbar.button.pressed.colorTo: rgb:f/f/d + +toolbar.label: flat interlaced diagonal gradient +toolbar.label.color: grey20 +toolbar.label.colorTo: rgb:8/8/7 +toolbar.label.textColor: grey85 + +toolbar.windowLabel: flat interlaced diagonal gradient +toolbar.windowLabel.color: grey20 +toolbar.windowLabel.colorTo: rgb:8/8/7 +toolbar.windowLabel.textColor: grey85 + +toolbar.clock: flat interlaced diagonal gradient +toolbar.clock.color: grey20 +toolbar.clock.colorTo: rgb:8/8/7 +toolbar.clock.textColor: grey85 + +toolbar.justify: center +toolbar.font: lucidasans-bold-10 + +menu.title: raised diagonal interlaced gradient bevel1 +menu.title.color: grey20 +menu.title.colorTo: rgb:8/8/7 +menu.title.textColor: grey85 +menu.title.font: lucidasans-bold-10 +menu.title.justify: center + +menu.frame: raised diagonal gradient bevel1 +menu.frame.color: rgb:8/8/7 +menu.frame.colorTo: grey10 +menu.frame.textColor: white +menu.frame.disableColor: rgb:4/4/38 +menu.frame.font: lucidasans-10 +menu.frame.justify: center + +menu.bullet: triangle +menu.bullet.position: right + +menu.hilite: raised diagonal gradient bevel1 +menu.hilite.color: grey60 +menu.hilite.colorTo: white +menu.hilite.textColor: grey20 + +window.title.focus: raised diagonal gradient bevel1 +window.title.focus.color: rgb:8/8/7 +window.title.focus.colorTo: grey20 +window.title.unfocus: raised diagonal gradient bevel1 +window.title.unfocus.color: rgb:6/6/54 +window.title.unfocus.colorTo: grey20 + +window.label.focus: interlaced sunken diagonal gradient bevel1 +window.label.focus.color: grey20 +window.label.focus.colorTo: grey +window.label.focus.textColor: white +window.label.unfocus: interlaced flat gradient +window.label.unfocus.color: grey20 +window.label.unfocus.colorTo: rgb:6/6/54 +window.label.unfocus.textColor: grey + +window.handle.focus: raised diagonal gradient bevel1 +window.handle.focus.color: rgb:8/8/7 +window.handle.focus.colorTo: grey20 +window.handle.unfocus: raised diagonal gradient bevel1 +window.handle.unfocus.color: rgb:6/6/54 +window.handle.unfocus.colorTo: grey20 + +window.grip.focus: raised diagonal gradient bevel1 +window.grip.focus.color: grey +window.grip.focus.colorTo: grey20 +window.grip.unfocus: sunken diagonal gradient bevel1 +window.grip.unfocus.color: grey20 +window.grip.unfocus.colorTo: grey + + +window.button.focus: raised diagonal gradient bevel1 +window.button.focus.color: grey +window.button.focus.colorTo: grey20 +window.button.focus.picColor: black +window.button.unfocus: sunken diagonal gradient bevel1 +window.button.unfocus.color: grey20 +window.button.unfocus.colorTo: grey +window.button.unfocus.picColor: grey40 +window.button.pressed: flat diagonal interlaced gradient +window.button.pressed.color: rgb:4/4/38 +window.button.pressed.colorTo: rgb:f/f/d + +window.frame.focusColor: grey85 +window.frame.unfocusColor: rgb:6/6/54 + +window.font: lucidasans-bold-10 +window.justify: center + +! misc... +borderColor: rgb:2/2/1c + +borderWidth: 1 +bevelWidth: 2 +handleWidth: 4 + +rootCommand: bsetroot -mod 4 4 -fg rgb:6/6/5c -bg grey20 + +! for the bbtools +menuFont: lucidasans-10 +titleFont: lucidasans-bold-10 diff --git a/data/styles/Shade b/data/styles/Shade new file mode 100644 index 00000000..36e39f56 --- /dev/null +++ b/data/styles/Shade @@ -0,0 +1,91 @@ +toolbar: flat solid +toolbar.color: rgb:6/6/6 +toolbar.button: flat solid +toolbar.button.color: rgb:6/6/6 +toolbar.button.picColor: rgb:2/2/2 +toolbar.label: flat crossdiagonal gradient +toolbar.label.color: rgb:8/8/7 +toolbar.label.colorTo: rgb:f/f/d +toolbar.label.textColor: rgb:2/2/1c +toolbar.windowLabel: flat crossdiagonal gradient +toolbar.windowLabel.color: rgb:8/8/7 +toolbar.windowLabel.colorTo: rgb:f/f/d +toolbar.windowLabel.textColor: rgb:2/2/1c +toolbar.clock: flat crossdiagonal gradient +toolbar.clock.color: rgb:8/8/7 +toolbar.clock.colorTo: rgb:f/f/d +toolbar.clock.textColor: rgb:2/2/1c +toolbar.justify: right +toolbar.font: lucidasans-10 + +menu.title: flat crossdiagonal gradient +menu.title.color: rgb:8/8/7 +menu.title.colorTo: rgb:f/f/d +menu.title.textColor: rgb:2/2/1c +menu.title.font: lucidasans-10 +menu.title.justify: right + +menu.frame: flat solid +menu.frame.color: rgb:6/6/6 +menu.frame.textColor: grey85 +menu.frame.disableColor: rgb:4/4/4 +menu.frame.font: lucidasans-10 +menu.frame.justify: center + +menu.bullet.position: right +menu.bullet: triangle + +menu.hilite: flat solid +menu.hilite.color: rgb:4/4/4 +menu.hilite.textColor: white + +window.title.focus: flat solid +window.title.focus.color: rgb:6/6/6 +window.title.unfocus: flat solid +window.title.unfocus.color: rgb:4/4/4 + +window.label.focus: flat crossdiagonal gradient +window.label.focus.color: rgb:8/8/7 +window.label.focus.colorTo: rgb:f/f/d +window.label.focus.textColor: rgb:2/2/1c +window.label.unfocus: flat solid +window.label.unfocus.color: rgb:4/4/4 +window.label.unfocus.textColor: rgb:2/2/2 + +window.button.focus: flat solid +window.button.focus.color: rgb:6/6/6 +window.button.focus.picColor: rgb:2/2/2 +window.button.unfocus: flat solid +window.button.unfocus.color: rgb:4/4/4 +window.button.unfocus.picColor: rgb:2/2/2 + +window.handle.focus: flat crossdiagonal gradient +window.handle.focus.color: rgb:8/8/7 +window.handle.focus.colorTo: rgb:f/f/d +window.handle.unfocus: flat solid +window.handle.unfocus.color: rgb:4/4/4 + +window.grip.focus: flat solid +window.grip.focus.color: rgb:8/8/8 +window.grip.unfocus: flat solid +window.grip.unfocus.color: rgb:4/4/4 + +window.frame.focusColor: rgb:f/f/d +window.frame.unfocusColor: rgb:6/6/6 + +window.font: lucidasans-10 +window.justify: right + +*button.pressed: flat solid +*button.pressed.color: rgb:a/a/8c + +borderColor: rgb:2/2/2 + +bevelWidth: 2 +borderWidth: 2 +handleWidth: 3 + +*textColor: grey20 +*Font: lucidasans-10 + +rootCommand: bsetroot -solid rgb:4/4/4 diff --git a/data/styles/Spiff b/data/styles/Spiff new file mode 100644 index 00000000..2b1f1405 --- /dev/null +++ b/data/styles/Spiff @@ -0,0 +1,109 @@ +toolbar: flat gradient vertical +toolbar.color: rgb:c0/c4/c8 +toolbar.colorTo: rgb:a0/a4/a8 + +toolbar.button: flat gradient vertical +toolbar.button.color: rgb:bc/c0/c4 +toolbar.button.colorTo: rgb:a4/a8/ac +toolbar.button.picColor: black + +toolbar.button.pressed: flat gradient diagonal +toolbar.button.pressed.color: rgb:60/64/68 +toolbar.button.pressed.colorTo: rgb:80/84/88 + +toolbar.clock: flat gradient horizontal interlaced +toolbar.clock.color: black +toolbar.clock.colorTo: rgb:70/70/88 +toolbar.clock.textColor: white + +toolbar.label: flat gradient horizontal interlaced +toolbar.label.color: black +toolbar.label.colorTo: rgb:70/70/88 +toolbar.label.textColor: white + +toolbar.windowLabel: flat gradient horizontal interlaced +toolbar.windowLabel.color: black +toolbar.windowLabel.colorTo: rgb:78/90/94 +toolbar.windowLabel.textColor: white + +toolbar.justify: center + + +menu.title: flat gradient horizontal interlaced +menu.title.color: black +menu.title.colorTo: rgb:78/90/94 +menu.title.textColor: white +menu.title.justify: left + +menu.frame: flat gradient diagonal +menu.frame.color: rgb:c0/c4/c8 +menu.frame.colorTo: rgb:70/74/78 +menu.frame.textColor: rgb:40/44/48 +menu.frame.justify: left + +menu.hilite: flat gradient horizontal interlaced +menu.hilite.color: black +menu.hilite.colorTo: rgb:70/70/88 +menu.hilite.textColor: white + +menu.bullet: empty +menu.bullet.position: left + + +window.title.focus: flat gradient vertical +window.title.focus.color: rgb:c0/c4/c8 +window.title.focus.colorTo: rgb:a0/a4/a8 +window.title.unfocus: flat gradient vertical +window.title.unfocus.color: rgb:a0/a4/a8 +window.title.unfocus.colorTo: rgb:80/84/88 + +window.label.focus: flat gradient horizontal interlaced +window.label.focus.color: black +window.label.focus.colorTo: rgb:78/90/94 +window.label.focus.textColor: white +window.label.unfocus: flat gradient horizontal interlaced +window.label.unfocus.color: black +window.label.unfocus.colorTo: rgb:60/60/78 +window.label.unfocus.textColor: rgb:a0/a4/a8 + +window.button.focus: flat gradient vertical +window.button.focus.color: rgb:bc/c0/c4 +window.button.focus.colorTo: rgb:a4/a8/ac +window.button.focus.picColor: black +window.button.unfocus: flat gradient vertical +window.button.unfocus.color: rgb:9c/a0/a4 +window.button.unfocus.colorTo: rgb:84/88/8c +window.button.unfocus.picColor: rgb:40/44/48 +window.button.pressed: flat gradient diagonal +window.button.pressed.color: rgb:60/64/68 +window.button.pressed.colorTo: rgb:80/84/88 + +window.frame.focusColor: rgb:90/94/98 +window.frame.unfocusColor: rgb:40/48/50 + +window.handle.focus: flat gradient diagonal +window.handle.focus.color: rgb:c0/c4/c8 +window.handle.focus.colorTo: rgb:a0/a4/a8 +window.handle.unfocus: flat gradient diagonal +window.handle.unfocus.color: rgb:a0/a4/a8 +window.handle.unfocus.colorTo: rgb:80/84/88 + +window.grip.focus: flat diagonal gradient +window.grip.focus.color: black +window.grip.focus.colorTo: rgb:78/90/94 +window.grip.unfocus: flat diagonal gradient +window.grip.unfocus.color: black +window.grip.unfocus.colorTo: rgb:60/60/78 + +window.justify: left + + +borderColor: black + +bevelWidth: 1 +borderWidth: 1 +handleWidth: 3 + +rootCommand: bsetroot -mod 2 2 -fg rgb:48/50/68 -bg rgb:50/58/70 + +*Font: lucidasans-10 diff --git a/data/styles/TDF b/data/styles/TDF new file mode 100644 index 00000000..d91fc2cf --- /dev/null +++ b/data/styles/TDF @@ -0,0 +1,115 @@ +! TarishedCopper.style +! by The Dixie Flatline. +! root image copyright(c)1999 propaganda.themes.org +! used w/o permission (for non-canned release) +! ---- +! You may only distribute this theme with the original +! root image or with the original blackbox source. +! ---- +! for Blackbox 0.60.x -ONLY- +! missing: slit border color + +toolbar: raised gradient bevel1 +toolbar.color: black +toolbar.colorTo: black +toolbar.label: Raised Gradient pipecross Bevel1 +toolbar.label.color: rgb:4e/38/32 +toolbar.label.colorTo: rgb:af/89/7c +toolbar.label.textColor: black +toolbar.windowLabel: Raised Gradient pyramid Bevel1 +toolbar.windowLabel.color: black +toolbar.windowLabel.colorTo: rgb:af/89/7c +toolbar.windowLabel.textColor: black +toolbar.clock: Raised Gradient pipecross bevel1 +toolbar.clock.color: rgb:4e/38/32 +toolbar.clock.colorTo: rgb:af/89/7c +toolbar.clock.textColor: black +toolbar.button: Raised gradient pipecross bevel1 +toolbar.button.color: rgb:4e/38/32 +toolbar.button.colorTo: rgb:af/89/7c +toolbar.button.picColor: black +toolbar.button.pressed: Flat Gradient Diagonal Bevel1 +toolbar.button.pressed.color: rgb:32/32/32 +toolbar.button.pressed.colorTo: rgb:82/6d/53 +toolbar.justify: center + +menu.title: Raised Gradient pipecross Bevel1 +menu.title.color: rgb:4e/38/32 +menu.title.colorTo: rgb:af/89/7c +menu.title.textColor: black +menu.title.justify: center +menu.frame: raised Gradient elliptic Bevel1 +menu.frame.color: black +menu.frame.colorTo: rgb:af/89/7c +menu.frame.textColor: black +menu.frame.justify: center +menu.hilite: sunken gradient crossdiagonal bevel1 +menu.hilite.color: rgb:4e/38/32 +menu.hilite.colorTo: rgb:af/89/7c +menu.hilite.textColor: rgb:ff/ff/ff +menu.bullet: empty +menu.bullet.position: right + +window.title.focus: Raised Gradient Diagonal bevel1 +window.title.focus.color: black +window.title.focus.colorTo: black +window.title.unfocus: Raised Gradient Diagonal bevel1 +window.title.unfocus.color: black +window.title.unfocus.colorTo: black + +window.label.focus: raised Gradient pyramid Bevel1 +window.label.focus.color: black +window.label.focus.colorTo: rgb:b3/8c/7f +window.label.focus.textColor: black + +window.label.unfocus: raised Gradient pyramid Bevel1 +window.label.unfocus.color: black +window.label.unfocus.colorTo: rgb:6c/54/4c +window.label.unfocus.textColor: black + +window.button.focus: Raised Gradient pipecross Bevel1 +window.button.focus.color: rgb:4e/38/32 +window.button.focus.colorTo: rgb:af/89/7c +window.button.focus.picColor: black +window.button.unfocus: raised gradient pyramid bevel2 +window.button.unfocus.color: black +window.button.unfocus.colorTo: rgb:6c/54/4c +window.button.unfocus.picColor: black +window.button.pressed: Flat Gradient Diagonal Bevel1 +window.button.pressed.color: rgb:32/32/32 +window.button.pressed.colorTo: rgb:82/6d/53 + +window.frame.focusColor: rgb:4e/38/32 +window.frame.unfocusColor: rgb:4c/36/30 + +window.handle.focus: raised Gradient pyramid Bevel2 +window.handle.focus.color: black +window.handle.focus.colorTo: rgb:af/89/7c +window.handle.unfocus: raised Gradient pyramid Bevel2 +window.handle.unfocus.color: black +window.handle.unfocus.colorTo: rgb:6c/54/4c + +window.grip.focus: raised gradient pipecross bevel1 +window.grip.focus.color: rgb:4e/38/32 +window.grip.focus.colorTo: rgb:af/89/7c +window.grip.unfocus: raised gradient pyramid bevel1 +window.grip.unfocus.color: black +window.grip.unfocus.colorTo: rgb:6c/54/4c + +borderWidth: 1 +bevelWidth: 1 +handleWidth: 5 +window.justify: CenterJustify + +toolbar.font: lucidasans-10 +menu.title.Font: lucidasans-10 +menu.frame.font: lucidasans-10 +window.font: lucidasans-10 +menuFont: lucidasans-10 +titleFont: lucidasans-10 + +borderColor: rgb:00/00/00 +rootCommand: bsetroot -gradient flatcrossdiagonalgradient -from black -to rgb:af/89/7c + +! fin + diff --git a/data/styles/Twice b/data/styles/Twice new file mode 100644 index 00000000..bbc58be9 --- /dev/null +++ b/data/styles/Twice @@ -0,0 +1,103 @@ +toolbar: flat diagonal gradient +toolbar.color: rgb:c/6/6 +toolbar.colorTo: rgb:8/4/4 +toolbar.button: flat diagonal gradient +toolbar.button.color: rgb:6/3/3 +toolbar.button.colorTo: rgb:a/5/5 +toolbar.button.picColor: rgb:4/2/2 +toolbar.button.pressed: flat crossdiagonal gradient +toolbar.button.pressed.color: grey40 +toolbar.button.pressed.colorTo: grey20 +toolbar.label: flat crossdiagonal gradient +toolbar.label.color: grey40 +toolbar.label.colorTo: grey20 +toolbar.label.textColor: grey85 +toolbar.windowLabel: flat crossdiagonal gradient +toolbar.windowLabel.color: grey40 +toolbar.windowLabel.colorTo: grey20 +toolbar.windowLabel.textColor: grey85 +toolbar.clock: flat crossdiagonal gradient +toolbar.clock.color: grey40 +toolbar.clock.colorTo: grey20 +toolbar.clock.textColor: grey85 +toolbar.justify: right +toolbar.font: lucidasans-10 + +menu.title: flat crossdiagonal gradient +menu.title.color: rgb:c/6/6 +menu.title.colorTo: rgb:6/3/3 +menu.title.textColor: white +menu.title.font: lucidasans-10 +menu.title.justify: right + +menu.frame: flat crossdiagonal gradient +menu.frame.color: grey40 +menu.frame.colorTo: grey20 +menu.frame.textColor: grey85 +menu.frame.disableColor: rgb:4/2/2 +menu.frame.font: lucidasans-10 +menu.frame.justify: center + +menu.bullet.position: right +menu.bullet: triangle + +menu.hilite: flat crossdiagonal gradient +menu.hilite.color: rgb:c/6/6 +menu.hilite.colorTo: rgb:6/3/3 +menu.hilite.textColor: white + +window.title.focus: flat diagonal gradient +window.title.focus.color: rgb:c/6/6 +window.title.focus.colorTo: rgb:8/4/4 +window.title.unfocus: flat solid +window.title.unfocus.color: grey30 + +window.label.focus: flat crossdiagonal gradient +window.label.focus.color: grey40 +window.label.focus.colorTo: grey20 +window.label.focus.textColor: white +window.label.unfocus: flat crossdiagonal gradient +window.label.unfocus.color: grey30 +window.label.unfocus.colorTo: grey20 +window.label.unfocus.textColor: grey60 + +window.button.focus: flat diagonal gradient +window.button.focus.color: rgb:8/4/4 +window.button.focus.colorTo: rgb:a/5/5 +window.button.focus.picColor: rgb:4/2/2 +window.button.unfocus: flat solid +window.button.unfocus.color: grey30 +window.button.unfocus.picColor: grey20 +window.button.pressed: flat crossdiagonal gradient +window.button.pressed.color: grey40 +window.button.pressed.colorTo: grey20 + +window.handle.focus: flat crossdiagonal gradient +window.handle.focus.color: rgb:c/6/6 +window.handle.focus.colorTo: rgb:6/3/3 +window.handle.unfocus: flat solid +window.handle.unfocus.color: grey30 + +window.grip.focus: flat crossdiagonal gradient +window.grip.focus.color: grey40 +window.grip.focus.colorTo: grey20 +window.grip.unfocus: flat crossdiagonal gradient +window.grip.unfocus.color: grey30 +window.grip.unfocus.colorTo: grey20 + +window.frame.focusColor: rgb:c/6/6 +window.frame.unfocusColor: grey30 + +window.font: lucidasans-10 +window.justify: right + +borderColor: grey10 + +bevelWidth: 1 +borderWidth: 2 +handleWidth: 4 + +*textColor: grey85 +*Font: lucidasans-10 + +rootCommand: bsetroot -solid grey20 diff --git a/data/styles/qnx-photon b/data/styles/qnx-photon new file mode 100644 index 00000000..bffb762d --- /dev/null +++ b/data/styles/qnx-photon @@ -0,0 +1,138 @@ +# photon-qnx +# theme for fluxbox +# 2001 (c) skypher + +toolbar: raised gradient vertical + toolbar.color: rgb:DB/DA/DB + toolbar.colorTo: rgb:D4/CE/D2 + +toolbar.label: flat gradient vertical + toolbar.label.color: rgb:DB/DA/DB + toolbar.label.colorTo: rgb:D4/CE/D2 + toolbar.label.textColor: rgb:45/45/45 + +toolbar.windowLabel: sunken solid + toolbar.windowLabel.color: rgb:FC/F9/DF + toolbar.windowLabel.textColor: rgb:45/45/45 + +toolbar.clock: flat gradient vertical + toolbar.clock.color: rgb:DB/DA/DB + toolbar.clock.colorTo: rgb:D4/CE/D2 + toolbar.clock.textColor: rgb:45/45/45 + +toolbar.button: solid flat + toolbar.button.color: rgb:EB/EB/EB + toolbar.button.picColor: rgb:15/15/15 + +toolbar.button.pressed: sunken flat + toolbar.button.pressed.color: rgb:AB/AB/AB + +menu.title: raised gradient vertical + menu.title.color: rgb:68/95/E3 + menu.title.colorTo: rgb:31/59/9C + menu.title.textColor: white + +menu.frame: sunken gradient vertical + menu.frame.color: rgb:DB/DA/DB + menu.frame.colorTo: rgb:D4/CE/D2 + menu.frame.textColor: rgb:45/45/45 + +menu.hilite: flat solid + menu.hilite.color: rgb:91/A3/9E + menu.hilite.textColor: white + +menu.bullet: triangle + menu.bullet.position: right + +! win focus +window.title.focus: flat gradient vertical + window.title.focus.color: rgb:D9/D9/D9 + window.title.focus.colorTo: white + +window.label.focus: raised gradient vertical + window.label.focus.color: rgb:68/95/E3 + window.label.focus.colorTo: rgb:31/59/9C + window.label.focus.textColor: white + +window.button.focus: raised gradient vertical + window.button.focus.color: rgb:EA/EA/EA + window.button.focus.colorTo: rgb:94/9B/99 + window.button.focus.picColor: rgb:35/35/35 + +window.button.pressed: sunken solid + window.button.pressed.color: rgb:94/9B/99 + +window.handle.focus: raised solid + window.handle.focus.color: rgb:EA/EA/EA + +window.grip.focus: Raised Gradient vertical + window.grip.focus.color: rgb:68/95/E3 + window.grip.focus.colorTo: rgb:31/59/9C + +window.frame.focusColor: black + + +! unfocused win +window.title.unfocus: flat gradient vertical + window.title.unfocus.color: rgb:D9/D9/D9 + window.title.unfocus.colorTo: white + + +window.label.unfocus: raised gradient vertical + window.label.unfocus.color: rgb:C6/C5/C6 + window.label.unfocus.colorTo: rgb:A7/A6/A7 + window.label.unfocus.textColor: white + +window.button.unfocus: raised gradient vertical + window.button.unfocus.color: rgb:EA/EA/EA + window.button.unfocus.colorTo: rgb:94/9B/99 + window.button.unfocus.picColor: rgb:35/35/35 + +window.handle.unfocus: raised solid + window.handle.unfocus.color: rgb:EA/EA/EA + +window.grip.unfocus: raised solid + window.grip.unfocus.color: rgb:EA/EA/EA + +window.frame.unfocusColor: black + +! ----------- tab - explicit for fluxbox, the best wm out there[tm] (; +window.tab.justify: left + +window.tab.label.unfocus: raised gradient vertical +window.tab.label.unfocus.color: rgb:C6/C5/C6 +window.tab.label.unfocus.colorTo: rgb:A7/A6/A7 +window.tab.label.unfocus.textColor: white + +window.tab.label.focus: raised gradient vertical +window.tab.label.focus.color: rgb:68/95/E3 +window.tab.label.focus.colorTo: rgb:31/59/9C +window.tab.label.focus.textColor: white + +window.tab.borderWidth: 1 +window.tab.borderColor: black +! ----------- (fluxbox.sourceforge.net) + +! fonts +window.tab.font: -*-gamow-medium-r-*-*-7-*-*-*-*-60-*-* +! ^ change this to lucidasans-10 if you don't have gamow + +toolbar.font: lucidasans-10 + toolbar.justify: left + +window.font: lucidasans-10 + window.justify: left + +menu.title.Font: lucidasans-10 + menu.title.justify: left + +menu.frame.font: lucidasans-10 + menu.frame.justify: left + +! borders n stuff +borderColor: black +borderWidth: 1 +bevelWidth: 2 +handleWidth: 4 +frameWidth: 0 +rootCommand: bsetbg -solid white diff --git a/data/titlebar b/data/titlebar new file mode 100644 index 00000000..f4e85e3a --- /dev/null +++ b/data/titlebar @@ -0,0 +1,2 @@ +Right: minimize maximize close +Left: sticky diff --git a/doc/Coding_style b/doc/Coding_style new file mode 100644 index 00000000..d0eba0d8 --- /dev/null +++ b/doc/Coding_style @@ -0,0 +1,45 @@ +The coding style is almost the same as i blackbox. +Instead of 2 spaces there is tab. +It might look strange now in some places, that is because +the code hasnt been "translated" to tab 100% yet. +Use a tab size of 2 and you will be fine. + +note if-statement: + + if ( stuff ) + function(stuff, more stuff, + more, even more); + else + morefunction( stuff, more stuff + stuff, + stuff, + stuff); + +if the functionline needs to be split up, like above, right after a if-statement +use { and }, so its clear when the if-statement ends. +It should look like this + + if ( stuff ) { + function(stuff, more stuff, + more, even more); + } else { + morefunction( stuff, more stuff + stuff, + stuff, + stuff); + } + +The includeguards: +_FILENAME_HH_ + + +Function comments: +//------------ function name -------- +// This do that and that +// Returns this on success else +// this on failure. +// TODO: if there is something to do. +//----------------------------------- +type classname::function(...) { + +} diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 00000000..dbc5e662 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,11 @@ +# doc/Makefile.am for Blackbox 0.61.x - an X11 Window manager + +CLEANFILES = fluxbox.1 +MAINTAINERCLEANFILES = Makefile.in +man_MANS = fluxbox.1 bsetroot.1 +EXTRA_DIST=fluxbox.1.in bsetroot.1 Coding_style +distclean-local: + rm -f *\~ + +fluxbox.1: fluxbox.1.in + @regex_cmd@ -e "s,@pkgdatadir@,$(pkgdatadir)," fluxbox.1.in > fluxbox.1 diff --git a/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 00000000..0fc570b4 --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,246 @@ +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# doc/Makefile.am for Blackbox 0.61.x - an X11 Window manager + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +AS = @AS@ +CC = @CC@ +CXX = @CXX@ +DEBUG = @DEBUG@ +DLLTOOL = @DLLTOOL@ +GNOME = @GNOME@ +INTERLACE = @INTERLACE@ +KDE = @KDE@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +NEWWMSPEC = @NEWWMSPEC@ +NLS = @NLS@ +OBJDUMP = @OBJDUMP@ +ORDEREDPSEUDO = @ORDEREDPSEUDO@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +SHAPE = @SHAPE@ +SLIT = @SLIT@ +TIMEDCACHE = @TIMEDCACHE@ +VERSION = @VERSION@ +gencat_cmd = @gencat_cmd@ +regex_cmd = @regex_cmd@ + +CLEANFILES = fluxbox.1 +MAINTAINERCLEANFILES = Makefile.in +man_MANS = fluxbox.1 bsetroot.1 +EXTRA_DIST = fluxbox.1.in bsetroot.1 Coding_style +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = +man1dir = $(mandir)/man1 +MANS = $(man_MANS) + +NROFF = nroff +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps doc/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +install-man1: + $(mkinstalldirs) $(DESTDIR)$(man1dir) + @list='$(man1_MANS)'; \ + l2='$(man_MANS)'; for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ + $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ + done + +uninstall-man1: + @list='$(man1_MANS)'; \ + l2='$(man_MANS)'; for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ + rm -f $(DESTDIR)$(man1dir)/$$inst; \ + done +install-man: $(MANS) + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-man1 +uninstall-man: + @$(NORMAL_UNINSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-man1 +tags: TAGS +TAGS: + + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = doc + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: install-man +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: uninstall-man +uninstall: uninstall-am +all-am: Makefile $(MANS) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + $(mkinstalldirs) $(DESTDIR)$(mandir)/man1 + + +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +mostlyclean-am: mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-generic clean-am distclean-local + -rm -f libtool + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: install-man1 uninstall-man1 install-man uninstall-man tags \ +distdir info-am info dvi-am dvi check check-am installcheck-am \ +installcheck install-exec-am install-exec install-data-am install-data \ +install-am install uninstall-am uninstall all-redirect all-am all \ +installdirs mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + +distclean-local: + rm -f *\~ + +fluxbox.1: fluxbox.1.in + @regex_cmd@ -e "s,@pkgdatadir@,$(pkgdatadir)," fluxbox.1.in > fluxbox.1 + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/bsetroot.1 b/doc/bsetroot.1 new file mode 100644 index 00000000..3c7ca204 --- /dev/null +++ b/doc/bsetroot.1 @@ -0,0 +1,89 @@ +.\" +.\" Man page for Bsetroot +.\" +.\" Copyright (c) 2000 by Wilbert Berendsen +.\" +.TH bsetroot 1 "June 16th, 2000" "0.60.3" +.SH NAME +bsetroot \- blackbox utility to change root window appearance +.SH SYNOPSIS +.BR bsetroot " \-help" +.br +.B bsetroot +.RI "[ \-display " display " ] \-solid " color +.br +.B bsetroot +.RI "[ \-display " display " ] \-mod " "x y" " \-fg " color " \-bg " color +.br +.B bsetroot +.RI "[ \-display " display " ] \-gradient " texture " \-from " color " \-to " color +.SH DESCRIPTION +Bsetroot is a utility that can control the appearance of the root window in +three ways: Either give it a solid color, or write a two color modula pattern +to it, or render a gradient texture, based on two different colors. +.PP +Bsetroot resembles +.IR xsetroot (1) +in this functionality but it supports multiple screen displays, and gradient +textures the same way as Blackbox does. +It doesn't handle cursors etc. +Bsetroot is part of the Blackbox package. +.SH OPTIONS +Bsetroot operates in three ways, you must choose one of the first 3 options: +.TP +.BI \-solid " color" +Sets the root window to specified color. +.TP +.BI \-mod " x y" +Creates a modula pattern. You must specify +.BR \-bg " and " \-fg +colors. +.TP +.BI \-gradient " texturestring" +Renders the specified texture string to the root window. +For possible texture strings, please refer to +.IR blackbox (1). +You must also specify both a +.BR \-from " and a " \-to +color. +.TP +.BI \-display " display" +Tells Bsetroot to connect to the specified display. +.TP +.BI "\-bg, \-background " color +Background color. +Needed for +.B \-mod +patterns. +.TP +.BI "\-fg, \-foreground " color +Foreground color. +Needed for +.B \-mod +patterns. +.TP +.BI \-from " color" +Start color for rendering textures. +Needed for +.B \-gradient +operation mode. +.TP +.BI \-to " color" +Ending color for rendering textures. +Needed for +.B \-gradient +operation mode. +.TP +.B \-help +Prints version info and short help text. +.SH AUTHOR +Bsetroot is written and maintained by Brad Hughes +.nh \" hyphenation off +(blackbox@alug.org) +.hy \" on again +and Jeff Raven +.nh +(jraven@psu.edu). +.hy +.SH SEE ALSO +.IR blackbox (1) diff --git a/doc/fluxbox.1.in b/doc/fluxbox.1.in new file mode 100644 index 00000000..9fa1a7f9 --- /dev/null +++ b/doc/fluxbox.1.in @@ -0,0 +1,805 @@ +.\" +.\" Man page for Blackbox +.\" +.\" Copyright (c) 2000 by Wilbert Berendsen +.\" +.\" This manual page may be freely distributed and modified. +.\" Parts of the text are taken from website and several README's +.\" by His Great Hughesness himself. Why reinvent wheels? +.\" +.\" Created with NEdit, tested with ``man'' and ``tkman.'' +.\" This manpage uses only standard groff and tmac.an macros. +.\" To all translators who didn't do manpages earlier (like me ;-): +.\" Read the Man-Page-Mini-HOWTO and the LDP manpage ``man 7 man'' +.\" There's all I needed to know about these macros. +.\" +.\" Updated for bb 0.61 at Sat Sep 9 06:56:04 CEST 2000 +.\" +.\" Changed to fluxbox by Henrik Kinnunen (fluxgen@linuxmail.org) +.\" +.\" ..define sort of
 macro
+.de EX
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH blackbox 1 "October 4th, 2000" "0.61.1"
+.SH NAME
+blackbox \- a window manager for X11
+.SH SYNOPSIS
+.BR blackbox " \-help | \-version"
+.br
+.B blackbox 
+.RI "[ \-rc" " rcfile " "] [ \-display" " display " ]
+.SH DESCRIPTION
+.\"
+.\" Phirst Phew ParagraPhs taken from blackbox.alug.org
+.\"
+Blackbox is yet another addition to the list of window managers for the Open
+Group's X Window System, Version 11 Release 6 and above.
+Blackbox is built with C++, sharing no common code with any other window
+manager (even though the graphics implementation is similar to that of Window
+Maker).
+.PP
+From the time the first line of code was written, Blackbox has evolved around
+one premise, minimalism.
+It's not meant to be Eye Candy, nor the most Featureful, nor the most Adorned
+for modelling the Widely acclaimed NeXT interface.
+It is just meant to be
+.BR fast .
+.PP
+Blackbox provides configurable window decorations, a root menu to launch
+applications and a toolbar that shows the current workspace name, the focused
+application name and the current time.
+There is also a workspace menu to add or remove workspaces. The `slit' can be
+used to dock small applications, e.g. most of the bbtools can use the slit.
+.PP
+Blackbox features a special kind of icon handling: When you minimize a window,
+no icon appears; instead you can view all minimized applications in the `Icons'
+submenu of the workspace menu.
+Your desktop will never get cluttered with icons. As an alternative to icons
+shaded windows are provided: A double click on the titlebar of a window will
+shade it (i.e. the window will disappear, only the titlebar stays visible.)
+.PP
+Blackbox uses its own graphics class to render its images on the fly.
+By using style files, you can determine at a great level how your desktop looks
+like.
+Currently KDE WM hints are not supported, but Blackbox is already prepared to
+support the new window manager specification that is now being developed for
+both Gnome and KDE2.0.
+.SH OPTIONS
+Blackbox supports the following commandline options:
+.TP
+.B \-help
+Display command line options and compiled-in features, then exit.
+.TP
+.B \-version
+Display version info and exit.
+.TP
+.BI \-rc \ rcfile
+Use another rcfile than the default
+.IR  "~/.blackboxrc" .
+.TP
+.BI \-display \ display
+Start Blackbox on the specified display.
+Programs started by Blackbox will have the
+.B DISPLAY
+environment variable set to this value, too.
+.SH RUNNING BLACKBOX
+This program is usually started by the user's startup script, most times called
+.IR ~/.xinitrc .
+To run blackbox, modify the script by adding
+.EX 0
+exec blackbox
+.EE
+as the last executed command of the script.
+When Blackbox terminates, the X session will terminate too.
+.PP
+When started, Blackbox will try to find a default menufile in
+.IR @pkgdatadir@/menu .
+You can provide a system-wide menu for your users here.
+.PP
+On exit or restart, Blackbox will save user defaults in the file
+.I ~/.blackboxrc
+in the user's home directory.
+Some resources in this file can be edited by hand.
+.SH USING BLACKBOX
+From version 0.60.x, Blackbox does no keyboard handling by itself; instead it
+relies on an external program
+.IR bbkeys (1)
+for this.
+So in this section we will discuss all mouse commands.
+.SS Root window (background):
+Right click (button 3) will pop up the root menu.
+With this you can launch your applications.
+You can customize this menu for your needs.
+A middle click (button 2) pops up the workspace menu.
+You can add or remove a workspace, view
+applications running on all workspace, inspect your icons, and jump directly to
+any workspace or application.
+.PP
+Left clicking (button 1) on an application in the Workspaces menu will bring
+you to that workspace and raise/focus that application;
+middle clicking (button 2) will warp the application to the current workspace.
+.SS Toolbar:
+The toolbar consists of three fields: a workspace name, window name of the
+window that has currently focus, and a clock.
+A left click on the toolbar will bring it to the foreground, a
+middle click will hide it behind other windows (if AlwaysOnTop is not set), and
+the right button brings up a little menu.
+.PP
+Using this menu you can enter a name for the current workspace (when finished,
+press Enter).
+Also you can choose the toolbar's position, whether or not it
+should be always on top (i.e. it cannot be obscured by other windows),
+and whether it should hide itself when the mouse moves away.
+.PP
+Note: In Blackbox versions below 0.60.0, a right click on the toolbar
+immediately enters workspace name edit mode.
+.SS Window Titlebar and Borders:
+A left click on any place of the window's border, will raise it.
+Dragging then moves the window.
+Dragging the resize grips at the left-bottom and right-bottom
+corners resizes the window.
+Middle clicking on any place will immediately lower the window.
+Right clicking on border or titlebar pops up the window menu,
+containing these commands:
+.TP
+.B Send To...
+Send window to another workspace.
+When you select the workspace with the middle button, Blackbox will
+send you along with the application to the selected workspace
+.TP
+.B Shade
+Shade the window (display titlebar only)
+.TP
+.B Iconify
+Iconify window.
+The `icon' can be found in the `Icons' submenu of the workspace menu
+.TP
+.B Maximize
+(Un)Maximize window.
+When you click the middle button on this item, the
+window will maximize only vertically
+.TP
+.B Raise
+Raise window
+.TP
+.B Lower
+Lower window
+.TP
+.B Stick
+(Un)Stick window.
+A stuck window will always be displayed in the current workspace
+.TP
+.B Kill Client
+Kill (-SIGKILL) owner of window
+.TP
+.B Close
+Close the application cleanly
+.PP
+When you doubleclick on the titlebar of a window, it will `shade', so
+that only the titlebar stays visible.
+Another double click will redisplay the window contents.
+.SS Window Buttons:
+The button at the left upper corner of a window is the Minimize button.
+Clicking with any button causes the window to be iconified.
+The rightmost button (with the X) closes the application.
+The other button on the right (if present) maximizes the window in three ways:
+Button 1 causes full screen maximization, button 2 maximizes the window only
+vertically, and button 3 only horizontally.
+.SS Any menu:
+Clicking button 3 in a menu will popdown the menu.
+Clicking button 1 on the titlebar of any (sub)menu and then dragging it somewhere
+else will cause the menu to stay visible and not disappear when you click on
+a menu item.
+.SS Miscellaneous:
+When you want to drag a window, but cannot see either the bottom handle or its
+titlebar, you can press Alt + button 1 anywhere in the window and then
+drag it around.
+You can also use Alt + button 1 to raise a partially visible window.
+Finally, Alt + button 2 lowers a window, and Alt + button 3 resizes the window.
+.SH MENU FILE
+A default menu file is installed in
+.IR @pkgdatadir@/menu .
+Of course this system-wide menu can be customized for all users at once.
+But it is also possible to create a personal menu.
+It is a convention to create a directory
+.IR "~/.blackbox/" " (or " "~/blackbox/" ")"
+in your home directory, and to create a menu file, e.g.
+.I menu
+in this directory, or copy the system-wide menu file to this location.
+Next, we have to tell Blackbox to load our menu file instead of the default.
+This is accomplished by adding (or changing) a resource value in the
+.I ~/.blackboxrc
+file e.g.:
+.EX
+session.menuFile:       ~/.blackbox/menu
+.EE
+For this change to take effect, Blackbox has to be restarted.
+Be sure that your menu is usable, then choose `Restart' from the default
+Blackbox root menu.
+.SS Menu syntax
+The menu syntax is very simple and very effective.
+There are upto three fields in a menu line.
+They are of the form:
+.EX
+[tag] (label or filename) {command or filename}
+.EE
+The supported tags are as follows:
+.TP
+.B [begin] (label for root menu)
+This tells Blackbox to start parsing the menu file.
+This tag is required for Blackbox to parse your menu file.
+If it cannot find it, the system default menu is used instead.
+.TP
+.B [end]
+This tells Blackbox that it is at the end of a menu.
+This can either be a submenu or the main root menu.
+There must be at least one of these tags in your menu to correspond to the
+required [begin] tag.
+.TP
+.B [exec] (label for command) {shell command}
+Inserts a command item into the menu.
+When you select the menu item from the menu, Blackbox runs `shell command.'
+.TP
+.B [exit] (label for exit)
+Inserts an item that shuts down and exits Blackbox.
+Any open windows are reparented to the root window before Blackbox exits.
+.TP
+.B [include] (filename)
+Parses the file specified by
+.I filename
+inline with the
+current menu. The filename can be the full path to a file or it can begin with
+.IR ~/ ,
+which will be expanded into your home directory (e.g.
+.EX
+[include] (~/blackbox/stylesmenu)
+.EE
+will include
+.I /home/bhughes/blackbox/stylesmenu
+in my menu).
+.TP
+.B [nop] (label - optional)
+Insert a non-operational item into the current menu.
+This can be used to help format the menu into blocks or sections
+if so desired.
+.B [nop]
+does accept a label, but it is not required, and a blank item will be used
+if none is supplied.
+.TP 
+.B [style] (label) {filename}
+This tells Blackbox to insert an item that, when selected, reads style file
+named
+.I filename
+and apply the new textures, colors and fonts to the current
+running session.
+.TP
+.B [stylesdir] (directory name)
+Reads all filenames from the specified directory, assuming that they are all
+valid style files (directories are ignored), and creates menu items in the
+current menu for every filename, that, when selected by the user, apply the
+selected style file to the current session.
+The labels that are created in the menu are the filenames of the style files.
+.TP
+.B [stylesmenu] (label) {directory name}
+Creates a submenu entry with
+.I label 
+(that is also the title of the new submenu), and inserts in that submenu all
+filenames in the specified directory, assuming that they are all valid style
+files (directories are ignored) in the same way as the
+.B [stylesdir]
+command does.
+.IP
+.RB Both\  [stylesdir] \ and\  [stylesmenu]
+commands make it possible to install style files without editing your menu file.
+.TP
+.B [submenu] (label) {title for menu - optional}
+This tells Blackbox to create and parse a new menu.
+This menu is inserted as a submenu into the parent menu.
+These menus are parsed recursively, so there is no limit to the number of levels
+or nested submenus you can have.
+The title for the new menu is optional, if none is supplied,
+the new menu's title is the same as the item label.
+An
+.B [end]
+tag is required to end the submenu.
+.TP
+.B [reconfig] (label)
+When selected, this item rereads the current style and menu files and
+apply any changes.
+This is useful for creating a new style or theme, as you don't have to
+constantly restart Blackbox every time you save your style.
+However, Blackbox automagically rereads the menu whenever it changes.
+.TP
+.B [restart] (label) {shell command - optional}
+This tells Blackbox to restart.
+If `shell command' is supplied, it shuts down and runs the command (which is
+commonly the name of another window manager).
+If the command is omitted, Blackbox restarts itself.
+.TP
+.B [config] (label)
+Inserts a Blackbox native submenu item, containing numerous configuration
+options concerning window placement, focus style, window moving style etc.
+.TP
+.B [workspaces] (label)
+This tells Blackbox to insert a link to the workspaces menu directly
+into your menu.
+This is handy for those users who can't access the
+workspace menu directly (e.g. if you don't have a 3 button mouse, it's
+rather hard to middle click to show the workspace menu).
+.PP
+Any line that starts with a `#' is considered a comment and ignored by Blackbox.
+Also, in the labels/commands/filenames fields,
+you can escape any character like so:
+.EX
+[exec] (\\(my cool\\) \\{XTERM\\}) {xterm -T \\"cool XTERM\\"}
+.EE
+Using `\\\\' inserts a literal back-slash into the label/command/filename field.
+.SS Menu example
+Now let's put together some things.
+Here is a short example of a menu file:
+.PP
+.nf
+# Blackbox menu file
+[begin] (Blackbox 0.60.3)
+  [exec] (rxvt) {rxvt -ls}
+  [exec] (netscape) {netscape -install}
+  [exec] (The GIMP) {gimp}
+  [exec] (XV) {xv}
+  [submenu] (pine)
+    [exec] (inbox) {rxvt -name pine -e pine -i}
+    [exec] (new message) {rxvt -name pine -e pine ""}
+  [end]
+  [submenu] (Window Manager)
+    [exec] (Edit Menus) {nedit .blackbox/Menu}
+    [submenu] (Style) {Which Style?}
+      [stylesdir] (~/.blackbox/styles)
+      [stylesmenu] (Blackbox Styles) {@pkgdatadir@/styles}
+    [end]
+    [config] (Config Options)
+    [reconfig] (Reconfigure)
+    [restart] (Restart)
+  [end]
+  [exit] (Log Out)
+[end]
+# end of menu file
+.fi
+.SH STYLES
+Blackbox enables you to use specialized files that contain
+.IR X (1)
+resources to specify colors, textures and fonts, and thus
+the overall look of your window borders, menus and the toolbar.
+.PP
+The default installation of Blackbox provides some of these style files.
+Usually they are put in
+.IR @pkgdatadir@/styles .
+You can study or edit these files to grasp how the Blackbox style mechanism
+works.
+You can use the
+.BR [style] ", " [stylesdir] " and " [stylesmenu]
+menu commands in your menu file to be able to select and change between styles
+on the fly.
+.PP
+But you can also create a directory named
+.I ~/.blackbox/styles
+in your homedirectory and put your own style files here.
+Of course you may choose any name for this directory, but many downloadable
+themes will rely on the name
+.I styles
+(following the bb.themes.org naming scheme).
+.PP
+To understand how the style mechanism works, you should have a little knowledge
+of how X resources work.
+.PP
+X resources consist of a key and a value.
+The key is constructed of several smaller keys (sometimes referred to as
+children), delimited by a period (`.').
+Keys may also contain a star (`*') to serve as a wildcard, which means that one
+line of typed text will match several keys.
+This is useful for styles that are based on one or two colors.
+.PP
+Blackbox allows you to configure it's three main components: the toolbar, the
+menus and the window decorations.
+.PP
+The little window that shows the x-y position while dragging windows, borrows
+ite style from the window's titlebar.
+.PP
+Here are some quick examples:
+.EX
+toolbar.clock.color:	green
+.EE
+This sets the color resource of the toolbar clock to `green.' Another example:
+.EX
+menu*color:	rgb:3/4/5
+.EE
+This sets the color resource of the menu
+.I and all of its `children'
+to `rgb:3/4/5'.
+(For a description of color names, see
+.IR X (1).)
+So this one also applies to
+.IR menu.title.color " and " menu.frame.color .
+And with
+.EX
+*font:	-b&h-lucida-medium-r-normal-*-*-140-*
+.EE
+you set the font resource for all keys to this font name all at once.
+(For information about the fonts installed on your system, you can use a program like
+.IR xfontsel "(1), " gtkfontsel ", or " xlsfonts "(1).)"
+.PP
+Now, what makes Blackbox just so spectacular, is its ability to render textures
+on the fly.
+Texture descriptions are specified directly to the key that they
+should apply to, e.g.:
+.ta \w'toolbar.clock.colorTo:\ 'u
+.EX
+toolbar.clock:	Raised Gradient Diagonal Bevel1
+toolbar.clock.color:	rgb:8/6/4
+toolbar.clock.colorTo:	rgb:4/3/2
+.EE
+Don't worry, we will explain right now!
+A texture description consists of up to five fields, which are as follows:
+.TP
+.B Flat / Raised / Sunken
+gives the component either a flat, raised or sunken appearance.
+.TP
+.B Gradient / Solid
+tells Blackbox to draw either a solid color or a gradiented texture.
+.TP
+.B Horizontal / Vertical / Diagonal / Crossdiagonal / Pipecross / Elliptic / Rectangle / Pyramid
+Select one of these texture types. They only work when also
+.B Gradient
+is specified!
+.TP
+.B Interlaced
+tells Blackbox to interlace the texture (darken every other line).
+This option is most commonly used with gradiented textures, but from Blackbox
+version 0.60.3 on, it also works in solid textures.
+.TP
+.B Bevel1 / Bevel2
+tells Blackbox which type of bevel to use.
+Bevel1 is the default bevel.
+The shading is placed on the edge of the image.
+Bevel2 is an alternative.
+The shading is placed one pixel in from the edge of the image.
+.PP
+Instead of a texture description, also the option
+.B ParentRelative
+is available, which makes the component appear as a part of its parent, e.g.
+totally transparant.
+.PP
+All gradiented textures are composed of two color values: the
+.IR color " and " colorTo " resources."
+When
+.B Interlaced 
+is used in
+.B Solid
+mode, the
+.I colorTo
+resource is used to find the interlacing color.
+.PP
+Well, here is the complete component list, also all components together with
+which kind of value they can contain.
+Comments are preceded with an exclamation sign (!), which is also used for
+comments in Blackbox style c.q. X resource files.
+.PP
+.ta \w'window.button.unfocus.picColor:\ 'u 
+.nf
+.\"
+.\" The comments also to be translated!
+.\"
+! The toolbar itself
+toolbar:	Texture
+toolbar.color:	Color
+toolbar.colorTo:	Color
+
+! The buttons on the toolbar
+toolbar.button:	Texture or \fIParentRelative\fR
+toolbar.button.color:	Color
+toolbar.button.colorTo:	Color
+
+! Color of the button arrows
+toolbar.button.picColor:	Color
+
+! Buttons in pressed state
+toolbar.button.pressed:	Texture \fI(e.g. Sunken)\fR or \fIParentRelative\fR
+toolbar.button.pressed.color:	Color
+toolbar.button.pressed.colorTo:	Color
+
+! Color of pressed button arrows
+toolbar.button.pressed.picColor:	Color
+
+! The toolbar workspace label
+toolbar.label:	Texture or \fIParentRelative\fR
+toolbar.label.color:	Color
+toolbar.label.colorTo:	Color
+toolbar.label.textColor:	Color
+
+! The toolbar window label
+toolbar.windowLabel:	Texture or \fIParentRelative\fR
+toolbar.windowLabel.color:	Color
+toolbar.windowLabel.colorTo:	Color
+toolbar.windowLabel.textColor:	Color
+
+! The toolbar clock
+toolbar.clock:	Texture or \fIParentRelative\fR
+toolbar.clock.color:	Color
+toolbar.clock.colorTo:	Color
+toolbar.clock.textColor:	Color
+
+! How the toolbar's text should be justified.
+toolbar.justify:	\fIcenter\fR, \fIleft\fR, or \fIright\fR
+
+! Font to be used for all toolbar components
+toolbar.font:	Font \fI(e.g. -*-helvetica-medium-r-normal-*-*-100-*)\fR
+
+! The menu titlebar
+menu.title:	Texture
+menu.title.color:	Color
+menu.title.colorTo:	Color
+menu.title.textColor:	Color
+menu.title.font:	Font
+menu.title.justify:	\fIcenter\fR, \fIleft\fR, or \fIright\fR
+
+! The menu frame
+menu.frame:	Texture
+menu.frame.color:	Color
+menu.frame.colorTo:	Color
+menu.frame.textColor:	Color
+menu.frame.disableColor:	Color
+menu.frame.font:	Font
+menu.frame.justify:	\fIcenter\fR, \fIleft\fR, or \fIright\fR
+
+! Bullets for submenu items
+menu.bullet:	\fIempty\fR, \fItriangle\fR, \fIsquare\fR, or \fIdiamond\fR
+menu.bullet.position:	\fIright\fR or \fIleft\fR
+
+! The highlighted menu item
+menu.hilite:	Texture (e.g. \fIRaised\fR)
+menu.hilite.color:	Color
+menu.hilite.colorTo:	Color
+menu.hilite.textColor:	Color
+
+! A focused window
+window.title.focus:	Texture
+window.title.focus.color:	Color
+window.title.focus.colorTo:	Color
+
+! An unfocused window
+window.title.unfocus:	Texture
+window.title.unfocus.color:	Color
+window.title.unfocus.colorTo:	Color
+
+! Window label
+window.label.focus:	Texture or \fIParentRelative\fR
+window.label.focus.color:	Color
+window.label.focus.colorTo:	Color
+window.label.focus.textColor:	Color
+
+window.label.unfocus:	Texture or \fIParentRelative\fR
+window.label.unfocus.color:	Color
+window.label.unfocus.colorTo:	Color
+window.label.unfocus.textColor:	Color
+
+! Handlebar
+window.handle.focus:	Texture
+window.handle.focus.color:	Color
+window.handle.focus.colorTo:	Color
+
+window.handle.unfocus:	Texture
+window.handle.unfocus.color:	Color
+window.handle.unfocus.colorTo:	Color
+
+! Resize grips
+window.grip.focus:	Texture
+window.grip.focus.color:	Color
+window.grip.focus.colorTo:	Color
+
+window.grip.unfocus:	Texture
+window.grip.unfocus.color:	Color
+window.grip.unfocus.colorTo:	Color
+
+! Window buttons
+window.button.focus:	Texture or \fIParentRelative\fR
+window.button.focus.color:	Color
+window.button.focus.colorTo:	Color
+window.button.focus.picColor:	Color
+
+window.button.unfocus:	Texture or \fIParentRelative\fR
+window.button.unfocus.color:	Color
+window.button.unfocus.colorTo:	Color
+window.button.unfocus.picColor:	Color
+
+window.button.pressed:	Texture (e.g. \fISunken\fR)
+window.button.pressed.color:	Color
+window.button.pressed.colorTo:	Color
+
+! Frame around window
+window.frame.focusColor:	Color
+window.frame.unfocusColor:	Color
+
+! Font and justification for window labels
+window.font:	Font
+window.justify:	\fIcenter\fR, \fIleft\fR, or \fIright\fR
+
+! Miscellaneous resources
+
+! A border can be drawn round all components
+borderWidth:	a number of pixels, e.g. \fI1\fR
+borderColor:	Color
+
+bevelWidth:	a number of pixels > 0
+handleWidth:	a number of pixels > 0
+
+! Width of the window frame (from version 0.61 on)
+! When not specified, frameWidth defaults to the value of bevelWidth
+frameWidth:	a number of pixels >= 0
+
+
+! This command is executed whenever this style is selected.
+! Typically it sets the root window to a nice picture.
+rootCommand:	Shell command, e.g. \fIbsetroot -mod 4 4 -fg rgb:	5/6/6 -bg grey20\fR
+
+! Some of the bbtools read these old 0.51 resources
+menuFont:	Font
+titleFont:	Font
+.fi
+.PP
+Now, this seems a long list, but remember, when you create your own style, you
+can easily set lots of keys with a single command, e.g.
+.EX
+.ta \w'*unfocus.textColor:\ 'u
+*color:	slategrey
+*colorTo:	darkslategrey
+*unfocus.color:	darkslategrey
+*unfocus.colorTo:	black
+*textColor:	white
+*unfocus.textColor:	lightgrey
+*font:	lucidasans-10
+.EE
+This sets already nice defaults for many components.
+.SH THE SLIT
+The slit is a special Blackbox window frame that can contain dockable
+applications, e.g. the `bbtools.'
+When applications are run in the slit they have no window borders of their own;
+instead they are framed in the slit, and they are always visible in the current
+workspace.
+You can click button 3 on the edge of the slit window to get a menu to
+determine its position, whether its contained applications should be grouped
+horizontally or vertically and whether the slit should hide itself when the
+mouse moves away.
+.PP
+Most dockable applications use the
+.B -w
+option to run in the slit.
+For example, you could put in your
+.IR ~/.xinitrc :
+.EX
+bbmail -w &
+bbpager -w &
+exec blackbox
+.EE
+Of course to use the slit you must have slit support compiled in.
+.SH RESOURCE FILE
+Usually the
+.I ~/.blackboxrc
+resource file is created and maintained bij Blackbox itself.
+All options from the
+.B [config]
+menu (from 0.60.x on), the last selected style file, your workspace names and
+so on are saved into this file.
+However, there are some resources in it you might want to edit yourself:
+.TP
+.B session.menuFile:
+This tells Blackbox where to look for its menu file.
+.TP
+.B session.screen0.toolbar.widthPercent:
+This determines the amount (in %) of space the toolbar will take.
+Default value is:
+.IR 66 .
+.TP
+.B session.screen0.strftimeFormat:
+This adjusts the way the current time is displayed in the toolbar.
+The
+.IR strftime (3)
+format is used.
+The default value is:
+.IR "%I:%M %p" .
+.TP
+.B session.autoRaiseDelay:
+Adjusts the delay (in ms) before focused windows will raise when using the
+Autoraise option.
+The default value is:
+.IR 250 .
+.TP
+.B session.doubleClickInterval:
+Adjust the delay (in ms) between mouse clicks for Blackbox to consider a double click.
+Default value is:
+.IR 250 .
+.TP
+.B session.screen0.edgeSnapThreshold:
+When moving a window across your screen, Blackbox is able to have it `snap' to
+the edges of the screen for easy placement.
+This variable tells Blackbox the distance (in pixels) at which the window will
+jump to the egde.
+Default value is:
+.IR 0 .
+.TP
+.B session.cacheMax:
+This tells Blackbox how much memory (in Kb) it may use to store cached pixmaps on
+the X server.
+If your machine runs short of memory, you may lower this value.
+Default value is
+.IR 200 .
+.TP
+.B session.cacheLife:
+This tells Blackbox how long (in minutes) unused pixmaps may stay in the X
+server's memory.
+Default value is
+.IR 5 .
+.TP
+.B session.colorsPerChannel:
+This tells Blackbox how many colors to take from the X server on pseudocolor
+displays.  A channel would be red, green, or blue.
+Blackbox will allocate this variable ^ 3 colors and make them always available.
+Value must be between 2 and 6.
+When you run Blackbox on an 8-bit display, you must set this resource to 4.
+Default value is
+.IR 4.
+.PP
+When running Blackbox in a multiple desktop environment the
+.B screen0
+key can also be
+.B screen1, 2
+etc. for any appropriate desktop.
+.SH ENVIRONMENT
+.TP
+.B HOME
+Blackbox uses
+.RB $ HOME
+to find its
+.I .blackboxrc
+file, and to resolve stylefile and \-directory names.
+.TP
+.B DISPLAY
+When no other display was given on the command line, Blackbox will start on the
+display specified by this variable.
+.SH AUTHOR and CREDITS
+All of the code is written and maintained by Brad Hughes
+.nh \" hyphenation off
+(blackbox@alug.org)
+.hy \" on again
+and Jeff Raven
+.nh
+(jraven@psu.edu),
+.hy
+with contributions and patches merged from
+many individuals around the world.
+.PP
+The Official Blackbox website:
+.nh
+.B http://blackbox.alug.org/
+.hy
+.br
+Many themes and other contributions:
+.nh
+.B http://bb.themes.org/
+.hy
+.PP
+This manpage was put together by Wilbert Berendsen
+.nh
+(wbsoft@xs4all.nl).
+.hy
+Numerous other languages will be available.
+.SH SEE ALSO
+.IR bsetroot (1), \ bbkeys (1)  \" not there, yet ;-(
diff --git a/install-sh b/install-sh
new file mode 100755
index 00000000..e8436696
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,250 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission.  M.I.T. makes no representations about the
+# suitability of this software for any purpose.  It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+	-c) instcmd="$cpprog"
+	    shift
+	    continue;;
+
+	-d) dir_arg=true
+	    shift
+	    continue;;
+
+	-m) chmodcmd="$chmodprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-o) chowncmd="$chownprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-g) chgrpcmd="$chgrpprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-s) stripcmd="$stripprog"
+	    shift
+	    continue;;
+
+	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
+	    shift
+	    continue;;
+
+	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+	    shift
+	    continue;;
+
+	*)  if [ x"$src" = x ]
+	    then
+		src=$1
+	    else
+		# this colon is to work around a 386BSD /bin/sh bug
+		:
+		dst=$1
+	    fi
+	    shift
+	    continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+	echo "install:	no input file specified"
+	exit 1
+else
+	true
+fi
+
+if [ x"$dir_arg" != x ]; then
+	dst=$src
+	src=""
+	
+	if [ -d $dst ]; then
+		instcmd=:
+	else
+		instcmd=mkdir
+	fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+	if [ -f $src -o -d $src ]
+	then
+		true
+	else
+		echo "install:  $src does not exist"
+		exit 1
+	fi
+	
+	if [ x"$dst" = x ]
+	then
+		echo "install:	no destination specified"
+		exit 1
+	else
+		true
+	fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+	if [ -d $dst ]
+	then
+		dst="$dst"/`basename $src`
+	else
+		true
+	fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='	
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+	pathcomp="${pathcomp}${1}"
+	shift
+
+	if [ ! -d "${pathcomp}" ] ;
+        then
+		$mkdirprog "${pathcomp}"
+	else
+		true
+	fi
+
+	pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+	$doit $instcmd $dst &&
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+	if [ x"$transformarg" = x ] 
+	then
+		dstfile=`basename $dst`
+	else
+		dstfile=`basename $dst $transformbasename | 
+			sed $transformarg`$transformbasename
+	fi
+
+# don't allow the sed command to completely eliminate the filename
+
+	if [ x"$dstfile" = x ] 
+	then
+		dstfile=`basename $dst`
+	else
+		true
+	fi
+
+# Make a temp file name in the proper directory.
+
+	dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+	$doit $instcmd $src $dsttmp &&
+
+	trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+	$doit $rmcmd -f $dstdir/$dstfile &&
+	$doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/ltconfig b/ltconfig
new file mode 100755
index 00000000..c14d83c1
--- /dev/null
+++ b/ltconfig
@@ -0,0 +1,3114 @@
+#! /bin/sh
+
+# ltconfig - Create a system-specific libtool.
+# Copyright (C) 1996-1999 Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit , 1996
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A lot of this script is taken from autoconf-2.10.
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+echo=echo
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell.
+  exec "$SHELL" "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat </dev/null`}
+  case X$UNAME in
+    *-DOS) PATH_SEPARATOR=';' ;;
+    *)     PATH_SEPARATOR=':' ;;
+  esac
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+if test "X${echo_test_string+set}" != Xset; then
+  # find a string as large as possible, as long as the shell can cope with it
+  for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+    if (echo_test_string="`eval $cmd`") 2>/dev/null &&
+       echo_test_string="`eval $cmd`" &&
+       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null; then
+      break
+    fi
+  done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" != 'X\t' ||
+   test "X`($echo "$echo_test_string") 2>/dev/null`" != X"$echo_test_string"; then
+  # The Solaris, AIX, and Digital Unix default echo programs unquote
+  # backslashes.  This makes it impossible to quote backslashes using
+  #   echo "$something" | sed 's/\\/\\\\/g'
+  #
+  # So, first we look for a working echo in the user's PATH.
+
+  IFS="${IFS= 	}"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+  for dir in $PATH /usr/ucb; do
+    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+       test "X`($dir/echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
+      echo="$dir/echo"
+      break
+    fi
+  done
+  IFS="$save_ifs"
+
+  if test "X$echo" = Xecho; then
+    # We didn't find a better echo, so look for alternatives.
+    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+       test "X`(print -r "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
+      # This shell has a builtin print -r that does the trick.
+      echo='print -r'
+    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+	 test "X$CONFIG_SHELL" != X/bin/ksh; then
+      # If we have ksh, try running ltconfig again with it.
+      ORIGINAL_CONFIG_SHELL="${CONFIG_SHELL-/bin/sh}"
+      export ORIGINAL_CONFIG_SHELL
+      CONFIG_SHELL=/bin/ksh
+      export CONFIG_SHELL
+      exec "$CONFIG_SHELL" "$0" --no-reexec ${1+"$@"}
+    else
+      # Try using printf.
+      echo='printf "%s\n"'
+      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+	 test "X`($echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
+	# Cool, printf works
+	:
+      elif test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' &&
+	   test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
+	CONFIG_SHELL="$ORIGINAL_CONFIG_SHELL"
+	export CONFIG_SHELL
+	SHELL="$CONFIG_SHELL"
+	export SHELL
+	echo="$CONFIG_SHELL $0 --fallback-echo"
+      elif test "X`("$CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' &&
+	   test "X`("$CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
+	echo="$CONFIG_SHELL $0 --fallback-echo"
+      else
+	# maybe with a smaller string...
+	prev=:
+
+	for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+	  if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null; then
+	    break
+	  fi
+	  prev="$cmd"
+	done
+
+	if test "$prev" != 'sed 50q "$0"'; then
+	  echo_test_string=`eval $prev`
+	  export echo_test_string
+	  exec "${ORIGINAL_CONFIG_SHELL}" "$0" ${1+"$@"}
+	else
+	  # Oops.  We lost completely, so just stick with echo.
+	  echo=echo
+	fi
+      fi
+    fi
+  fi
+fi
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e s/^X//'
+sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# The name of this program.
+progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'`
+
+# Constants:
+PROGRAM=ltconfig
+PACKAGE=libtool
+VERSION=1.3.5
+TIMESTAMP=" (1.385.2.206 2000/05/27 11:12:27)"
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+rm="rm -f"
+
+help="Try \`$progname --help' for more information."
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+enable_shared=yes
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+enable_static=yes
+enable_fast_install=yes
+enable_dlopen=unknown
+enable_win32_dll=no
+ltmain=
+silent=
+srcdir=
+ac_config_guess=
+ac_config_sub=
+host=
+nonopt=
+ofile="$default_ofile"
+verify_host=yes
+with_gcc=no
+with_gnu_ld=no
+need_locks=yes
+ac_ext=c
+objext=o
+libext=a
+exeext=
+cache_file=
+
+old_AR="$AR"
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+old_CPPFLAGS="$CPPFLAGS"
+old_LDFLAGS="$LDFLAGS"
+old_LD="$LD"
+old_LN_S="$LN_S"
+old_LIBS="$LIBS"
+old_NM="$NM"
+old_RANLIB="$RANLIB"
+old_DLLTOOL="$DLLTOOL"
+old_OBJDUMP="$OBJDUMP"
+old_AS="$AS"
+
+# Parse the command line options.
+args=
+prev=
+for option
+do
+  case "$option" in
+  -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) optarg= ;;
+  esac
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$prev"; then
+    eval "$prev=\$option"
+    prev=
+    continue
+  fi
+
+  case "$option" in
+  --help) cat <&2
+    echo "$help" 1>&2
+    exit 1
+    ;;
+
+  *)
+    if test -z "$ltmain"; then
+      ltmain="$option"
+    elif test -z "$host"; then
+# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1
+#      if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then
+#        echo "$progname: warning \`$option' is not a valid host type" 1>&2
+#      fi
+      host="$option"
+    else
+      echo "$progname: too many arguments" 1>&2
+      echo "$help" 1>&2
+      exit 1
+    fi ;;
+  esac
+done
+
+if test -z "$ltmain"; then
+  echo "$progname: you must specify a LTMAIN file" 1>&2
+  echo "$help" 1>&2
+  exit 1
+fi
+
+if test ! -f "$ltmain"; then
+  echo "$progname: \`$ltmain' does not exist" 1>&2
+  echo "$help" 1>&2
+  exit 1
+fi
+
+# Quote any args containing shell metacharacters.
+ltconfig_args=
+for arg
+do
+  case "$arg" in
+  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+  ltconfig_args="$ltconfig_args '$arg'" ;;
+  *) ltconfig_args="$ltconfig_args $arg" ;;
+  esac
+done
+
+# A relevant subset of AC_INIT.
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 5 compiler messages saved in config.log
+# 6 checking for... messages and results
+if test "$silent" = yes; then
+  exec 6>/dev/null
+else
+  exec 6>&1
+fi
+exec 5>>./config.log
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+if test "X${LC_ALL+set}" = Xset; then LC_ALL=C; export LC_ALL; fi
+if test "X${LANG+set}"   = Xset; then LANG=C;   export LANG;   fi
+
+if test -n "$cache_file" && test -r "$cache_file"; then
+  echo "loading cache $cache_file within ltconfig"
+  . $cache_file
+fi
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+    ac_n= ac_c='
+' ac_t='	'
+  else
+    ac_n=-n ac_c= ac_t=
+  fi
+else
+  ac_n= ac_c='\c' ac_t=
+fi
+
+if test -z "$srcdir"; then
+  # Assume the source directory is the same one as the path to LTMAIN.
+  srcdir=`$echo "X$ltmain" | $Xsed -e 's%/[^/]*$%%'`
+  test "$srcdir" = "$ltmain" && srcdir=.
+fi
+
+trap "$rm conftest*; exit 1" 1 2 15
+if test "$verify_host" = yes; then
+  # Check for config.guess and config.sub.
+  ac_aux_dir=
+  for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+    if test -f $ac_dir/config.guess; then
+      ac_aux_dir=$ac_dir
+      break
+    fi
+  done
+  if test -z "$ac_aux_dir"; then
+    echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2
+    echo "$help" 1>&2
+    exit 1
+  fi
+  ac_config_guess=$ac_aux_dir/config.guess
+  ac_config_sub=$ac_aux_dir/config.sub
+
+  # Make sure we can run config.sub.
+  if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then :
+  else
+    echo "$progname: cannot run $ac_config_sub" 1>&2
+    echo "$help" 1>&2
+    exit 1
+  fi
+
+  echo $ac_n "checking host system type""... $ac_c" 1>&6
+
+  host_alias=$host
+  case "$host_alias" in
+  "")
+    if host_alias=`$SHELL $ac_config_guess`; then :
+    else
+      echo "$progname: cannot guess host type; you must specify one" 1>&2
+      echo "$help" 1>&2
+      exit 1
+    fi ;;
+  esac
+  host=`$SHELL $ac_config_sub $host_alias`
+  echo "$ac_t$host" 1>&6
+
+  # Make sure the host verified.
+  test -z "$host" && exit 1
+
+elif test -z "$host"; then
+  echo "$progname: you must specify a host type if you use \`--no-verify'" 1>&2
+  echo "$help" 1>&2
+  exit 1
+else
+  host_alias=$host
+fi
+
+# Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+case "$host_os" in
+linux-gnu*) ;;
+linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+esac
+
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+case "$host_os" in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR cru $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+# Set a sane default for `AR'.
+test -z "$AR" && AR=ar
+
+# Set a sane default for `OBJDUMP'.
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+# If RANLIB is not set, then run the test.
+if test "${RANLIB+set}" != "set"; then
+  result=no
+
+  echo $ac_n "checking for ranlib... $ac_c" 1>&6
+  IFS="${IFS= 	}"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+  for dir in $PATH; do
+    test -z "$dir" && dir=.
+    if test -f $dir/ranlib || test -f $dir/ranlib$ac_exeext; then
+      RANLIB="ranlib"
+      result="ranlib"
+      break
+    fi
+  done
+  IFS="$save_ifs"
+
+  echo "$ac_t$result" 1>&6
+fi
+
+if test -n "$RANLIB"; then
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+  old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
+fi
+
+# Set sane defaults for `DLLTOOL', `OBJDUMP', and `AS', used on cygwin.
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$AS" && AS=as
+
+# Check to see if we are using GCC.
+if test "$with_gcc" != yes || test -z "$CC"; then
+  # If CC is not set, then try to find GCC or a usable CC.
+  if test -z "$CC"; then
+    echo $ac_n "checking for gcc... $ac_c" 1>&6
+    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+    for dir in $PATH; do
+      test -z "$dir" && dir=.
+      if test -f $dir/gcc || test -f $dir/gcc$ac_exeext; then
+	CC="gcc"
+	break
+      fi
+    done
+    IFS="$save_ifs"
+
+    if test -n "$CC"; then
+      echo "$ac_t$CC" 1>&6
+    else
+      echo "$ac_t"no 1>&6
+    fi
+  fi
+
+  # Not "gcc", so try "cc", rejecting "/usr/ucb/cc".
+  if test -z "$CC"; then
+    echo $ac_n "checking for cc... $ac_c" 1>&6
+    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+    cc_rejected=no
+    for dir in $PATH; do
+      test -z "$dir" && dir=.
+      if test -f $dir/cc || test -f $dir/cc$ac_exeext; then
+	if test "$dir/cc" = "/usr/ucb/cc"; then
+	  cc_rejected=yes
+	  continue
+	fi
+	CC="cc"
+	break
+      fi
+    done
+    IFS="$save_ifs"
+    if test $cc_rejected = yes; then
+      # We found a bogon in the path, so make sure we never use it.
+      set dummy $CC
+      shift
+      if test $# -gt 0; then
+	# We chose a different compiler from the bogus one.
+	# However, it has the same name, so the bogon will be chosen
+	# first if we set CC to just the name; use the full file name.
+	shift
+	set dummy "$dir/cc" "$@"
+	shift
+	CC="$@"
+      fi
+    fi
+
+    if test -n "$CC"; then
+      echo "$ac_t$CC" 1>&6
+    else
+      echo "$ac_t"no 1>&6
+    fi
+
+    if test -z "$CC"; then
+      echo "$progname: error: no acceptable cc found in \$PATH" 1>&2
+      exit 1
+    fi
+  fi
+
+  # Now see if the compiler is really GCC.
+  with_gcc=no
+  echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6
+  echo "$progname:581: checking whether we are using GNU C" >&5
+
+  $rm conftest.c
+  cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+    with_gcc=yes
+  fi
+  $rm conftest.c
+  echo "$ac_t$with_gcc" 1>&6
+fi
+
+# Allow CC to be a program name with arguments.
+set dummy $CC
+compiler="$2"
+
+echo $ac_n "checking for object suffix... $ac_c" 1>&6
+$rm conftest*
+echo 'int i = 1;' > conftest.c
+echo "$progname:603: checking for object suffix" >& 5
+if { (eval echo $progname:604: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; }; then
+  # Append any warnings to the config.log.
+  cat conftest.err 1>&5
+
+  for ac_file in conftest.*; do
+    case $ac_file in
+    *.c) ;;
+    *) objext=`echo $ac_file | sed -e s/conftest.//` ;;
+    esac
+  done
+else
+  cat conftest.err 1>&5
+  echo "$progname: failed program was:" >&5
+  cat conftest.c >&5
+fi
+$rm conftest*
+echo "$ac_t$objext" 1>&6
+
+echo $ac_n "checking for executable suffix... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_exeext="no"
+  $rm conftest*
+  echo 'main () { return 0; }' > conftest.c
+  echo "$progname:629: checking for executable suffix" >& 5
+  if { (eval echo $progname:630: \"$ac_link\") 1>&5; (eval $ac_link) 2>conftest.err; }; then
+    # Append any warnings to the config.log.
+    cat conftest.err 1>&5
+
+    for ac_file in conftest.*; do
+      case $ac_file in
+      *.c | *.err | *.$objext ) ;;
+      *) ac_cv_exeext=.`echo $ac_file | sed -e s/conftest.//` ;;
+      esac
+    done
+  else
+    cat conftest.err 1>&5
+    echo "$progname: failed program was:" >&5
+    cat conftest.c >&5
+  fi
+  $rm conftest*
+fi
+if test "X$ac_cv_exeext" = Xno; then
+  exeext=""
+else
+  exeext="$ac_cv_exeext"
+fi
+echo "$ac_t$ac_cv_exeext" 1>&6
+
+echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6
+pic_flag=
+special_shlib_compile_flags=
+wl=
+link_static_flag=
+no_builtin_flag=
+
+if test "$with_gcc" = yes; then
+  wl='-Wl,'
+  link_static_flag='-static'
+
+  case "$host_os" in
+  beos* | irix5* | irix6* | osf3* | osf4* | osf5*)
+    # PIC is the default for these OSes.
+    ;;
+  aix*)
+    # Below there is a dirty hack to force normal static linking with -ldl
+    # The problem is because libdl dynamically linked with both libc and
+    # libC (AIX C++ library), which obviously doesn't included in libraries
+    # list by gcc. This cause undefined symbols with -static flags.
+    # This hack allows C programs to be linked with "-static -ldl", but
+    # we not sure about C++ programs.
+    link_static_flag="$link_static_flag ${wl}-lC"
+    ;;
+  cygwin* | mingw* | os2*)
+    # We can build DLLs from non-PIC.
+    ;;
+  amigaos*)
+    # FIXME: we need at least 68020 code to build shared libraries, but
+    # adding the `-m68020' flag to GCC prevents building anything better,
+    # like `-m68040'.
+    pic_flag='-m68020 -resident32 -malways-restore-a4'
+    ;;
+  sysv4*MP*)
+    if test -d /usr/nec; then
+       pic_flag=-Kconform_pic
+    fi
+    ;;
+  *)
+    pic_flag='-fPIC'
+    ;;
+  esac
+else
+  # PORTME Check for PIC flags for the system compiler.
+  case "$host_os" in
+  aix3* | aix4*)
+    # All AIX code is PIC.
+    link_static_flag='-bnso -bI:/lib/syscalls.exp'
+    ;;
+
+  hpux9* | hpux10* | hpux11*)
+    # Is there a better link_static_flag that works with the bundled CC?
+    wl='-Wl,'
+    link_static_flag="${wl}-a ${wl}archive"
+    pic_flag='+Z'
+    ;;
+
+  irix5* | irix6*)
+    wl='-Wl,'
+    link_static_flag='-non_shared'
+    # PIC (with -KPIC) is the default.
+    ;;
+
+  cygwin* | mingw* | os2*)
+    # We can build DLLs from non-PIC.
+    ;;
+
+  osf3* | osf4* | osf5*)
+    # All OSF/1 code is PIC.
+    wl='-Wl,'
+    link_static_flag='-non_shared'
+    ;;
+
+  sco3.2v5*)
+    pic_flag='-Kpic'
+    link_static_flag='-dn'
+    special_shlib_compile_flags='-belf'
+    ;;
+
+  solaris*)
+    pic_flag='-KPIC'
+    link_static_flag='-Bstatic'
+    wl='-Wl,'
+    ;;
+
+  sunos4*)
+    pic_flag='-PIC'
+    link_static_flag='-Bstatic'
+    wl='-Qoption ld '
+    ;;
+
+  sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+    pic_flag='-KPIC'
+    link_static_flag='-Bstatic'
+    wl='-Wl,'
+    ;;
+
+  uts4*)
+    pic_flag='-pic'
+    link_static_flag='-Bstatic'
+    ;;
+  sysv4*MP*)
+    if test -d /usr/nec ;then
+      pic_flag='-Kconform_pic'
+      link_static_flag='-Bstatic'
+    fi
+    ;;
+  *)
+    can_build_shared=no
+    ;;
+  esac
+fi
+
+if test -n "$pic_flag"; then
+  echo "$ac_t$pic_flag" 1>&6
+
+  # Check to make sure the pic_flag actually works.
+  echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6
+  $rm conftest*
+  echo "int some_variable = 0;" > conftest.c
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS $pic_flag -DPIC"
+  echo "$progname:776: checking if $compiler PIC flag $pic_flag works" >&5
+  if { (eval echo $progname:777: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then
+    # Append any warnings to the config.log.
+    cat conftest.err 1>&5
+    
+    case "$host_os" in
+    hpux9* | hpux10* | hpux11*)
+      # On HP-UX, both CC and GCC only warn that PIC is supported... then they
+      # create non-PIC objects.  So, if there were any warnings, we assume that
+      # PIC is not supported.
+      if test -s conftest.err; then
+	echo "$ac_t"no 1>&6
+	can_build_shared=no
+	pic_flag=
+      else
+	echo "$ac_t"yes 1>&6
+	pic_flag=" $pic_flag"
+      fi
+      ;;
+    *)
+      echo "$ac_t"yes 1>&6
+      pic_flag=" $pic_flag"
+      ;;
+    esac
+  else
+    # Append any errors to the config.log.
+    cat conftest.err 1>&5
+    can_build_shared=no
+    pic_flag=
+    echo "$ac_t"no 1>&6
+  fi
+  CFLAGS="$save_CFLAGS"
+  $rm conftest*
+else
+  echo "$ac_t"none 1>&6
+fi
+
+# Check to see if options -o and -c are simultaneously supported by compiler
+echo $ac_n "checking if $compiler supports -c -o file.o... $ac_c" 1>&6
+$rm -r conftest 2>/dev/null
+mkdir conftest
+cd conftest
+$rm conftest*
+echo "int some_variable = 0;" > conftest.c
+mkdir out
+# According to Tom Tromey, Ian Lance Taylor reported there are C compilers
+# that will create temporary files in the current directory regardless of
+# the output directory.  Thus, making CWD read-only will cause this test
+# to fail, enabling locking or at least warning the user not to do parallel
+# builds.
+chmod -w .
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -o out/conftest2.o"
+echo "$progname:829: checking if $compiler supports -c -o file.o" >&5
+if { (eval echo $progname:830: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.o; then
+
+  # The compiler can only warn and ignore the option if not recognized
+  # So say no if there are warnings
+    if test -s out/conftest.err; then
+      echo "$ac_t"no 1>&6
+      compiler_c_o=no
+    else
+      echo "$ac_t"yes 1>&6
+      compiler_c_o=yes
+    fi
+else
+  # Append any errors to the config.log.
+  cat out/conftest.err 1>&5
+  compiler_c_o=no
+  echo "$ac_t"no 1>&6
+fi
+CFLAGS="$save_CFLAGS"
+chmod u+w .
+$rm conftest* out/*
+rmdir out
+cd ..
+rmdir conftest
+$rm -r conftest 2>/dev/null
+
+if test x"$compiler_c_o" = x"yes"; then
+  # Check to see if we can write to a .lo
+  echo $ac_n "checking if $compiler supports -c -o file.lo... $ac_c" 1>&6
+  $rm conftest*
+  echo "int some_variable = 0;" > conftest.c
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -c -o conftest.lo"
+  echo "$progname:862: checking if $compiler supports -c -o file.lo" >&5
+if { (eval echo $progname:863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; then
+
+    # The compiler can only warn and ignore the option if not recognized
+    # So say no if there are warnings
+      if test -s conftest.err; then
+	echo "$ac_t"no 1>&6
+	compiler_o_lo=no
+      else
+	echo "$ac_t"yes 1>&6
+	compiler_o_lo=yes
+      fi
+  else
+    # Append any errors to the config.log.
+    cat conftest.err 1>&5
+    compiler_o_lo=no
+    echo "$ac_t"no 1>&6
+  fi
+  CFLAGS="$save_CFLAGS"
+  $rm conftest*
+else
+  compiler_o_lo=no
+fi
+
+# Check to see if we can do hard links to lock some files if needed
+hard_links="nottested"
+if test "$compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  echo $ac_n "checking if we can lock with hard links... $ac_c" 1>&6
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  echo "$ac_t$hard_links" 1>&6
+  $rm conftest*
+  if test "$hard_links" = no; then
+    echo "*** WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+if test "$with_gcc" = yes; then
+  # Check to see if options -fno-rtti -fno-exceptions are supported by compiler
+  echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c" 1>&6
+  $rm conftest*
+  echo "int some_variable = 0;" > conftest.c
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.c"
+  echo "$progname:914: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+  if { (eval echo $progname:915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then
+
+    # The compiler can only warn and ignore the option if not recognized
+    # So say no if there are warnings
+      if test -s conftest.err; then
+	echo "$ac_t"no 1>&6
+	compiler_rtti_exceptions=no
+      else
+	echo "$ac_t"yes 1>&6
+	compiler_rtti_exceptions=yes
+      fi
+  else
+    # Append any errors to the config.log.
+    cat conftest.err 1>&5
+    compiler_rtti_exceptions=no
+    echo "$ac_t"no 1>&6
+  fi
+  CFLAGS="$save_CFLAGS"
+  $rm conftest*
+
+  if test "$compiler_rtti_exceptions" = "yes"; then
+    no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'
+  else
+    no_builtin_flag=' -fno-builtin'
+  fi
+  
+fi
+
+# Check for any special shared library compilation flags.
+if test -n "$special_shlib_compile_flags"; then
+  echo "$progname: warning: \`$CC' requires \`$special_shlib_compile_flags' to build shared libraries" 1>&2
+  if echo "$old_CC $old_CFLAGS " | egrep -e "[ 	]$special_shlib_compile_flags[ 	]" >/dev/null; then :
+  else
+    echo "$progname: add \`$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure" 1>&2
+    can_build_shared=no
+  fi
+fi
+
+echo $ac_n "checking if $compiler static flag $link_static_flag works... $ac_c" 1>&6
+$rm conftest*
+echo 'main(){return(0);}' > conftest.c
+save_LDFLAGS="$LDFLAGS"
+LDFLAGS="$LDFLAGS $link_static_flag"
+echo "$progname:958: checking if $compiler static flag $link_static_flag works" >&5
+if { (eval echo $progname:959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  echo "$ac_t$link_static_flag" 1>&6
+else
+  echo "$ac_t"none 1>&6
+  link_static_flag=
+fi
+LDFLAGS="$save_LDFLAGS"
+$rm conftest*
+
+if test -z "$LN_S"; then
+  # Check to see if we can use ln -s, or we need hard links.
+  echo $ac_n "checking whether ln -s works... $ac_c" 1>&6
+  $rm conftest.dat
+  if ln -s X conftest.dat 2>/dev/null; then
+    $rm conftest.dat
+    LN_S="ln -s"
+  else
+    LN_S=ln
+  fi
+  if test "$LN_S" = "ln -s"; then
+    echo "$ac_t"yes 1>&6
+  else
+    echo "$ac_t"no 1>&6
+  fi
+fi
+
+# Make sure LD is an absolute path.
+if test -z "$LD"; then
+  ac_prog=ld
+  if test "$with_gcc" = yes; then
+    # Check if gcc -print-prog-name=ld gives a path.
+    echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6
+    echo "$progname:991: checking for ld used by GCC" >&5
+    ac_prog=`($CC -print-prog-name=ld) 2>&5`
+    case "$ac_prog" in
+    # Accept absolute paths.
+    [\\/]* | [A-Za-z]:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the path of ld
+      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+    "")
+      # If it fails, then pretend we are not using GCC.
+      ac_prog=ld
+      ;;
+    *)
+      # If it is relative, then search for the first ld in PATH.
+      with_gnu_ld=unknown
+      ;;
+    esac
+  elif test "$with_gnu_ld" = yes; then
+    echo $ac_n "checking for GNU ld... $ac_c" 1>&6
+    echo "$progname:1015: checking for GNU ld" >&5
+  else
+    echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
+    echo "$progname:1018: checking for non-GNU ld" >&5
+  fi
+
+  if test -z "$LD"; then
+    IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+    for ac_dir in $PATH; do
+      test -z "$ac_dir" && ac_dir=.
+      if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+	LD="$ac_dir/$ac_prog"
+	# Check to see if the program is GNU ld.  I'd rather use --version,
+	# but apparently some GNU ld's only accept -v.
+	# Break only if it was the GNU/non-GNU ld that we prefer.
+	if "$LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+	  test "$with_gnu_ld" != no && break
+	else
+	  test "$with_gnu_ld" != yes && break
+	fi
+      fi
+    done
+    IFS="$ac_save_ifs"
+  fi
+
+  if test -n "$LD"; then
+    echo "$ac_t$LD" 1>&6
+  else
+    echo "$ac_t"no 1>&6
+  fi
+
+  if test -z "$LD"; then
+    echo "$progname: error: no acceptable ld found in \$PATH" 1>&2
+    exit 1
+  fi
+fi
+
+# Check to see if it really is or is not GNU ld.
+echo $ac_n "checking if the linker ($LD) is GNU ld... $ac_c" 1>&6
+# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 &5; then
+  with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+echo "$ac_t$with_gnu_ld" 1>&6
+
+# See if the linker supports building shared libraries.
+echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6
+
+allow_undefined_flag=
+no_undefined_flag=
+need_lib_prefix=unknown
+need_version=unknown
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+archive_cmds=
+archive_expsym_cmds=
+old_archive_from_new_cmds=
+export_dynamic_flag_spec=
+whole_archive_flag_spec=
+thread_safe_flag_spec=
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+hardcode_shlibpath_var=unsupported
+runpath_var=
+always_export_symbols=no
+export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols'
+# include_expsyms should be a list of space-separated symbols to be *always*
+# included in the symbol list
+include_expsyms=
+# exclude_expsyms can be an egrep regular expression of symbols to exclude
+# it will be wrapped by ` (' and `)$', so one must not match beginning or
+# end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+# as well as any symbol that contains `d'.
+exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
+# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+# platforms (ab)use it in PIC code, but their linkers get confused if
+# the symbol is explicitly referenced.  Since portable code cannot
+# rely on this symbol name, it's probably fine to never include it in
+# preloaded symbol tables.
+
+case "$host_os" in
+cygwin* | mingw*)
+  # FIXME: the MSVC++ port hasn't been tested in a loooong time
+  # When not using gcc, we currently assume that we are using
+  # Microsoft Visual C++.
+  if test "$with_gcc" != yes; then
+    with_gnu_ld=no
+  fi
+  ;;
+
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+  # If archive_cmds runs LD, not CC, wlarc should be empty
+  wlarc='${wl}'
+
+  # See if GNU ld supports shared libraries.
+  case "$host_os" in
+  aix3* | aix4*)
+    # On AIX, the GNU linker is very broken
+    ld_shlibs=no
+    cat <&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+    ;;
+
+  amigaos*)
+    archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+
+    # Samuel A. Falvo II  reports
+    # that the semantics of dynamic libraries on AmigaOS, at least up
+    # to version 4, is to share data among multiple programs linked
+    # with the same dynamic library.  Since this doesn't match the
+    # behavior of shared libraries on other platforms, we can use
+    # them.
+    ld_shlibs=no
+    ;;
+
+  beos*)
+    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      allow_undefined_flag=unsupported
+      # Joseph Beckenbach  says some releases of gcc
+      # support --undefined.  This deserves some investigation.  FIXME
+      archive_cmds='$CC -nostart $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;
+
+  cygwin* | mingw*)
+    # hardcode_libdir_flag_spec is actually meaningless, as there is
+    # no search path for DLLs.
+    hardcode_libdir_flag_spec='-L$libdir'
+    allow_undefined_flag=unsupported
+    always_export_symbols=yes
+
+    # Extract the symbol export list from an `--export-all' def file,
+    # then regenerate the def file from the symbol export list, so that
+    # the compiled dll only exports the symbol export list.
+    # Be careful not to strip the DATA tag left by newer dlltools.
+    export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~
+      test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~
+      $DLLTOOL --export-all --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def  $objdir/$soname-ltdll.$objext $libobjs $convenience~
+      sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $objdir/$soname-def > $export_symbols'
+
+    # If DATA tags from a recent dlltool are present, honour them!
+    archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~
+      _lt_hint=1;
+      cat $export_symbols | while read symbol; do
+        set dummy \$symbol;
+        case \$# in
+          2) echo "	\$2 @ \$_lt_hint ; " >> $objdir/$soname-def;;
+          *) echo "     \$2 @ \$_lt_hint \$3 ; " >> $objdir/$soname-def;;
+        esac;
+	_lt_hint=`expr 1 + \$_lt_hint`;
+      done~
+      test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~
+      test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~
+      $CC -Wl,--base-file,$objdir/$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~
+      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~
+      $CC -Wl,--base-file,$objdir/$soname-base $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~
+      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~
+      $CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts'
+
+      old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a' 
+    ;;
+
+  netbsd*)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    else
+      archive_cmds='$LD -Bshareable $libobjs $deplibs $linkopts -o $lib'
+      # can we support soname and/or expsyms with a.out? -oliva
+    fi
+    ;;
+
+  solaris* | sysv5*)
+    if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
+      ld_shlibs=no
+      cat <&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+    elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;      
+
+  sunos4*)
+    archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linkopts'
+    wlarc=
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  *)
+    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;
+  esac
+
+  if test "$ld_shlibs" = yes; then
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    case $host_os in
+    cygwin* | mingw*)
+      # dlltool doesn't understand --whole-archive et. al.
+      whole_archive_flag_spec=
+      ;;
+    *)
+      # ancient GNU ld didn't support --whole-archive et. al.
+      if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then
+        whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+        whole_archive_flag_spec=
+      fi
+      ;;
+    esac
+  fi
+else
+  # PORTME fill in a description of your system's linker (not GNU ld)
+  case "$host_os" in
+  aix3*)
+    allow_undefined_flag=unsupported
+    always_export_symbols=yes
+    archive_expsym_cmds='$LD -o $objdir/$soname $libobjs $deplibs $linkopts -bE:$export_symbols -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname'
+    # Note: this linker hardcodes the directories in LIBPATH if there
+    # are no directories specified by -L.
+    hardcode_minus_L=yes
+    if test "$with_gcc" = yes && test -z "$link_static_flag"; then
+      # Neither direct hardcoding nor static linking is supported with a
+      # broken collect2.
+      hardcode_direct=unsupported
+    fi
+    ;;
+
+  aix4*)
+    hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib'
+    hardcode_libdir_separator=':'
+    if test "$with_gcc" = yes; then
+      collect2name=`${CC} -print-prog-name=collect2`
+      if test -f "$collect2name" && \
+	 strings "$collect2name" | grep resolve_lib_name >/dev/null
+      then
+	# We have reworked collect2
+	hardcode_direct=yes
+      else
+	# We have old collect2
+	hardcode_direct=unsupported
+	# It fails to find uninstalled libraries when the uninstalled
+	# path is not listed in the libpath.  Setting hardcode_minus_L
+	# to unsupported forces relinking
+	hardcode_minus_L=yes
+	hardcode_libdir_flag_spec='-L$libdir'
+	hardcode_libdir_separator=
+      fi
+      shared_flag='-shared'
+    else
+      shared_flag='${wl}-bM:SRE'
+      hardcode_direct=yes
+    fi
+    allow_undefined_flag=' ${wl}-berok'
+    archive_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bexpall ${wl}-bnoentry${allow_undefined_flag}'
+    archive_expsym_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}'
+    case "$host_os" in aix4.[01]|aix4.[01].*)
+      # According to Greg Wooledge, -bexpall is only supported from AIX 4.2 on
+      always_export_symbols=yes ;;
+    esac
+   ;;
+
+  amigaos*)
+    archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+    # see comment about different semantics on the GNU ld section
+    ld_shlibs=no
+    ;;
+
+  cygwin* | mingw*)
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    # hardcode_libdir_flag_spec is actually meaningless, as there is
+    # no search path for DLLs.
+    hardcode_libdir_flag_spec=' '
+    allow_undefined_flag=unsupported
+    # Tell ltmain to make .lib files, not .a files.
+    libext=lib
+    # FIXME: Setting linknames here is a bad hack.
+    archive_cmds='$CC -o $lib $libobjs $linkopts `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+    # The linker will automatically build a .lib file if we build a DLL.
+    old_archive_from_new_cmds='true'
+    # FIXME: Should let the user specify the lib program.
+    old_archive_cmds='lib /OUT:$oldlib$oldobjs'
+    fix_srcfile_path='`cygpath -w $srcfile`'
+    ;;
+
+  freebsd1*)
+    ld_shlibs=no
+    ;;
+
+  # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+  # support.  Future versions do this automatically, but an explicit c++rt0.o
+  # does not break anything, and helps significantly (at the cost of a little
+  # extra space).
+  freebsd2.2*)
+    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts /usr/lib/c++rt0.o'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+  freebsd2*)
+    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'
+    hardcode_direct=yes
+    hardcode_minus_L=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+  freebsd*)
+    archive_cmds='$CC -shared -o $lib $libobjs $deplibs $linkopts'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  hpux9* | hpux10* | hpux11*)
+    case "$host_os" in
+    hpux9*) archive_cmds='$rm $objdir/$soname~$LD -b +b $install_libdir -o $objdir/$soname $libobjs $deplibs $linkopts~test $objdir/$soname = $lib || mv $objdir/$soname $lib' ;;
+    *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linkopts' ;;
+    esac
+    hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+    hardcode_libdir_separator=:
+    hardcode_direct=yes
+    hardcode_minus_L=yes # Not in the search PATH, but as the default
+			 # location of the library.
+    export_dynamic_flag_spec='${wl}-E'
+    ;;
+
+  irix5* | irix6*)
+    if test "$with_gcc" = yes; then
+      archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+    else
+      archive_cmds='$LD -shared $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+    fi
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    ;;
+
+  netbsd*)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'  # a.out
+    else
+      archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linkopts'      # ELF
+    fi
+    hardcode_libdir_flag_spec='${wl}-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  openbsd*)
+    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  os2*)
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+    allow_undefined_flag=unsupported
+    archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $objdir/$libname.def~$echo DATA >> $objdir/$libname.def~$echo " SINGLE NONSHARED" >> $objdir/$libname.def~$echo EXPORTS >> $objdir/$libname.def~emxexp $libobjs >> $objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $linkopts $objdir/$libname.def'
+    old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def'
+    ;;
+
+  osf3*)
+    if test "$with_gcc" = yes; then
+      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+    else
+      allow_undefined_flag=' -expect_unresolved \*'
+      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+    fi
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    ;;
+
+  osf4* | osf5*)  # As osf3* with the addition of the -msym flag
+    if test "$with_gcc" = yes; then
+      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+    else
+      allow_undefined_flag=' -expect_unresolved \*'
+      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+    fi
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    ;;
+  rhapsody*)
+    archive_cmds='$CC -bundle -undefined suppress -o $lib $libobjs $deplibs $linkopts'
+    hardcode_libdir_flags_spec='-L$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+                                       
+  sco3.2v5*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+    hardcode_shlibpath_var=no
+    runpath_var=LD_RUN_PATH
+    hardcode_runpath_var=yes
+    ;;
+
+  solaris*)
+    no_undefined_flag=' -z text'
+    # $CC -shared without GNU ld will not create a library from C++
+    # object files and a static libstdc++, better avoid it by now
+    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts'
+    archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_shlibpath_var=no
+    case "$host_os" in
+    solaris2.[0-5] | solaris2.[0-5].*) ;;
+    *) # Supported since Solaris 2.6 (maybe 2.5.1?)
+      whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
+    esac
+    ;;
+
+  sunos4*)
+    archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linkopts'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_direct=yes
+    hardcode_minus_L=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  sysv4)
+    if test "x$host_vendor" = xsequent; then
+      # Use $CC to link under sequent, because it throws in some extra .o 
+      # files that make .init and .fini sections work.
+      archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $linkopts'
+    else
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+    fi
+    runpath_var='LD_RUN_PATH'
+    hardcode_shlibpath_var=no
+    hardcode_direct=no #Motorola manual says yes, but my tests say they lie 
+    ;;  
+
+  sysv4.3*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+    hardcode_shlibpath_var=no
+    export_dynamic_flag_spec='-Bexport'
+    ;;
+
+  sysv5*)
+    no_undefined_flag=' -z text'
+    # $CC -shared without GNU ld will not create a library from C++
+    # object files and a static libstdc++, better avoid it by now
+    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts'
+    archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp'
+    hardcode_libdir_flag_spec=
+    hardcode_shlibpath_var=no
+    runpath_var='LD_RUN_PATH'
+    ;;
+
+  uts4*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_shlibpath_var=no
+    ;;
+
+  dgux*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_shlibpath_var=no
+    ;;
+
+  sysv4*MP*)
+    if test -d /usr/nec; then
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+      hardcode_shlibpath_var=no
+      runpath_var=LD_RUN_PATH
+      hardcode_runpath_var=yes
+      ld_shlibs=yes
+    fi
+    ;;
+
+  sysv4.2uw2*)
+    archive_cmds='$LD -G -o $lib $libobjs $deplibs $linkopts'
+    hardcode_direct=yes
+    hardcode_minus_L=no
+    hardcode_shlibpath_var=no
+    hardcode_runpath_var=yes
+    runpath_var=LD_RUN_PATH
+    ;;
+
+  unixware7*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+    runpath_var='LD_RUN_PATH'
+    hardcode_shlibpath_var=no
+    ;;
+
+  *)
+    ld_shlibs=no
+    ;;
+  esac
+fi
+echo "$ac_t$ld_shlibs" 1>&6
+test "$ld_shlibs" = no && can_build_shared=no
+
+if test -z "$NM"; then
+  echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6
+  case "$NM" in
+  [\\/]* | [A-Za-z]:[\\/]*) ;; # Let the user override the test with a path.
+  *)
+    IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+    for ac_dir in $PATH /usr/ucb /usr/ccs/bin /bin; do
+      test -z "$ac_dir" && ac_dir=.
+      if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+	  NM="$ac_dir/nm -B"
+	  break
+	elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+	  NM="$ac_dir/nm -p"
+	  break
+	else
+	  NM=${NM="$ac_dir/nm"} # keep the first match, but
+	  continue # so that we can try to find one that supports BSD flags
+	fi
+      fi
+    done
+    IFS="$ac_save_ifs"
+    test -z "$NM" && NM=nm
+    ;;
+  esac
+  echo "$ac_t$NM" 1>&6
+fi
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
+
+# Define system-specific variables.
+case "$host_os" in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*) # Its linker distinguishes data from code symbols
+  global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'"
+  ;;
+irix*)
+  symcode='[BCDEGRST]'
+  ;;
+solaris*)
+  symcode='[BDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+  symcode='[ABCDGISTW]'
+fi
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Write the raw and C identifiers.
+  global_symbol_pipe="sed -n -e 's/^.*[ 	]\($symcode\)[ 	][ 	]*\($ac_symprfx\)$sympat$/$symxfrm/p'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+  $rm conftest*
+  cat > conftest.c <&5
+  if { (eval echo $progname:1654: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { echo "$progname:1657: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then
+
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if egrep ' nm_test_var$' "$nlist" >/dev/null; then
+	if egrep ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat < conftest.c
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+	  # Now generate the symbol file.
+	  eval "$global_symbol_to_cdecl"' < "$nlist" >> conftest.c'
+
+	  cat <> conftest.c
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+  const char *name;
+  lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+	  sed 's/^. \(.*\) \(.*\)$/  {"\2", (lt_ptr_t) \&\2},/' < "$nlist" >> conftest.c
+	  cat <<\EOF >> conftest.c
+  {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+	  # Now try linking the two files.
+	  mv conftest.$objext conftstm.$objext
+	  save_LIBS="$LIBS"
+	  save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$objext"
+	  CFLAGS="$CFLAGS$no_builtin_flag"
+	  if { (eval echo $progname:1709: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+	    pipe_works=yes
+	  else
+	    echo "$progname: failed program was:" >&5
+	    cat conftest.c >&5
+	  fi
+	  LIBS="$save_LIBS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.c >&5
+  fi
+  $rm conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    global_symbol_pipe=
+  fi
+done
+if test "$pipe_works" = yes; then
+  echo "${ac_t}ok" 1>&6
+else
+  echo "${ac_t}failed" 1>&6
+fi
+
+if test -z "$global_symbol_pipe"; then
+  global_symbol_to_cdecl=
+fi
+
+# Check hardcoding attributes.
+echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+   test -n "$runpath_var"; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$hardcode_shlibpath_var" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+echo "$ac_t$hardcode_action" 1>&6
+
+
+reload_flag=
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6
+# PORTME Some linkers may need a different reload flag.
+reload_flag='-r'
+echo "$ac_t$reload_flag" 1>&6
+test -n "$reload_flag" && reload_flag=" $reload_flag"
+
+# PORTME Fill in your ld.so characteristics
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+file_magic_cmd=
+file_magic_test_file=
+deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [regex]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given egrep regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6
+case "$host_os" in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}.so$major'
+  ;;
+
+aix4*)
+  version_type=linux
+  # AIX has no versioning support, so currently we can not hardcode correct
+  # soname into executable. Probably we can add versioning support to
+  # collect2, so additional links can be useful in future.
+  # We preserve .a as extension for shared libraries though AIX4.2
+  # and later linker supports .so
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.a'
+  shlibpath_var=LIBPATH
+  deplibs_check_method=pass_all
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}.so'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  deplibs_check_method=pass_all
+  lt_cv_dlopen="load_add_on"
+  lt_cv_dlopen_libs=
+  lt_cv_dlopen_self=yes
+  ;;
+
+bsdi4*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  file_magic_cmd=/usr/bin/file
+  file_magic_test_file=/shlib/libc.so
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  export_dynamic_flag_spec=-rdynamic
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw*)
+  version_type=windows
+  need_version=no
+  need_lib_prefix=no
+  if test "$with_gcc" = yes; then
+    library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a'
+  else
+    library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib'
+  fi
+  dynamic_linker='Win32 ld.exe'
+  deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+  file_magic_cmd='${OBJDUMP} -f'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  lt_cv_dlopen="LoadLibrary"
+  lt_cv_dlopen_libs=
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+  
+freebsd*)
+  objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+  version_type=freebsd-$objformat
+  case "$version_type" in
+    freebsd-elf*)
+      deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object'
+      file_magic_cmd=/usr/bin/file
+      file_magic_test_file=`echo /usr/lib/libc.so*`
+      library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      deplibs_check_method=unknown
+      library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case "$host_os" in
+  freebsd2* | freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  *) # from 3.2 on
+    shlibpath_overrides_runpath=no
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  dynamic_linker="$host_os dld.sl"
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  shlibpath_var=SHLIB_PATH
+  shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+  library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'
+  soname_spec='${libname}${release}.sl$major'
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  case "$host_os" in
+  hpux10.20*)
+    # TODO:  Does this work for hpux-11 too?
+    deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+    file_magic_cmd=/usr/bin/file
+    file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+irix5* | irix6*)
+  version_type=irix
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}.so.$major'
+  library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major ${libname}${release}.so $libname.so'
+  case "$host_os" in
+  irix5*)
+    libsuff= shlibsuff=
+    # this will be overridden with pass_all, but let us keep it just in case
+    deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1"
+    ;;
+  *)
+    case "$LD" in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  file_magic_cmd=/usr/bin/file
+  file_magic_test_file=`echo /lib${libsuff}/libc.so*`
+  deplibs_check_method='pass_all'
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux-gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  deplibs_check_method=pass_all
+
+  if test -f /lib/ld.so.1; then
+    dynamic_linker='GNU ld.so'
+  else
+    # Only the GNU ld.so supports shared libraries on MkLinux.
+    case "$host_cpu" in
+    powerpc*) dynamic_linker=no ;;
+    *) dynamic_linker='Linux ld.so' ;;
+    esac
+  fi
+  ;;
+
+netbsd*)
+  version_type=sunos
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so'
+    soname_spec='${libname}${release}.so$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+openbsd*)
+  version_type=sunos
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+    need_version=no
+  fi
+  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+os2*)
+  libname_spec='$name'
+  need_lib_prefix=no
+  library_names_spec='$libname.dll $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_version=no
+  soname_spec='${libname}${release}.so'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+  shlibpath_var=LD_LIBRARY_PATH
+  # this will be overridden with pass_all, but let us keep it just in case
+  deplibs_check_method='file_magic COFF format alpha shared library'
+  file_magic_cmd=/usr/bin/file
+  file_magic_test_file=/shlib/libc.so
+  deplibs_check_method='pass_all'
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rhapsody*)
+  version_type=sunos
+  library_names_spec='${libname}.so'
+  soname_spec='${libname}.so'
+  shlibpath_var=DYLD_LIBRARY_PATH
+  deplibs_check_method=pass_all
+  ;;
+
+sco3.2v5*)
+  version_type=osf
+  soname_spec='${libname}${release}.so$major'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  deplibs_check_method="file_magic ELF [0-9][0-9]-bit [LM]SB dynamic lib"
+  file_magic_cmd=/usr/bin/file
+  file_magic_test_file=/lib/libc.so
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case "$host_vendor" in
+    sequent)
+      file_magic_cmd='/bin/file'
+      deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+      ;;
+    ncr)
+      deplibs_check_method='pass_all'
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+      file_magic_cmd=/usr/bin/file
+      file_magic_test_file=`echo /usr/lib/libc.so*`
+      ;;
+  esac
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so'
+    soname_spec='$libname.so.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+echo "$ac_t$dynamic_linker" 1>&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+# Report the final consequences.
+echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6
+
+# Only try to build win32 dlls if AC_LIBTOOL_WIN32_DLL was used in
+# configure.in, otherwise build static only libraries.
+case "$host_os" in
+cygwin* | mingw* | os2*)
+  if test x$can_build_shared = xyes; then
+    test x$enable_win32_dll = xno && can_build_shared=no
+    echo "checking if package supports dlls... $can_build_shared" 1>&6
+  fi
+;;
+esac
+
+if test -n "$file_magic_test_file" && test -n "$file_magic_cmd"; then
+  case "$deplibs_check_method" in
+  "file_magic "*)
+    file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
+    if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+       egrep "$file_magic_regex" > /dev/null; then
+      :
+    else
+      cat <&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+    fi ;;
+  esac
+fi
+
+echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case "$host_os" in
+aix3*)
+  test "$enable_shared" = yes && enable_static=no
+  if test -n "$RANLIB"; then
+    archive_cmds="$archive_cmds~\$RANLIB \$lib"
+    postinstall_cmds='$RANLIB $lib'
+  fi
+  ;;
+
+aix4*)
+  test "$enable_shared" = yes && enable_static=no
+  ;;
+esac
+
+echo "$ac_t$enable_shared" 1>&6
+
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+
+echo "checking whether to build static libraries... $enable_static" 1>&6
+
+if test "$hardcode_action" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+echo $ac_n "checking for objdir... $ac_c" 1>&6
+rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+echo "$ac_t$objdir" 1>&6
+
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+if eval "test \"`echo '$''{'lt_cv_dlopen'+set}'`\" != set"; then
+  lt_cv_dlopen=no lt_cv_dlopen_libs=
+echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
+echo "$progname:2248: checking for dlopen in -ldl" >&5
+ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-ldl  $LIBS"
+cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "$progname: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for dlopen""... $ac_c" 1>&6
+echo "$progname:2288: checking for dlopen" >&5
+if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_dlopen) || defined (__stub___dlopen)
+choke me
+#else
+dlopen();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo $progname:2318: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_dlopen=yes"
+else
+  echo "$progname: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_dlopen=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  lt_cv_dlopen="dlopen"
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6
+echo "$progname:2335: checking for dld_link in -ldld" >&5
+ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-ldld  $LIBS"
+cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "$progname: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for shl_load""... $ac_c" 1>&6
+echo "$progname:2375: checking for shl_load" >&5
+if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_shl_load) || defined (__stub___shl_load)
+choke me
+#else
+shl_load();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo $progname:2405: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_shl_load=yes"
+else
+  echo "$progname: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_shl_load=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'shl_load`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  lt_cv_dlopen="shl_load"
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
+echo "$progname:2423: checking for shl_load in -ldld" >&5
+ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-ldld  $LIBS"
+cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "$progname: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+fi
+
+    
+fi
+
+  
+fi
+
+
+fi
+
+fi
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  fi
+
+  case "$lt_cv_dlopen" in
+  dlopen)
+for ac_hdr in dlfcn.h; do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "$progname:2488: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <
+int fnord = 0;
+EOF
+ac_try="$ac_compile >/dev/null 2>conftest.out"
+{ (eval echo $progname:2498: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "$progname: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+    if test "x$ac_cv_header_dlfcn_h" = xyes; then
+      CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+    fi
+    eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+  echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6
+echo "$progname:2526: checking whether a program can dlopen itself" >&5
+if test "${lt_cv_dlopen_self+set}" = set; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+    lt_cv_dlopen_self=cross
+  else
+    cat > conftest.c <
+#endif
+
+#include 
+
+#ifdef RTLD_GLOBAL
+# define LTDL_GLOBAL	RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+#  define LTDL_GLOBAL	DL_GLOBAL
+# else
+#  define LTDL_GLOBAL	0
+# endif
+#endif
+
+/* We may have to define LTDL_LAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LTDL_LAZY_OR_NOW
+# ifdef RTLD_LAZY
+#  define LTDL_LAZY_OR_NOW	RTLD_LAZY
+# else
+#  ifdef DL_LAZY
+#   define LTDL_LAZY_OR_NOW	DL_LAZY
+#  else
+#   ifdef RTLD_NOW
+#    define LTDL_LAZY_OR_NOW	RTLD_NOW
+#   else
+#    ifdef DL_NOW
+#     define LTDL_LAZY_OR_NOW	DL_NOW
+#    else
+#     define LTDL_LAZY_OR_NOW	0
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+fnord() { int i=42;}
+main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW);
+    if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord");
+	       if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } 
+
+EOF
+if { (eval echo $progname:2580: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+  lt_cv_dlopen_self=yes
+else
+  echo "$progname: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  lt_cv_dlopen_self=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$lt_cv_dlopen_self" 1>&6
+
+  if test "$lt_cv_dlopen_self" = yes; then
+    LDFLAGS="$LDFLAGS $link_static_flag"
+  echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6
+echo "$progname:2599: checking whether a statically linked program can dlopen itself" >&5
+if test "${lt_cv_dlopen_self_static+set}" = set; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+    lt_cv_dlopen_self_static=cross
+  else
+    cat > conftest.c <
+#endif
+
+#include 
+
+#ifdef RTLD_GLOBAL
+# define LTDL_GLOBAL	RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+#  define LTDL_GLOBAL	DL_GLOBAL
+# else
+#  define LTDL_GLOBAL	0
+# endif
+#endif
+
+/* We may have to define LTDL_LAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LTDL_LAZY_OR_NOW
+# ifdef RTLD_LAZY
+#  define LTDL_LAZY_OR_NOW	RTLD_LAZY
+# else
+#  ifdef DL_LAZY
+#   define LTDL_LAZY_OR_NOW	DL_LAZY
+#  else
+#   ifdef RTLD_NOW
+#    define LTDL_LAZY_OR_NOW	RTLD_NOW
+#   else
+#    ifdef DL_NOW
+#     define LTDL_LAZY_OR_NOW	DL_NOW
+#    else
+#     define LTDL_LAZY_OR_NOW	0
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+fnord() { int i=42;}
+main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW);
+    if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord");
+    if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } 
+
+EOF
+if { (eval echo $progname:2653: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+  lt_cv_dlopen_self_static=yes
+else
+  echo "$progname: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  lt_cv_dlopen_self_static=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6
+fi
+    ;;
+  esac
+
+  case "$lt_cv_dlopen_self" in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case "$lt_cv_dlopen_self_static" in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+# Copy echo and quote the copy, instead of the original, because it is
+# used later.
+ltecho="$echo"
+if test "X$ltecho" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+   ltecho="$CONFIG_SHELL \$0 --fallback-echo"
+fi
+LTSHELL="$SHELL"
+
+LTCONFIG_VERSION="$VERSION"
+
+# Only quote variables if we're using ltmain.sh.
+case "$ltmain" in
+*.sh)
+  # Now quote all the things that may contain metacharacters.
+  for var in ltecho old_CC old_CFLAGS old_CPPFLAGS \
+    old_LD old_LDFLAGS old_LIBS \
+    old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS \
+    AR CC LD LN_S NM LTSHELL LTCONFIG_VERSION \
+    reload_flag reload_cmds wl \
+    pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
+    thread_safe_flag_spec whole_archive_flag_spec libname_spec \
+    library_names_spec soname_spec \
+    RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
+    old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds postuninstall_cmds \
+    file_magic_cmd export_symbols_cmds deplibs_check_method allow_undefined_flag no_undefined_flag \
+    finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \
+    hardcode_libdir_flag_spec hardcode_libdir_separator  \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do
+
+    case "$var" in
+    reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    export_symbols_cmds | archive_cmds | archive_expsym_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case "$ltecho" in
+  *'\$0 --fallback-echo"')
+    ltecho=`$echo "X$ltecho" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+    ;;
+  esac
+
+  trap "$rm \"$ofile\"; exit 1" 1 2 15
+  echo "creating $ofile"
+  $rm "$ofile"
+  cat < "$ofile"
+#! $SHELL
+
+# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh.
+#
+# Copyright (C) 1996-1999 Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit , 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="sed -e s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+### BEGIN LIBTOOL CONFIG
+EOF
+  cfgfile="$ofile"
+  ;;
+
+*)
+  # Double-quote the variables that need it (for aesthetics).
+  for var in old_CC old_CFLAGS old_CPPFLAGS \
+    old_LD old_LDFLAGS old_LIBS \
+    old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS; do
+    eval "$var=\\\"\$var\\\""
+  done
+
+  # Just create a config file.
+  cfgfile="$ofile.cfg"
+  trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+  echo "creating $cfgfile"
+  $rm "$cfgfile"
+  cat < "$cfgfile"
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+EOF
+  ;;
+esac
+
+cat <> "$cfgfile"
+# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\
+# LD=$old_LD LDFLAGS=$old_LDFLAGS LIBS=$old_LIBS \\
+# NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \\
+# DLLTOOL=$old_DLLTOOL OBJDUMP=$old_OBJDUMP AS=$old_AS \\
+#   $0$ltconfig_args
+#
+# Compiler and other test output produced by $progname, useful for
+# debugging $progname, is in ./config.log if it exists.
+
+# The version of $progname that generated this script.
+LTCONFIG_VERSION=$LTCONFIG_VERSION
+
+# Shell to use when invoking shell scripts.
+SHELL=$LTSHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+
+# An echo program that does not interpret backslashes.
+echo=$ltecho
+
+# The archiver.
+AR=$AR
+
+# The default C compiler.
+CC=$CC
+
+# The linker used to build libraries.
+LD=$LD
+
+# Whether we need hard or soft links.
+LN_S=$LN_S
+
+# A BSD-compatible nm program.
+NM=$NM
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$reload_flag
+reload_cmds=$reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$wl
+
+# Object file suffix (normally "o").
+objext="$objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$pic_flag
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$compiler_c_o
+
+# Can we write directly to a .lo ?
+compiler_o_lo=$compiler_o_lo
+
+# Must we lock files when doing compilation ?
+need_locks=$need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$link_static_flag
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$no_builtin_flag
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$whole_archive_flag_spec
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$RANLIB
+old_archive_cmds=$old_archive_cmds
+old_postinstall_cmds=$old_postinstall_cmds
+old_postuninstall_cmds=$old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$old_archive_from_new_cmds
+
+# Commands used to build and install a shared archive.
+archive_cmds=$archive_cmds
+archive_expsym_cmds=$archive_expsym_cmds
+postinstall_cmds=$postinstall_cmds
+postuninstall_cmds=$postuninstall_cmds
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$global_symbol_to_cdecl
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$hardcode_libdir_flag_spec
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$hardcode_libdir_separator
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$include_expsyms
+
+EOF
+
+case "$ltmain" in
+*.sh)
+  echo '### END LIBTOOL CONFIG' >> "$ofile"
+  echo >> "$ofile"
+  case "$host_os" in
+  aix3*)
+    cat <<\EOF >> "$ofile"
+
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+EOF
+    ;;
+  esac
+
+  # Append the ltmain.sh script.
+  sed '$q' "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1)
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+
+  chmod +x "$ofile"
+  ;;
+
+*)
+  # Compile the libtool program.
+  echo "FIXME: would compile $ltmain"
+  ;;
+esac
+
+test -n "$cache_file" || exit 0
+
+# AC_CACHE_SAVE
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs.  It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already.  You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+  case `(ac_space=' '; set | grep ac_space) 2>&1` in
+  *ac_space=\ *)
+    # `set' does not quote correctly, so add quotes (double-quote substitution
+    # turns \\\\ into \\, and sed turns \\ into \).
+    sed -n \
+      -e "s/'/'\\\\''/g" \
+      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+    ;;
+  *)
+    # `set' quotes correctly as required by POSIX, so do not add quotes.
+    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+    ;;
+  esac >> confcache
+if cmp -s $cache_file confcache; then
+  :
+else
+  if test -w $cache_file; then
+    echo "updating cache $cache_file"
+    cat confcache > $cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+exit 0
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/ltmain.sh b/ltmain.sh
new file mode 100644
index 00000000..766732da
--- /dev/null
+++ b/ltmain.sh
@@ -0,0 +1,4024 @@
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun ltconfig.
+#
+# Copyright (C) 1996-1999 Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit , 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Check that we have a working $echo.
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell, and then maybe $echo will work.
+  exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <&2
+  echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+  exit 1
+fi
+
+if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+  echo "$modename: not configured to build any kind of library" 1>&2
+  echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+  exit 1
+fi
+
+# Global variables.
+mode=$default_mode
+nonopt=
+prev=
+prevopt=
+run=
+show="$echo"
+show_help=
+execute_dlfiles=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+
+# Parse our command line options once, thoroughly.
+while test $# -gt 0
+do
+  arg="$1"
+  shift
+
+  case "$arg" in
+  -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) optarg= ;;
+  esac
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$prev"; then
+    case "$prev" in
+    execute_dlfiles)
+      eval "$prev=\"\$$prev \$arg\""
+      ;;
+    *)
+      eval "$prev=\$arg"
+      ;;
+    esac
+
+    prev=
+    prevopt=
+    continue
+  fi
+
+  # Have we seen a non-optional argument yet?
+  case "$arg" in
+  --help)
+    show_help=yes
+    ;;
+
+  --version)
+    echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
+    exit 0
+    ;;
+
+  --config)
+    sed -e '1,/^### BEGIN LIBTOOL CONFIG/d' -e '/^### END LIBTOOL CONFIG/,$d' $0
+    exit 0
+    ;;
+
+  --debug)
+    echo "$progname: enabling shell trace mode"
+    set -x
+    ;;
+
+  --dry-run | -n)
+    run=:
+    ;;
+
+  --features)
+    echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+    exit 0
+    ;;
+
+  --finish) mode="finish" ;;
+
+  --mode) prevopt="--mode" prev=mode ;;
+  --mode=*) mode="$optarg" ;;
+
+  --quiet | --silent)
+    show=:
+    ;;
+
+  -dlopen)
+    prevopt="-dlopen"
+    prev=execute_dlfiles
+    ;;
+
+  -*)
+    $echo "$modename: unrecognized option \`$arg'" 1>&2
+    $echo "$help" 1>&2
+    exit 1
+    ;;
+
+  *)
+    nonopt="$arg"
+    break
+    ;;
+  esac
+done
+
+if test -n "$prevopt"; then
+  $echo "$modename: option \`$prevopt' requires an argument" 1>&2
+  $echo "$help" 1>&2
+  exit 1
+fi
+
+if test -z "$show_help"; then
+
+  # Infer the operation mode.
+  if test -z "$mode"; then
+    case "$nonopt" in
+    *cc | *++ | gcc* | *-gcc*)
+      mode=link
+      for arg
+      do
+	case "$arg" in
+	-c)
+	   mode=compile
+	   break
+	   ;;
+	esac
+      done
+      ;;
+    *db | *dbx | *strace | *truss)
+      mode=execute
+      ;;
+    *install*|cp|mv)
+      mode=install
+      ;;
+    *rm)
+      mode=uninstall
+      ;;
+    *)
+      # If we have no mode, but dlfiles were specified, then do execute mode.
+      test -n "$execute_dlfiles" && mode=execute
+
+      # Just use the default operation mode.
+      if test -z "$mode"; then
+	if test -n "$nonopt"; then
+	  $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
+	else
+	  $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
+	fi
+      fi
+      ;;
+    esac
+  fi
+
+  # Only execute mode is allowed to have -dlopen flags.
+  if test -n "$execute_dlfiles" && test "$mode" != execute; then
+    $echo "$modename: unrecognized option \`-dlopen'" 1>&2
+    $echo "$help" 1>&2
+    exit 1
+  fi
+
+  # Change the help message to a mode-specific one.
+  generic_help="$help"
+  help="Try \`$modename --help --mode=$mode' for more information."
+
+  # These modes are in order of execution frequency so that they run quickly.
+  case "$mode" in
+  # libtool compile mode
+  compile)
+    modename="$modename: compile"
+    # Get the compilation command and the source file.
+    base_compile=
+    lastarg=
+    srcfile="$nonopt"
+    suppress_output=
+
+    user_target=no
+    for arg
+    do
+      # Accept any command-line options.
+      case "$arg" in
+      -o)
+	if test "$user_target" != "no"; then
+	  $echo "$modename: you cannot specify \`-o' more than once" 1>&2
+	  exit 1
+	fi
+	user_target=next
+	;;
+
+      -static)
+	build_old_libs=yes
+	continue
+	;;
+      esac
+
+      case "$user_target" in
+      next)
+	# The next one is the -o target name
+	user_target=yes
+	continue
+	;;
+      yes)
+	# We got the output file
+	user_target=set
+	libobj="$arg"
+	continue
+	;;
+      esac
+
+      # Accept the current argument as the source file.
+      lastarg="$srcfile"
+      srcfile="$arg"
+
+      # Aesthetically quote the previous argument.
+
+      # Backslashify any backslashes, double quotes, and dollar signs.
+      # These are the only characters that are still specially
+      # interpreted inside of double-quoted scrings.
+      lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
+
+      # Double-quote args containing other shell metacharacters.
+      # Many Bourne shells cannot handle close brackets correctly in scan
+      # sets, so we specify it separately.
+      case "$lastarg" in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+	lastarg="\"$lastarg\""
+	;;
+      esac
+
+      # Add the previous argument to base_compile.
+      if test -z "$base_compile"; then
+	base_compile="$lastarg"
+      else
+	base_compile="$base_compile $lastarg"
+      fi
+    done
+
+    case "$user_target" in
+    set)
+      ;;
+    no)
+      # Get the name of the library object.
+      libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+      ;;
+    *)
+      $echo "$modename: you must specify a target with \`-o'" 1>&2
+      exit 1
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    xform='[cCFSfmso]'
+    case "$libobj" in
+    *.ada) xform=ada ;;
+    *.adb) xform=adb ;;
+    *.ads) xform=ads ;;
+    *.asm) xform=asm ;;
+    *.c++) xform=c++ ;;
+    *.cc) xform=cc ;;
+    *.cpp) xform=cpp ;;
+    *.cxx) xform=cxx ;;
+    *.f90) xform=f90 ;;
+    *.for) xform=for ;;
+    esac
+
+    libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
+
+    case "$libobj" in
+    *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+    *)
+      $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
+      exit 1
+      ;;
+    esac
+
+    if test -z "$base_compile"; then
+      $echo "$modename: you must specify a compilation command" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $libobj"
+    else
+      removelist="$libobj"
+    fi
+
+    $run $rm $removelist
+    trap "$run $rm $removelist; exit 1" 1 2 15
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\..*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+      removelist="$removelist $output_obj $lockfile"
+      trap "$run $rm $removelist; exit 1" 1 2 15
+    else
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until ln "$0" "$lockfile" 2>/dev/null; do
+	$show "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	echo "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit 1
+      fi
+      echo $srcfile > "$lockfile"
+    fi
+
+    if test -n "$fix_srcfile_path"; then
+      eval srcfile=\"$fix_srcfile_path\"
+    fi
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      # All platforms use -DPIC, to notify preprocessed assembler code.
+      command="$base_compile $srcfile $pic_flag -DPIC"
+      if test "$build_old_libs" = yes; then
+	lo_libobj="$libobj"
+	dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
+	if test "X$dir" = "X$libobj"; then
+	  dir="$objdir"
+	else
+	  dir="$dir/$objdir"
+	fi
+	libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'`
+
+	if test -d "$dir"; then
+	  $show "$rm $libobj"
+	  $run $rm $libobj
+	else
+	  $show "$mkdir $dir"
+	  $run $mkdir $dir
+	  status=$?
+	  if test $status -ne 0 && test ! -d $dir; then
+	    exit $status
+	  fi
+	fi
+      fi
+      if test "$compiler_o_lo" = yes; then
+	output_obj="$libobj"
+	command="$command -o $output_obj"
+      elif test "$compiler_c_o" = yes; then
+	output_obj="$obj"
+	command="$command -o $output_obj"
+      fi
+
+      $run $rm "$output_obj"
+      $show "$command"
+      if $run eval "$command"; then :
+      else
+	test -n "$output_obj" && $run $rm $removelist
+	exit 1
+      fi
+
+      if test "$need_locks" = warn &&
+	 test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then
+	echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit 1
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test x"$output_obj" != x"$libobj"; then
+	$show "$mv $output_obj $libobj"
+	if $run $mv $output_obj $libobj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # If we have no pic_flag, then copy the object into place and finish.
+      if test -z "$pic_flag" && test "$build_old_libs" = yes; then
+	# Rename the .lo from within objdir to obj
+	if test -f $obj; then
+	  $show $rm $obj
+	  $run $rm $obj
+	fi
+
+	$show "$mv $libobj $obj"
+	if $run $mv $libobj $obj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+
+	xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+	if test "X$xdir" = "X$obj"; then
+	  xdir="."
+	else
+	  xdir="$xdir"
+	fi
+	baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"`
+	libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
+	# Now arrange that obj and lo_libobj become the same file
+	$show "(cd $xdir && $LN_S $baseobj $libobj)"
+	if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then
+	  exit 0
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # Allow error messages only from the first compilation.
+      suppress_output=' >/dev/null 2>&1'
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      command="$base_compile $srcfile"
+      if test "$compiler_c_o" = yes; then
+	command="$command -o $obj"
+	output_obj="$obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      command="$command$suppress_output"
+      $run $rm "$output_obj"
+      $show "$command"
+      if $run eval "$command"; then :
+      else
+	$run $rm $removelist
+	exit 1
+      fi
+
+      if test "$need_locks" = warn &&
+	 test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then
+	echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit 1
+      fi
+
+      # Just move the object if needed
+      if test x"$output_obj" != x"$obj"; then
+	$show "$mv $output_obj $obj"
+	if $run $mv $output_obj $obj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # Create an invalid libtool object if no PIC, so that we do not
+      # accidentally link it into a program.
+      if test "$build_libtool_libs" != yes; then
+	$show "echo timestamp > $libobj"
+	$run eval "echo timestamp > \$libobj" || exit $?
+      else
+	# Move the .lo from within objdir
+	$show "$mv $libobj $lo_libobj"
+	if $run $mv $libobj $lo_libobj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+    fi
+
+    # Unlock the critical section if it was locked
+    if test "$need_locks" != no; then
+      $rm "$lockfile"
+    fi
+
+    exit 0
+    ;;
+
+  # libtool link mode
+  link)
+    modename="$modename: link"
+    case "$host" in
+    *-*-cygwin* | *-*-mingw* | *-*-os2*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invokation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+
+      # This is a source program that is used to create dlls on Windows
+      # Don't remove nor modify the starting and closing comments
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include 
+# #undef WIN32_LEAN_AND_MEAN
+# #include 
+#
+# #ifndef __CYGWIN__
+# #  ifdef __CYGWIN32__
+# #    define __CYGWIN__ __CYGWIN32__
+# #  endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include 
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+#   __hDllInstance_base = hInst;
+#   return TRUE;
+# }
+# /* ltdll.c ends here */
+      # This is a source program that is used to create import libraries
+      # on Windows for dlls which lack them. Don't remove nor modify the
+      # starting and closing comments
+# /* impgen.c starts here */
+# /*   Copyright (C) 1999 Free Software Foundation, Inc.
+# 
+#  This file is part of GNU libtool.
+# 
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+# 
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+# 
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#  */
+# 
+#  #include 		/* for printf() */
+#  #include 		/* for open(), lseek(), read() */
+#  #include 		/* for O_RDONLY, O_BINARY */
+#  #include 		/* for strdup() */
+# 
+#  static unsigned int
+#  pe_get16 (fd, offset)
+#       int fd;
+#       int offset;
+#  {
+#    unsigned char b[2];
+#    lseek (fd, offset, SEEK_SET);
+#    read (fd, b, 2);
+#    return b[0] + (b[1]<<8);
+#  }
+# 
+#  static unsigned int
+#  pe_get32 (fd, offset)
+#      int fd;
+#      int offset;
+#  {
+#    unsigned char b[4];
+#    lseek (fd, offset, SEEK_SET);
+#    read (fd, b, 4);
+#    return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+#  }
+# 
+#  static unsigned int
+#  pe_as32 (ptr)
+#       void *ptr;
+#  {
+#    unsigned char *b = ptr;
+#    return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+#  }
+# 
+#  int
+#  main (argc, argv)
+#      int argc;
+#      char *argv[];
+#  {
+#      int dll;
+#      unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
+#      unsigned long export_rva, export_size, nsections, secptr, expptr;
+#      unsigned long name_rvas, nexp;
+#      unsigned char *expdata, *erva;
+#      char *filename, *dll_name;
+# 
+#      filename = argv[1];
+# 
+#      dll = open(filename, O_RDONLY|O_BINARY);
+#      if (!dll)
+#  	return 1;
+# 
+#      dll_name = filename;
+#    
+#      for (i=0; filename[i]; i++)
+#  	if (filename[i] == '/' || filename[i] == '\\'  || filename[i] == ':')
+#  	    dll_name = filename + i +1;
+# 
+#      pe_header_offset = pe_get32 (dll, 0x3c);
+#      opthdr_ofs = pe_header_offset + 4 + 20;
+#      num_entries = pe_get32 (dll, opthdr_ofs + 92);
+# 
+#      if (num_entries < 1) /* no exports */
+#  	return 1;
+# 
+#      export_rva = pe_get32 (dll, opthdr_ofs + 96);
+#      export_size = pe_get32 (dll, opthdr_ofs + 100);
+#      nsections = pe_get16 (dll, pe_header_offset + 4 +2);
+#      secptr = (pe_header_offset + 4 + 20 +
+#  	      pe_get16 (dll, pe_header_offset + 4 + 16));
+# 
+#      expptr = 0;
+#      for (i = 0; i < nsections; i++)
+#      {
+#  	char sname[8];
+#  	unsigned long secptr1 = secptr + 40 * i;
+#  	unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
+#  	unsigned long vsize = pe_get32 (dll, secptr1 + 16);
+#  	unsigned long fptr = pe_get32 (dll, secptr1 + 20);
+#  	lseek(dll, secptr1, SEEK_SET);
+#  	read(dll, sname, 8);
+#  	if (vaddr <= export_rva && vaddr+vsize > export_rva)
+#  	{
+#  	    expptr = fptr + (export_rva - vaddr);
+#  	    if (export_rva + export_size > vaddr + vsize)
+#  		export_size = vsize - (export_rva - vaddr);
+#  	    break;
+#  	}
+#      }
+# 
+#      expdata = (unsigned char*)malloc(export_size);
+#      lseek (dll, expptr, SEEK_SET);
+#      read (dll, expdata, export_size);
+#      erva = expdata - export_rva;
+# 
+#      nexp = pe_as32 (expdata+24);
+#      name_rvas = pe_as32 (expdata+32);
+# 
+#      printf ("EXPORTS\n");
+#      for (i = 0; i&2
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	else
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	fi
+	build_libtool_libs=no
+	build_old_libs=yes
+	prefer_static_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test $# -gt 0; do
+      arg="$1"
+      shift
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case "$prev" in
+	output)
+	  compile_command="$compile_command @OUTPUT@"
+	  finalize_command="$finalize_command @OUTPUT@"
+	  ;;
+	esac
+
+	case "$prev" in
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    compile_command="$compile_command @SYMFILE@"
+	    finalize_command="$finalize_command @SYMFILE@"
+	    preload=yes
+	  fi
+	  case "$arg" in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      dlfiles="$dlfiles $arg"
+	    else
+	      dlprefiles="$dlprefiles $arg"
+	    fi
+	    prev=
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  if test ! -f "$arg"; then
+	    $echo "$modename: symbol file \`$arg' does not exist"
+	    exit 1
+	  fi
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case "$arg" in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    $echo "$modename: only absolute run-paths are allowed" 1>&2
+	    exit 1
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) rpath="$rpath $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) xrpath="$xrpath $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi
+
+      prevarg="$arg"
+
+      case "$arg" in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  compile_command="$compile_command $link_static_flag"
+	  finalize_command="$finalize_command $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	$echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
+	continue
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  $echo "$modename: not more than one -exported-symbols argument allowed"
+	  exit 1
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -L*)
+	dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
+	# We need an absolute path.
+	case "$dir" in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  if test -z "$absdir"; then
+	    $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+	    $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+	    absdir="$dir"
+	  fi
+	  dir="$absdir"
+	  ;;
+	esac
+	case " $deplibs " in
+	*" $arg "*) ;;
+	*) deplibs="$deplibs $arg";;
+	esac
+	case " $lib_search_path " in
+	*" $dir "*) ;;
+	*) lib_search_path="$lib_search_path $dir";;
+	esac
+	case "$host" in
+	*-*-cygwin* | *-*-mingw* | *-*-os2*)
+	  dllsearchdir=`cd "$dir" && pwd || echo "$dir"`
+	  case ":$dllsearchpath:" in
+	  ::) dllsearchpath="$dllsearchdir";;
+	  *":$dllsearchdir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$dllsearchdir";;
+	  esac
+	  ;;
+	esac
+	;;
+
+      -l*)
+	if test "$arg" = "-lc"; then
+	  case "$host" in
+	  *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*)
+	    # These systems don't actually have c library (as such)
+	    continue
+	    ;;
+	  esac
+	elif test "$arg" = "-lm"; then
+	  case "$host" in
+	  *-*-cygwin* | *-*-beos*)
+	    # These systems don't actually have math library (as such)
+	    continue
+	    ;;
+	  esac
+	fi
+	deplibs="$deplibs $arg"
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
+	# We need an absolute path.
+	case "$dir" in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  $echo "$modename: only absolute run-paths are allowed" 1>&2
+	  exit 1
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) xrpath="$xrpath $dir" ;;
+	esac
+	continue
+	;;
+
+      -static)
+	# If we have no pic_flag, then this is the same as -all-static.
+	if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	  compile_command="$compile_command $link_static_flag"
+	  finalize_command="$finalize_command $link_static_flag"
+	fi
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      # Some other compiler flag.
+      -* | +*)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case "$arg" in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+	  arg="\"$arg\""
+	  ;;
+	esac
+	;;
+
+      *.o | *.obj | *.a | *.lib)
+	# A standard object.
+	objs="$objs $arg"
+	;;
+
+      *.lo)
+	# A library object.
+	if test "$prev" = dlfiles; then
+	  dlfiles="$dlfiles $arg"
+	  if test "$build_libtool_libs" = yes && test "$dlopen" = yes; then
+	    prev=
+	    continue
+	  else
+	    # If libtool objects are unsupported, then we need to preload.
+	    prev=dlprefiles
+	  fi
+	fi
+
+	if test "$prev" = dlprefiles; then
+	  # Preload the old-style object.
+	  dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"`
+	  prev=
+	fi
+	libobjs="$libobjs $arg"
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	dlname=
+	libdir=
+	library_names=
+	old_library=
+
+	# Check to see that this really is a libtool archive.
+	if (sed -e '2q' $arg | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$arg' is not a valid libtool archive" 1>&2
+	  exit 1
+	fi
+
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variable installed.
+	installed=yes
+
+	# Read the .la file
+	# If there is no directory component, then add one.
+	case "$arg" in
+	*/* | *\\*) . $arg ;;
+	*) . ./$arg ;;
+	esac
+
+	# Get the name of the library we link against.
+	linklib=
+	for l in $old_library $library_names; do
+	  linklib="$l"
+	done
+
+	if test -z "$linklib"; then
+	  $echo "$modename: cannot find name of link library for \`$arg'" 1>&2
+	  exit 1
+	fi
+
+	# Find the relevant object directory and library name.
+	name=`$echo "X$arg" | $Xsed -e 's%^.*/%%' -e 's/\.la$//' -e 's/^lib//'`
+
+	if test "X$installed" = Xyes; then
+	  dir="$libdir"
+	else
+	  dir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+	  if test "X$dir" = "X$arg"; then
+	    dir="$objdir"
+	  else
+	    dir="$dir/$objdir"
+	  fi
+	fi
+
+	if test -n "$dependency_libs"; then
+	  # Extract -R and -L from dependency_libs
+	  temp_deplibs=
+	  for deplib in $dependency_libs; do
+	    case "$deplib" in
+	    -R*) temp_xrpath=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
+		 case " $rpath $xrpath " in
+		 *" $temp_xrpath "*) ;;
+		 *) xrpath="$xrpath $temp_xrpath";;
+		 esac;;
+	    -L*) case "$compile_command $temp_deplibs " in
+		 *" $deplib "*) ;;
+		 *) temp_deplibs="$temp_deplibs $deplib";;
+		 esac
+		 temp_dir=`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+		 case " $lib_search_path " in
+		 *" $temp_dir "*) ;;
+		 *) lib_search_path="$lib_search_path $temp_dir";;
+		 esac
+		 ;;
+	    *) temp_deplibs="$temp_deplibs $deplib";;
+	    esac
+	  done
+	  dependency_libs="$temp_deplibs"
+	fi
+
+	if test -z "$libdir"; then
+	  # It is a libtool convenience library, so add in its objects.
+	  convenience="$convenience $dir/$old_library"
+	  old_convenience="$old_convenience $dir/$old_library"
+	  deplibs="$deplibs$dependency_libs"
+	  compile_command="$compile_command $dir/$old_library$dependency_libs"
+	  finalize_command="$finalize_command $dir/$old_library$dependency_libs"
+	  continue
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$prev" = dlfiles; then
+	  dlfiles="$dlfiles $arg"
+	  if test -z "$dlname" || test "$dlopen" != yes || test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking statically,
+	    # we need to preload.
+	    prev=dlprefiles
+	  else
+	    # We should not create a dependency on this library, but we
+	    # may need any libraries it requires.
+	    compile_command="$compile_command$dependency_libs"
+	    finalize_command="$finalize_command$dependency_libs"
+	    prev=
+	    continue
+	  fi
+	fi
+
+	# The library was specified with -dlpreopen.
+	if test "$prev" = dlprefiles; then
+	  # Prefer using a static library (so that no silly _DYNAMIC symbols
+	  # are required to link).
+	  if test -n "$old_library"; then
+	    dlprefiles="$dlprefiles $dir/$old_library"
+	  else
+	    dlprefiles="$dlprefiles $dir/$linklib"
+	  fi
+	  prev=
+	fi
+
+	if test -n "$library_names" &&
+	   { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
+	  link_against_libtool_libs="$link_against_libtool_libs $arg"
+	  if test -n "$shlibpath_var"; then
+	    # Make sure the rpath contains only unique directories.
+	    case "$temp_rpath " in
+	    *" $dir "*) ;;
+	    *) temp_rpath="$temp_rpath $dir" ;;
+	    esac
+	  fi
+
+	  # We need an absolute path.
+	  case "$dir" in
+	  [\\/] | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+	  *)
+	    absdir=`cd "$dir" && pwd`
+	    if test -z "$absdir"; then
+	      $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+	      $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+	      absdir="$dir"
+	    fi
+	    ;;
+	  esac
+	  
+	  # This is the magic to use -rpath.
+	  # Skip directories that are in the system default run-time
+	  # search path, unless they have been requested with -R.
+	  case " $sys_lib_dlsearch_path " in
+	  *" $absdir "*) ;;
+	  *)
+	    case "$compile_rpath " in
+	    *" $absdir "*) ;;
+	    *) compile_rpath="$compile_rpath $absdir" 
+	    esac
+	    ;;
+	  esac
+
+	  case " $sys_lib_dlsearch_path " in
+	  *" $libdir "*) ;;
+	  *)
+	    case "$finalize_rpath " in
+	    *" $libdir "*) ;;
+	    *) finalize_rpath="$finalize_rpath $libdir"
+	    esac
+	    ;;
+	  esac
+
+	  lib_linked=yes
+	  case "$hardcode_action" in
+	  immediate | unsupported)
+	    if test "$hardcode_direct" = no; then
+	      compile_command="$compile_command $dir/$linklib"
+	      deplibs="$deplibs $dir/$linklib"
+	      case "$host" in
+	      *-*-cygwin* | *-*-mingw* | *-*-os2*)
+		dllsearchdir=`cd "$dir" && pwd || echo "$dir"`
+		if test -n "$dllsearchpath"; then
+		  dllsearchpath="$dllsearchpath:$dllsearchdir"
+		else
+		  dllsearchpath="$dllsearchdir"
+		fi
+		;;
+	      esac
+	    elif test "$hardcode_minus_L" = no; then
+	      case "$host" in
+	      *-*-sunos*)
+		compile_shlibpath="$compile_shlibpath$dir:"
+		;;
+	      esac
+	      case "$compile_command " in
+	      *" -L$dir "*) ;;
+	      *) compile_command="$compile_command -L$dir";;
+	      esac
+	      compile_command="$compile_command -l$name"
+	      deplibs="$deplibs -L$dir -l$name"
+	    elif test "$hardcode_shlibpath_var" = no; then
+	      case ":$compile_shlibpath:" in
+	      *":$dir:"*) ;;
+	      *) compile_shlibpath="$compile_shlibpath$dir:";;
+	      esac
+	      compile_command="$compile_command -l$name"
+	      deplibs="$deplibs -l$name"
+	    else
+	      lib_linked=no
+	    fi
+	    ;;
+
+	  relink)
+	    if test "$hardcode_direct" = yes; then
+	      compile_command="$compile_command $absdir/$linklib"
+	      deplibs="$deplibs $absdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      case "$compile_command " in
+	      *" -L$absdir "*) ;;
+	      *) compile_command="$compile_command -L$absdir";;
+	      esac
+	      compile_command="$compile_command -l$name"
+	      deplibs="$deplibs -L$absdir -l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case ":$compile_shlibpath:" in
+	      *":$absdir:"*) ;;
+	      *) compile_shlibpath="$compile_shlibpath$absdir:";;
+	      esac
+	      compile_command="$compile_command -l$name"
+	      deplibs="$deplibs -l$name"
+	    else
+	      lib_linked=no
+	    fi
+	    ;;
+
+	  *)
+	    lib_linked=no
+	    ;;
+	  esac
+
+	  if test "$lib_linked" != yes; then
+	    $echo "$modename: configuration error: unsupported hardcode properties"
+	    exit 1
+	  fi
+
+	  # Finalize command for both is simple: just hardcode it.
+	  if test "$hardcode_direct" = yes; then
+	    finalize_command="$finalize_command $libdir/$linklib"
+	  elif test "$hardcode_minus_L" = yes; then
+	    case "$finalize_command " in
+	    *" -L$libdir "*) ;;
+	    *) finalize_command="$finalize_command -L$libdir";;
+	    esac
+	    finalize_command="$finalize_command -l$name"
+	  elif test "$hardcode_shlibpath_var" = yes; then
+	    case ":$finalize_shlibpath:" in
+	    *":$libdir:"*) ;;
+	    *) finalize_shlibpath="$finalize_shlibpath$libdir:";;
+	    esac
+	    finalize_command="$finalize_command -l$name"
+	  else
+	    # We cannot seem to hardcode it, guess we'll fake it.
+	    case "$finalize_command " in
+	    *" -L$dir "*) ;;
+	    *) finalize_command="$finalize_command -L$libdir";;
+	    esac
+	    finalize_command="$finalize_command -l$name"
+	  fi
+	else
+	  # Transform directly to old archives if we don't build new libraries.
+	  if test -n "$pic_flag" && test -z "$old_library"; then
+	    $echo "$modename: cannot find static library for \`$arg'" 1>&2
+	    exit 1
+	  fi
+
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_command="$compile_command $dir/$linklib"
+	    finalize_command="$finalize_command $dir/$linklib"
+	  else
+	    case "$compile_command " in
+	    *" -L$dir "*) ;;
+	    *) compile_command="$compile_command -L$dir";;
+	    esac
+	    compile_command="$compile_command -l$name"
+	    case "$finalize_command " in
+	    *" -L$dir "*) ;;
+	    *) finalize_command="$finalize_command -L$dir";;
+	    esac
+	    finalize_command="$finalize_command -l$name"
+	  fi
+	fi
+
+	# Add in any libraries that this one depends upon.
+	compile_command="$compile_command$dependency_libs"
+	finalize_command="$finalize_command$dependency_libs"
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case "$arg" in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+	  arg="\"$arg\""
+	  ;;
+	esac
+	;;
+      esac
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	compile_command="$compile_command $arg"
+	finalize_command="$finalize_command $arg"
+      fi
+    done
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      compile_command="$compile_command $arg"
+      finalize_command="$finalize_command $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
+    libobjs_save="$libobjs"
+
+    case "$output" in
+    "")
+      $echo "$modename: you must specify an output file" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+      ;;
+
+    *.a | *.lib)
+      if test -n "$link_against_libtool_libs"; then
+	$echo "$modename: error: cannot link libtool libraries into archives" 1>&2
+	exit 1
+      fi
+
+      if test -n "$deplibs"; then
+	$echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
+      fi
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+	$echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+	$echo "$modename: warning: \`-R' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	$echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
+      fi
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      ;;
+
+    *.la)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case "$outputname" in
+      lib*)
+	name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	if test "$module" = no; then
+	  $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	fi
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+	  eval libname=\"$libname_spec\"
+	else
+	  libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+	fi
+	;;
+      esac
+
+      output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+      if test "X$output_objdir" = "X$output"; then
+	output_objdir="$objdir"
+      else
+	output_objdir="$output_objdir/$objdir"
+      fi
+
+      if test -n "$objs"; then
+	$echo "$modename: cannot build libtool library \`$output' from non-libtool objects:$objs" 2>&1
+	exit 1
+      fi
+
+      # How the heck are we supposed to write a wrapper for a shared library?
+      if test -n "$link_against_libtool_libs"; then
+	 $echo "$modename: error: cannot link shared libraries into libtool libraries" 1>&2
+	 exit 1
+      fi
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for libtool libraries" 1>&2
+      fi
+
+      set dummy $rpath
+      if test $# -gt 2; then
+	$echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
+      fi
+      install_libdir="$2"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  libext=al
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+	dependency_libs="$deplibs"
+
+	if test -n "$vinfo"; then
+	  $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2
+	fi
+
+	if test -n "$release"; then
+	  $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
+	fi
+      else
+
+	# Parse the version information argument.
+	IFS="${IFS= 	}"; save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	IFS="$save_ifs"
+
+	if test -n "$8"; then
+	  $echo "$modename: too many parameters to \`-version-info'" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	fi
+
+	current="$2"
+	revision="$3"
+	age="$4"
+
+	# Check that each of the things are valid numbers.
+	case "$current" in
+	0 | [1-9] | [1-9][0-9]*) ;;
+	*)
+	  $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit 1
+	  ;;
+	esac
+
+	case "$revision" in
+	0 | [1-9] | [1-9][0-9]*) ;;
+	*)
+	  $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit 1
+	  ;;
+	esac
+
+	case "$age" in
+	0 | [1-9] | [1-9][0-9]*) ;;
+	*)
+	  $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit 1
+	  ;;
+	esac
+
+	if test $age -gt $current; then
+	  $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit 1
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case "$version_type" in
+	none) ;;
+
+	irix)
+	  major=`expr $current - $age + 1`
+	  versuffix="$major.$revision"
+	  verstring="sgi$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test $loop != 0; do
+	    iface=`expr $revision - $loop`
+	    loop=`expr $loop - 1`
+	    verstring="sgi$major.$iface:$verstring"
+	  done
+	  ;;
+
+	linux)
+	  major=.`expr $current - $age`
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  major=`expr $current - $age`
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test $loop != 0; do
+	    iface=`expr $current - $loop`
+	    loop=`expr $loop - 1`
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  verstring="$verstring:${current}.0"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current";
+	  ;;
+
+	windows)
+	  # Like Linux, but with '-' rather than '.', since we only
+	  # want one extension on Windows 95.
+	  major=`expr $current - $age`
+	  versuffix="-$major-$age-$revision"
+	  ;;
+
+	*)
+	  $echo "$modename: unknown library version type \`$version_type'" 1>&2
+	  echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+	  exit 1
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  verstring="0.0"
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+	
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+
+	dependency_libs="$deplibs"
+	case "$host" in
+	*-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*)
+	  # these systems don't actually have a c library (as such)!
+	  ;;
+        *-*-rhapsody*)
+	  # rhapsody is a little odd...
+	  deplibs="$deplibs -framework System"
+	  ;;
+	*)
+	  # Add libc to deplibs on all other systems.
+	  deplibs="$deplibs -lc"
+	  ;;
+	esac
+      fi
+
+      # Create the output directory, or remove our outputs if we need to.
+      if test -d $output_objdir; then
+	$show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*"
+	$run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*
+      else
+	$show "$mkdir $output_objdir"
+	$run $mkdir $output_objdir
+	status=$?
+	if test $status -ne 0 && test ! -d $output_objdir; then
+	  exit $status
+	fi
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+      fi
+
+      if test "$build_libtool_libs" = yes; then
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case "$deplibs_check_method" in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behaviour.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $rm conftest.c
+	  cat > conftest.c </dev/null`
+		    for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null \
+			 | grep " -> " >/dev/null; then
+			continue 
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | sed 's/.* -> //'`
+			case "$potliblink" in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
+			 | sed 10q \
+			 | egrep "$file_magic_regex" > /dev/null; then
+			newdeplibs="$newdeplibs $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		    done
+	      done
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		echo "*** Warning: This library needs some functionality provided by $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have."
+	      fi
+	    else
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	    fi
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
+	       -e 's/ -[LR][^ ]*//g' -e 's/[ 	]//g' |
+	     grep . >/dev/null; then
+	    echo
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	  fi
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    echo
+	    echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    echo "*** dependencies of module $libname.  Therefore, libtool will create"
+	    echo "*** a static module, that should work as long as the dlopening"
+	    echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      echo
+	      echo "*** However, this would only work if libtool was able to extract symbol"
+	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      echo "*** not find such a program.  So, this module is probably useless."
+	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    echo "*** The inter-library dependencies that have been dropped here will be"
+	    echo "*** automatically added whenever a program is linked with this library"
+	    echo "*** or is declared to -dlopen it."
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+      
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	# Get the real and link names of the library.
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	realname="$2"
+	shift; shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+
+	lib="$output_objdir/$realname"
+	for link
+	do
+	  linknames="$linknames $link"
+	done
+
+	# Ensure that we have .o objects for linkers which dislike .lo
+	# (e.g. aix) in case we are running --disable-static
+	for obj in $libobjs; do
+	  xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+	  if test "X$xdir" = "X$obj"; then
+	    xdir="."
+	  else
+	    xdir="$xdir"
+	  fi
+	  baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+	  oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
+	  if test ! -f $xdir/$oldobj; then
+	    $show "(cd $xdir && ${LN_S} $baseobj $oldobj)"
+	    $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $?
+	  fi
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    $show "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $run $rm $export_symbols
+	    eval cmds=\"$export_symbols_cmds\"
+	    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      $show "$cmd"
+	      $run eval "$cmd" || exit $?
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex"; then
+	      $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
+	      $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      $show "$mv \"${export_symbols}T\" \"$export_symbols\""
+	      $run eval '$mv "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
+	fi
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    $show "${rm}r $gentop"
+	    $run ${rm}r "$gentop"
+	    $show "mkdir $gentop"
+	    $run mkdir "$gentop"
+	    status=$?
+	    if test $status -ne 0 && test ! -d "$gentop"; then
+	      exit $status
+	    fi
+	    generated="$generated $gentop"
+
+	    for xlib in $convenience; do
+	      # Extract the objects.
+	      case "$xlib" in
+	      [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+	      *) xabs=`pwd`"/$xlib" ;;
+	      esac
+	      xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+	      xdir="$gentop/$xlib"
+
+	      $show "${rm}r $xdir"
+	      $run ${rm}r "$xdir"
+	      $show "mkdir $xdir"
+	      $run mkdir "$xdir"
+	      status=$?
+	      if test $status -ne 0 && test ! -d "$xdir"; then
+		exit $status
+	      fi
+	      $show "(cd $xdir && $AR x $xabs)"
+	      $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+
+	      libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP`
+	    done
+	  fi
+	fi
+
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  linkopts="$linkopts $flag"
+	fi
+
+	# Do each of the archive commands.
+	if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	  eval cmds=\"$archive_expsym_cmds\"
+	else
+	  eval cmds=\"$archive_cmds\"
+	fi
+	IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  $show "$cmd"
+	  $run eval "$cmd" || exit $?
+	done
+	IFS="$save_ifs"
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
+	    $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    *.lo | *.o | *.obj)
+      if test -n "$link_against_libtool_libs"; then
+	$echo "$modename: error: cannot link libtool libraries into objects" 1>&2
+	exit 1
+      fi
+
+      if test -n "$deplibs"; then
+	$echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
+      fi
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+	$echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+	$echo "$modename: warning: \`-R' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for objects" 1>&2
+      fi
+
+      case "$output" in
+      *.lo)
+	if test -n "$objs"; then
+	  $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
+	  exit 1
+	fi
+	libobj="$output"
+	obj=`$echo "X$output" | $Xsed -e "$lo2o"`
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $run $rm $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec
+      wl= 
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
+	else
+	  gentop="$output_objdir/${obj}x"
+	  $show "${rm}r $gentop"
+	  $run ${rm}r "$gentop"
+	  $show "mkdir $gentop"
+	  $run mkdir "$gentop"
+	  status=$?
+	  if test $status -ne 0 && test ! -d "$gentop"; then
+	    exit $status
+	  fi
+	  generated="$generated $gentop"
+
+	  for xlib in $convenience; do
+	    # Extract the objects.
+	    case "$xlib" in
+	    [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+	    *) xabs=`pwd`"/$xlib" ;;
+	    esac
+	    xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+	    xdir="$gentop/$xlib"
+
+	    $show "${rm}r $xdir"
+	    $run ${rm}r "$xdir"
+	    $show "mkdir $xdir"
+	    $run mkdir "$xdir"
+	    status=$?
+	    if test $status -ne 0 && test ! -d "$xdir"; then
+	      exit $status
+	    fi
+	    $show "(cd $xdir && $AR x $xabs)"
+	    $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+
+	    reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP`
+	  done
+	fi
+      fi
+
+      # Create the old-style object.
+      reload_objs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs"
+
+      output="$obj"
+      eval cmds=\"$reload_cmds\"
+      IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  $show "${rm}r $gentop"
+	  $run ${rm}r $gentop
+	fi
+
+	exit 0
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  $show "${rm}r $gentop"
+	  $run ${rm}r $gentop
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	$show "echo timestamp > $libobj"
+	$run eval "echo timestamp > $libobj" || exit $?
+	exit 0
+      fi
+
+      if test -n "$pic_flag"; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	eval cmds=\"$reload_cmds\"
+	IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  $show "$cmd"
+	  $run eval "$cmd" || exit $?
+	done
+	IFS="$save_ifs"
+      else
+	# Just create a symlink.
+	$show $rm $libobj
+	$run $rm $libobj
+	xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
+	if test "X$xdir" = "X$libobj"; then
+	  xdir="."
+	else
+	  xdir="$xdir"
+	fi
+	baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'`
+	oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
+	$show "(cd $xdir && $LN_S $oldobj $baseobj)"
+	$run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $?
+      fi
+
+      if test -n "$gentop"; then
+	$show "${rm}r $gentop"
+	$run ${rm}r $gentop
+      fi
+
+      exit 0
+      ;;
+
+    # Anything else should be a program.
+    *)
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for programs" 1>&2
+      fi
+
+      if test "$preload" = yes; then
+	if test "$dlopen" = unknown && test "$dlopen_self" = unknown &&
+	   test "$dlopen_self_static" = unknown; then
+	  $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
+	fi 
+      fi
+    
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$compile_rpath " in
+	  *" $libdir "*) ;;
+	  *) compile_rpath="$compile_rpath $libdir" ;;
+	  esac
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) perm_rpath="$perm_rpath $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+      if test "X$output_objdir" = "X$output"; then
+	output_objdir="$objdir"
+      else
+	output_objdir="$output_objdir/$objdir"
+      fi
+
+      # Create the binary in the object directory, then wrap it.
+      if test ! -d $output_objdir; then
+	$show "$mkdir $output_objdir"
+	$run $mkdir $output_objdir
+	status=$?
+	if test $status -ne 0 && test ! -d $output_objdir; then
+	  exit $status
+	fi
+      fi
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+      fi
+
+      dlsyms=
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	  dlsyms="${outputname}S.c"
+	else
+	  $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
+	fi
+      fi
+
+      if test -n "$dlsyms"; then
+	case "$dlsyms" in
+	"") ;;
+	*.c)
+	  # Discover the nlist of each of the dlfiles.
+	  nlist="$output_objdir/${outputname}.nm"
+
+	  $show "$rm $nlist ${nlist}S ${nlist}T"
+	  $run $rm "$nlist" "${nlist}S" "${nlist}T"
+
+	  # Parse the name list into a source file.
+	  $show "creating $output_objdir/$dlsyms"
+
+	  test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
+/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* Prevent the only kind of declaration conflicts we can make. */
+#define lt_preloaded_symbols some_other_symbol
+
+/* External symbol declarations for the compiler. */\
+"
+
+	  if test "$dlself" = yes; then
+	    $show "generating symbol list for \`$output'"
+
+	    test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+
+	    # Add our own program objects to the symbol list.
+	    progfiles=`$echo "X$objs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	    for arg in $progfiles; do
+	      $show "extracting global C symbols from \`$arg'"
+	      $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+	    done
+
+	    if test -n "$exclude_expsyms"; then
+	      $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      $run eval '$mv "$nlist"T "$nlist"'
+	    fi
+	    
+	    if test -n "$export_symbols_regex"; then
+	      $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      $run eval '$mv "$nlist"T "$nlist"'
+	    fi
+
+	    # Prepare the list of exported symbols
+	    if test -z "$export_symbols"; then
+	      export_symbols="$output_objdir/$output.exp"
+	      $run $rm $export_symbols
+	      $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	    else
+	      $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"'
+	      $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T'
+	      $run eval 'mv "$nlist"T "$nlist"'
+	    fi
+	  fi
+
+	  for arg in $dlprefiles; do
+	    $show "extracting global C symbols from \`$arg'"
+	    name=`echo "$arg" | sed -e 's%^.*/%%'`
+	    $run eval 'echo ": $name " >> "$nlist"'
+	    $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -z "$run"; then
+	    # Make sure we have at least an empty file.
+	    test -f "$nlist" || : > "$nlist"
+
+	    if test -n "$exclude_expsyms"; then
+	      egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	      $mv "$nlist"T "$nlist"
+	    fi
+
+	    # Try sorting and uniquifying the output.
+	    if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then
+	      :
+	    else
+	      grep -v "^: " < "$nlist" > "$nlist"S
+	    fi
+
+	    if test -f "$nlist"S; then
+	      eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
+	    else
+	      echo '/* NONE */' >> "$output_objdir/$dlsyms"
+	    fi
+
+	    $echo >> "$output_objdir/$dlsyms" "\
+
+#undef lt_preloaded_symbols
+
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+  const char *name;
+  lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{\
+"
+
+	    sed -n -e 's/^: \([^ ]*\) $/  {\"\1\", (lt_ptr_t) 0},/p' \
+		-e 's/^. \([^ ]*\) \([^ ]*\)$/  {"\2", (lt_ptr_t) \&\2},/p' \
+		  < "$nlist" >> "$output_objdir/$dlsyms"
+
+	    $echo >> "$output_objdir/$dlsyms" "\
+  {0, (lt_ptr_t) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	  fi
+
+	  pic_flag_for_symtable=
+	  case "$host" in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    case "$compile_command " in
+	    *" -static "*) ;;
+	    *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";;
+	    esac;;
+	  *-*-hpux*)
+	    case "$compile_command " in
+	    *" -static "*) ;;
+	    *) pic_flag_for_symtable=" $pic_flag -DPIC";;
+	    esac
+	  esac
+
+	  # Now compile the dynamic symbol file.
+	  $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
+	  $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
+
+	  # Clean up the generated files.
+	  $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
+	  $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
+
+	  # Transform the symbol file into the correct name.
+	  compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+	  finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+	  ;;
+	*)
+	  $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+	  exit 1
+	  ;;
+	esac
+      else
+	# We keep going just in case the user didn't refer to
+	# lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+	# really was required.
+
+	# Nullify the symbol file.
+	compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+	finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+      fi
+
+      if test -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then
+	# Replace the output file specification.
+	compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	$show "$link_command"
+	$run eval "$link_command"
+	status=$?
+	
+	# Delete the generated files.
+	if test -n "$dlsyms"; then
+	  $show "$rm $output_objdir/${outputname}S.${objext}"
+	  $run $rm "$output_objdir/${outputname}S.${objext}"
+	fi
+
+	exit $status
+      fi
+
+      if test -n "$shlibpath_var"; then
+	# We should set the shlibpath_var
+	rpath=
+	for dir in $temp_rpath; do
+	  case "$dir" in
+	  [\\/]* | [A-Za-z]:[\\/]*)
+	    # Absolute path.
+	    rpath="$rpath$dir:"
+	    ;;
+	  *)
+	    # Relative path: add a thisdir entry.
+	    rpath="$rpath\$thisdir/$dir:"
+	    ;;
+	  esac
+	done
+	temp_rpath="$rpath"
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+	
+	$echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
+	$echo "$modename: \`$output' will be relinked during installation" 1>&2
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+      
+      # Delete the old output files.
+      $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      $show "$link_command"
+      $run eval "$link_command" || exit $?
+
+      # Now create the wrapper script.
+      $show "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Quote $echo for shipping.
+      if test "X$echo" = "X$SHELL $0 --fallback-echo"; then
+	case "$0" in
+	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";;
+	*) qecho="$SHELL `pwd`/$0 --fallback-echo";;
+	esac
+	qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
+      else
+	qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if our run command is non-null.
+      if test -z "$run"; then
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) output=`echo $output|sed 's,.exe$,,'` ;;
+	esac
+	$rm $output
+	trap "$rm $output; exit 1" 1 2 15
+
+	$echo > $output "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variable:
+  link_against_libtool_libs='$link_against_libtool_libs'
+else
+  # When we are sourced in execute mode, \$file and \$echo are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    echo=\"$qecho\"
+    file=\"\$0\"
+    # Make sure echo works.
+    if test \"X\$1\" = X--no-reexec; then
+      # Discard the --no-reexec flag, and continue.
+      shift
+    elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
+      # Yippee, \$echo works!
+      :
+    else
+      # Restart under the correct shell, and then maybe \$echo will work.
+      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+    fi
+  fi\
+"
+	$echo >> $output "\
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\/]* | [A-Za-z]:[\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\`
+  done
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  echo >> $output "\
+  program=lt-'$outputname'
+  progdir=\"\$thisdir/$objdir\"
+  
+  if test ! -f \"\$progdir/\$program\" || \\
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $mkdir \"\$progdir\"
+    else
+      $rm \"\$progdir/\$file\"
+    fi"
+
+	  echo >> $output "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if (cd \"\$thisdir\" && eval \$relink_command); then :
+      else
+	$rm \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $rm \"\$progdir/\$program\";
+      $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $rm \"\$progdir/\$file\"
+  fi"
+	else
+	  echo >> $output "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	echo >> $output "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $echo >> $output "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	# fixup the dll searchpath if we need to.
+	if test -n "$dllsearchpath"; then
+	  $echo >> $output "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	$echo >> $output "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+"
+	case $host in
+	  # win32 systems need to use the prog path for dll
+	  # lookup to work
+	*-*-cygwin*)
+	  $echo >> $output "\
+      exec \$progdir/\$program \${1+\"\$@\"}
+"
+	  ;;
+
+	# Backslashes separate directories on plain windows
+	*-*-mingw | *-*-os2*)
+	  $echo >> $output "\
+      exec \$progdir\\\\\$program \${1+\"\$@\"}
+"
+	  ;;
+
+	*)
+	  $echo >> $output "\
+      # Export the path to the program.
+      PATH=\"\$progdir:\$PATH\"
+      export PATH
+
+      exec \$program \${1+\"\$@\"}
+"
+	  ;;
+	esac
+	$echo >> $output "\
+      \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
+      exit 1
+    fi
+  else
+    # The program doesn't exist.
+    \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2
+    \$echo \"This script is just a wrapper for \$program.\" 1>&2
+    echo \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+	chmod +x $output
+      fi
+      exit 0
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$objs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	$show "${rm}r $gentop"
+	$run ${rm}r "$gentop"
+	$show "mkdir $gentop"
+	$run mkdir "$gentop"
+	status=$?
+	if test $status -ne 0 && test ! -d "$gentop"; then
+	  exit $status
+	fi
+	generated="$generated $gentop"
+	  
+	# Add in members from convenience archives.
+	for xlib in $addlibs; do
+	  # Extract the objects.
+	  case "$xlib" in
+	  [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+	  *) xabs=`pwd`"/$xlib" ;;
+	  esac
+	  xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+	  xdir="$gentop/$xlib"
+
+	  $show "${rm}r $xdir"
+	  $run ${rm}r "$xdir"
+	  $show "mkdir $xdir"
+	  $run mkdir "$xdir"
+	  status=$?
+	  if test $status -ne 0 && test ! -d "$xdir"; then
+	    exit $status
+	  fi
+	  $show "(cd $xdir && $AR x $xabs)"
+	  $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+
+	  oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP`
+	done
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+	eval cmds=\"$old_archive_from_new_cmds\"
+      else
+	# Ensure that we have .o objects in place in case we decided
+	# not to build a shared library, and have fallen back to building
+	# static libs even though --disable-static was passed!
+	for oldobj in $oldobjs; do
+	  if test ! -f $oldobj; then
+	    xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'`
+	    if test "X$xdir" = "X$oldobj"; then
+	      xdir="."
+	    else
+	      xdir="$xdir"
+	    fi
+	    baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'`
+	    obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
+	    $show "(cd $xdir && ${LN_S} $obj $baseobj)"
+	    $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $?
+	  fi
+	done
+
+	eval cmds=\"$old_archive_cmds\"
+      fi
+      IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$generated"; then
+      $show "${rm}r$generated"
+      $run ${rm}r$generated
+    fi
+
+    # Now create the libtool archive.
+    case "$output" in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      $show "creating $output"
+
+      if test -n "$xrpath"; then
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  temp_xrpath="$temp_xrpath -R$libdir"
+	done
+	dependency_libs="$temp_xrpath $dependency_libs"
+      fi
+
+      # Only create the output if not a dry run.
+      if test -z "$run"; then
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	  fi
+	  $rm $output
+	  $echo > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$dlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'\
+"
+	done
+      fi
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
+      $run eval "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" || exit $?
+      ;;
+    esac
+    exit 0
+    ;;
+
+  # libtool install mode
+  install)
+    modename="$modename: install"
+
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh; then
+      # Aesthetically quote it.
+      arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
+      case "$arg" in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+	arg="\"$arg\""
+	;;
+      esac
+      install_prog="$arg "
+      arg="$1"
+      shift
+    else
+      install_prog=
+      arg="$nonopt"
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+    case "$arg" in
+    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+      arg="\"$arg\""
+      ;;
+    esac
+    install_prog="$install_prog$arg"
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    for arg
+    do
+      if test -n "$dest"; then
+	files="$files $dest"
+	dest="$arg"
+	continue
+      fi
+
+      case "$arg" in
+      -d) isdir=yes ;;
+      -f) prev="-f" ;;
+      -g) prev="-g" ;;
+      -m) prev="-m" ;;
+      -o) prev="-o" ;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*) ;;
+
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  prev=
+	else
+	  dest="$arg"
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+      case "$arg" in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+	arg="\"$arg\""
+	;;
+      esac
+      install_prog="$install_prog $arg"
+    done
+
+    if test -z "$install_prog"; then
+      $echo "$modename: you must specify an install program" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prev' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	$echo "$modename: no file or destination specified" 1>&2
+      else
+	$echo "$modename: you must specify a destination" 1>&2
+      fi
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    # Strip any trailing slash from the destination.
+    dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
+      test "X$destdir" = "X$dest" && destdir=.
+      destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files
+      if test $# -gt 2; then
+	$echo "$modename: \`$dest' is not a directory" 1>&2
+	$echo "$help" 1>&2
+	exit 1
+      fi
+    fi
+    case "$destdir" in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case "$file" in
+	*.lo) ;;
+	*)
+	  $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case "$file" in
+      *.a | *.lib)
+	# Do the static libraries later.
+	staticlibs="$staticlibs $file"
+	;;
+
+      *.la)
+	# Check to see that this really is a libtool archive.
+	if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	fi
+
+	library_names=
+	old_library=
+	# If there is no directory component, then add one.
+	case "$file" in
+	*/* | *\\*) . $file ;;
+	*) . ./$file ;;
+	esac
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) current_libdirs="$current_libdirs $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) future_libdirs="$future_libdirs $libdir" ;;
+	  esac
+	fi
+
+	dir="`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/"
+	test "X$dir" = "X$file/" && dir=
+	dir="$dir$objdir"
+
+	# See the names of the shared library.
+	set dummy $library_names
+	if test -n "$2"; then
+	  realname="$2"
+	  shift
+	  shift
+
+	  # Install the shared library and build the symlinks.
+	  $show "$install_prog $dir/$realname $destdir/$realname"
+	  $run eval "$install_prog $dir/$realname $destdir/$realname" || exit $?
+
+	  if test $# -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    for linkname
+	    do
+	      if test "$linkname" != "$realname"; then
+		$show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
+		$run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
+	      fi
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  eval cmds=\"$postinstall_cmds\"
+	  IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	  for cmd in $cmds; do
+	    IFS="$save_ifs"
+	    $show "$cmd"
+	    $run eval "$cmd" || exit $?
+	  done
+	  IFS="$save_ifs"
+	fi
+
+	# Install the pseudo-library for information purposes.
+	name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	instname="$dir/$name"i
+	$show "$install_prog $instname $destdir/$name"
+	$run eval "$install_prog $instname $destdir/$name" || exit $?
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case "$destfile" in
+	*.lo)
+	  staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
+	  ;;
+	*.o | *.obj)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	if test -n "$destfile"; then
+	  $show "$install_prog $file $destfile"
+	  $run eval "$install_prog $file $destfile" || exit $?
+	fi
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+
+	  $show "$install_prog $staticobj $staticdest"
+	  $run eval "$install_prog \$staticobj \$staticdest" || exit $?
+	fi
+	exit 0
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Do a test to see if this is really a libtool program.
+	if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  link_against_libtool_libs=
+	  relink_command=
+
+	  # If there is no directory component, then add one.
+	  case "$file" in
+	  */* | *\\*) . $file ;;
+	  *) . ./$file ;;
+	  esac
+
+	  # Check the variables that should have been set.
+	  if test -z "$link_against_libtool_libs"; then
+	    $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2
+	    exit 1
+	  fi
+
+	  finalize=yes
+	  for lib in $link_against_libtool_libs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      # If there is no directory component, then add one.
+	      case "$lib" in
+	      */* | *\\*) . $lib ;;
+	      *) . ./$lib ;;
+	      esac
+	    fi
+	    libfile="$libdir/`$echo "X$lib" | $Xsed -e 's%^.*/%%g'`"
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
+	      finalize=no
+	    fi
+	  done
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    if test "$finalize" = yes && test -z "$run"; then
+	      tmpdir="/tmp"
+	      test -n "$TMPDIR" && tmpdir="$TMPDIR"
+	      tmpdir="$tmpdir/libtool-$$"
+	      if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then :
+	      else
+		$echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2
+		continue
+	      fi
+	      outputname="$tmpdir/$file"
+	      # Replace the output file specification.
+	      relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+	      $show "$relink_command"
+	      if $run eval "$relink_command"; then :
+	      else
+		$echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+		${rm}r "$tmpdir"
+		continue
+	      fi
+	      file="$outputname"
+	    else
+	      $echo "$modename: warning: cannot relink \`$file'" 1>&2
+	    fi
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	$show "$install_prog$stripme $file $destfile"
+	$run eval "$install_prog\$stripme \$file \$destfile" || exit $?
+	test -n "$outputname" && ${rm}r "$tmpdir"
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+
+      $show "$install_prog $file $oldlib"
+      $run eval "$install_prog \$file \$oldlib" || exit $?
+
+      # Do each command in the postinstall commands.
+      eval cmds=\"$old_postinstall_cmds\"
+      IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$future_libdirs"; then
+      $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
+    fi
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      test -n "$run" && current_libdirs=" -n$current_libdirs"
+      exec $SHELL $0 --finish$current_libdirs
+      exit 1
+    fi
+
+    exit 0
+    ;;
+
+  # libtool finish mode
+  finish)
+    modename="$modename: finish"
+    libdirs="$nonopt"
+    admincmds=
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for dir
+      do
+	libdirs="$libdirs $dir"
+      done
+
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  eval cmds=\"$finish_cmds\"
+	  IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	  for cmd in $cmds; do
+	    IFS="$save_ifs"
+	    $show "$cmd"
+	    $run eval "$cmd" || admincmds="$admincmds
+       $cmd"
+	  done
+	  IFS="$save_ifs"
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $run eval "$cmds" || admincmds="$admincmds
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    test "$show" = : && exit 0
+
+    echo "----------------------------------------------------------------------"
+    echo "Libraries have been installed in:"
+    for libdir in $libdirs; do
+      echo "   $libdir"
+    done
+    echo
+    echo "If you ever happen to want to link against installed libraries"
+    echo "in a given directory, LIBDIR, you must either use libtool, and"
+    echo "specify the full pathname of the library, or use \`-LLIBDIR'"
+    echo "flag during linking and do at least one of the following:"
+    if test -n "$shlibpath_var"; then
+      echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+      echo "     during execution"
+    fi
+    if test -n "$runpath_var"; then
+      echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+      echo "     during linking"
+    fi
+    if test -n "$hardcode_libdir_flag_spec"; then
+      libdir=LIBDIR
+      eval flag=\"$hardcode_libdir_flag_spec\"
+
+      echo "   - use the \`$flag' linker flag"
+    fi
+    if test -n "$admincmds"; then
+      echo "   - have your system administrator run these commands:$admincmds"
+    fi
+    if test -f /etc/ld.so.conf; then
+      echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+    fi
+    echo
+    echo "See any operating system documentation about shared libraries for"
+    echo "more information, such as the ld(1) and ld.so(8) manual pages."
+    echo "----------------------------------------------------------------------"
+    exit 0
+    ;;
+
+  # libtool execute mode
+  execute)
+    modename="$modename: execute"
+
+    # The first argument is the command name.
+    cmd="$nonopt"
+    if test -z "$cmd"; then
+      $echo "$modename: you must specify a COMMAND" 1>&2
+      $echo "$help"
+      exit 1
+    fi
+
+    # Handle -dlopen flags immediately.
+    for file in $execute_dlfiles; do
+      if test ! -f "$file"; then
+	$echo "$modename: \`$file' is not a file" 1>&2
+	$echo "$help" 1>&2
+	exit 1
+      fi
+
+      dir=
+      case "$file" in
+      *.la)
+	# Check to see that this really is a libtool archive.
+	if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	fi
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+
+	# If there is no directory component, then add one.
+	case "$file" in
+	*/* | *\\*) . $file ;;
+	*) . ./$file ;;
+	esac
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$dir" = "X$file" && dir=.
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  dir="$dir/$objdir"
+	else
+	  $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
+	  exit 1
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$dir" = "X$file" && dir=.
+	;;
+
+      *)
+	$echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case "$file" in
+      -*) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  # If there is no directory component, then add one.
+	  case "$file" in
+	  */* | *\\*) . $file ;;
+	  *) . ./$file ;;
+	  esac
+
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
+      args="$args \"$file\""
+    done
+
+    if test -z "$run"; then
+      if test -n "$shlibpath_var"; then
+        # Export the shlibpath_var.
+        eval "export $shlibpath_var"
+      fi
+
+      # Restore saved enviroment variables
+      if test "${save_LC_ALL+set}" = set; then
+	LC_ALL="$save_LC_ALL"; export LC_ALL
+      fi
+      if test "${save_LANG+set}" = set; then
+	LANG="$save_LANG"; export LANG
+      fi
+
+      # Now actually exec the command.
+      eval "exec \$cmd$args"
+
+      $echo "$modename: cannot exec \$cmd$args"
+      exit 1
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+        eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
+        $echo "export $shlibpath_var"
+      fi
+      $echo "$cmd$args"
+      exit 0
+    fi
+    ;;
+
+  # libtool uninstall mode
+  uninstall)
+    modename="$modename: uninstall"
+    rm="$nonopt"
+    files=
+
+    for arg
+    do
+      case "$arg" in
+      -*) rm="$rm $arg" ;;
+      *) files="$files $arg" ;;
+      esac
+    done
+
+    if test -z "$rm"; then
+      $echo "$modename: you must specify an RM program" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    for file in $files; do
+      dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+      test "X$dir" = "X$file" && dir=.
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+      rmfiles="$file"
+
+      case "$name" in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  . $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    rmfiles="$rmfiles $dir/$n"
+	  done
+	  test -n "$old_library" && rmfiles="$rmfiles $dir/$old_library"
+
+	  $show "$rm $rmfiles"
+	  $run $rm $rmfiles
+
+	  if test -n "$library_names"; then
+	    # Do each command in the postuninstall commands.
+	    eval cmds=\"$postuninstall_cmds\"
+	    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      $show "$cmd"
+	      $run eval "$cmd"
+	    done
+	    IFS="$save_ifs"
+	  fi
+
+	  if test -n "$old_library"; then
+	    # Do each command in the old_postuninstall commands.
+	    eval cmds=\"$old_postuninstall_cmds\"
+	    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      $show "$cmd"
+	      $run eval "$cmd"
+	    done
+	    IFS="$save_ifs"
+	  fi
+
+	  # FIXME: should reinstall the best remaining shared library.
+	fi
+	;;
+
+      *.lo)
+	if test "$build_old_libs" = yes; then
+	  oldobj=`$echo "X$name" | $Xsed -e "$lo2o"`
+	  rmfiles="$rmfiles $dir/$oldobj"
+	fi
+	$show "$rm $rmfiles"
+	$run $rm $rmfiles
+	;;
+
+      *)
+	$show "$rm $rmfiles"
+	$run $rm $rmfiles
+	;;
+      esac
+    done
+    exit 0
+    ;;
+
+  "")
+    $echo "$modename: you must specify a MODE" 1>&2
+    $echo "$generic_help" 1>&2
+    exit 1
+    ;;
+  esac
+
+  $echo "$modename: invalid operation mode \`$mode'" 1>&2
+  $echo "$generic_help" 1>&2
+  exit 1
+fi # test -z "$show_help"
+
+# We need to display help for each of the modes.
+case "$mode" in
+"") $echo \
+"Usage: $modename [OPTION]... [MODE-ARG]...
+
+Provide generalized library-building support services.
+
+    --config          show all configuration variables
+    --debug           enable verbose shell tracing
+-n, --dry-run         display commands without modifying any files
+    --features        display basic configuration information and exit
+    --finish          same as \`--mode=finish'
+    --help            display this help message and exit
+    --mode=MODE       use operation mode MODE [default=inferred from MODE-ARGS]
+    --quiet           same as \`--silent'
+    --silent          don't print informational messages
+    --version         print version information
+
+MODE must be one of the following:
+
+      compile         compile a source file into a libtool object
+      execute         automatically set library path, then run a program
+      finish          complete the installation of libtool libraries
+      install         install libraries or executables
+      link            create a library or an executable
+      uninstall       remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE.  Try \`$modename --help --mode=MODE' for
+a more detailed description of MODE."
+  exit 0
+  ;;
+
+compile)
+  $echo \
+"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -static           always build a \`.o' file suitable for static linking
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+  ;;
+
+execute)
+  $echo \
+"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+  ;;
+
+finish)
+  $echo \
+"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+  ;;
+
+install)
+  $echo \
+"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+  ;;
+
+link)
+  $echo \
+"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+		    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+		    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -static           do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+		    specify library version info [each variable defaults to 0]
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+  ;;
+
+uninstall)
+  $echo \
+"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+  ;;
+
+*)
+  $echo "$modename: invalid operation mode \`$mode'" 1>&2
+  $echo "$help" 1>&2
+  exit 1
+  ;;
+esac
+
+echo
+$echo "Try \`$modename --help' for more information about other modes."
+
+exit 0
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/missing b/missing
new file mode 100755
index 00000000..cbe2b0ef
--- /dev/null
+++ b/missing
@@ -0,0 +1,188 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+# Franc,ois Pinard , 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+case "$1" in
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]"
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing - GNU libit 0.0"
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+  aclocal)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acinclude.m4' or \`configure.in'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`configure.in'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acconfig.h' or \`configure.in'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER([^):]*:\([^)]*\)).*/\1/p' configure.in`
+    if test -z "$files"; then
+      files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^):]*\)).*/\1/p' configure.in`
+      test -z "$files" || files="$files.in"
+    else
+      files=`echo "$files" | sed -e 's/:/ /g'`
+    fi
+    test -z "$files" && files="config.h.in"
+    touch $files
+    ;;
+
+  automake)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print \
+      | sed 's/^\(.*\).am$/touch \1.in/' \
+      | sh
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+	case "$LASTARG" in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if [ ! -f y.tab.h ]; then
+	echo >y.tab.h
+    fi
+    if [ ! -f y.tab.c ]; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+	case "$LASTARG" in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if [ ! -f lex.yy.c ]; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  makeinfo)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+    fi
+    touch $file
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+         system.  You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequirements for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100755
index 00000000..a411b01d
--- /dev/null
+++ b/mkinstalldirs
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman 
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.1 2001/12/11 20:47:26 fluxgen Exp $
+
+errstatus=0
+
+for file
+do
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d
+   do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp" 1>&2
+
+        mkdir "$pathcomp" || lasterr=$?
+
+        if test ! -d "$pathcomp"; then
+  	  errstatus=$lasterr
+        fi
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/nls/C/BaseDisplay.m b/nls/C/BaseDisplay.m
new file mode 100644
index 00000000..f7f3d9b4
--- /dev/null
+++ b/nls/C/BaseDisplay.m
@@ -0,0 +1,16 @@
+$set 1 #BaseDisplay
+
+$ #XError
+# %s:  X error: %s(%d) opcodes %d/%d\n  resource 0x%lx\n
+$ #SignalCaught
+# %s: signal %d caught\n
+$ #ShuttingDown
+# shutting down\n
+$ #Aborting
+# aborting... dumping core\n
+$ #XConnectFail
+# BaseDisplay::BaseDisplay: connection to X server failed.\n
+$ #CloseOnExecFail
+# BaseDisplay::BaseDisplay: couldn't mark display connection as close-on-exec\n
+$ #BadWindowRemove
+# BaseDisplay::eventLoop(): removing bad window from event queue\n
diff --git a/nls/C/Basemenu.m b/nls/C/Basemenu.m
new file mode 100644
index 00000000..6c4da308
--- /dev/null
+++ b/nls/C/Basemenu.m
@@ -0,0 +1,4 @@
+$set 2 #Basemenu
+
+$ #BlackboxMenu
+# Blackbox Menu
diff --git a/nls/C/Configmenu.m b/nls/C/Configmenu.m
new file mode 100644
index 00000000..7f64e974
--- /dev/null
+++ b/nls/C/Configmenu.m
@@ -0,0 +1,48 @@
+$set 3 #Configmenu
+
+$ #ConfigOptions
+# Config Options
+$ #FocusModel
+# Focus Model
+$ #WindowPlacement
+# Window Placement
+$ #ImageDithering
+# Image Dithering
+$ #OpaqueMove
+# Opaque Window Moving
+$ #FullMax
+# Full Maximization
+$ #FocusNew
+# Focus New Windows
+$ #FocusLast
+# Focus Window on Workspace Change
+$ #ClickToFocus
+# Click to Focus
+$ #SloppyFocus
+# Sloppy Focus
+$ #AutoRaise
+# Auto Raise
+$ #SmartRows
+# Smart Placement (Rows)
+$ #SmartCols
+# Smart Placement (Columns)
+$ #Cascade
+# Cascade Placement
+$ #LeftRight
+# Left to Right
+$ #RightLeft
+# Right to Left
+$ #TopBottom
+# Top to Bottom
+$ #BottomTop
+# Bottom to Top
+$ #Tabs
+# Use Tabs
+$ #Icons
+# Use Icons
+$ #TabPlacement
+# Tab Placement
+$ #TabRotateVertical
+# Rotate Vertical Tabs
+$ #SemiSloppyFocus
+# Semi Sloppy Focus
diff --git a/nls/C/Icon.m b/nls/C/Icon.m
new file mode 100644
index 00000000..54b96a63
--- /dev/null
+++ b/nls/C/Icon.m
@@ -0,0 +1,4 @@
+$set 4 #Icon
+
+$ #Icons
+# Icons
diff --git a/nls/C/Image.m b/nls/C/Image.m
new file mode 100644
index 00000000..5dd251a6
--- /dev/null
+++ b/nls/C/Image.m
@@ -0,0 +1,24 @@
+$set 5 #Image
+
+$ #ErrorCreatingSolidPixmap
+# BImage::render_solid: error creating pixmap\n
+$ #ErrorCreatingXImage
+# BImage::renderXImage: error creating XImage\n
+$ #UnsupVisual
+# BImage::renderXImage: unsupported visual\n
+$ #ErrorCreatingPixmap
+# BImage::renderPixmap: error creating pixmap\n
+$ #InvalidColormapSize
+# BImageControl::BImageControl: invalid colormap size %d (%d/%d/%d) - reducing\n
+$ #ErrorAllocatingColormap
+# BImageControl::BImageControl: error allocating colormap\n
+$ #ColorAllocFail
+# BImageControl::BImageControl: failed to alloc color %d/%d/%d\n
+$ #PixmapRelease
+# BImageControl::~BImageControl: pixmap cache - releasing %d pixmaps\n
+$ #PixmapCacheLarge
+# BImageControl::renderImage: cache is large, forcing cleanout\n
+$ #ColorParseError
+# BImageControl::getColor: color parse error: '%s'\n
+$ #ColorAllocError
+# BImageControl::getColor: color alloc error: '%s'\n
diff --git a/nls/C/Makefile.am b/nls/C/Makefile.am
new file mode 100644
index 00000000..be588add
--- /dev/null
+++ b/nls/C/Makefile.am
@@ -0,0 +1,46 @@
+# nls/C/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST= $(MFILES)
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/C"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/C; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/C; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/US_ASCII; \
+		ln -fs C $(DESTDIR)$(pkgdatadir)/nls/US_ASCII; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/POSIX; \
+		ln -fs C $(DESTDIR)$(pkgdatadir)/nls/POSIX; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/en_US; \
+		ln -fs C $(DESTDIR)$(pkgdatadir)/nls/en_US; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/en; \
+		ln -fs C $(DESTDIR)$(pkgdatadir)/nls/en; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/C/blackbox.cat; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/US_ASCII; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/POSIX; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/en_US; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/en; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/C; \
+	fi
+
+# note... when adding new catalogs... you do not need the
+# header=../blackbox-nls.hh which is passed to awk... we
+# only need to generate it once.
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk header=../blackbox-nls.hh \
+			output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
diff --git a/nls/C/Makefile.in b/nls/C/Makefile.in
new file mode 100644
index 00000000..50d0477c
--- /dev/null
+++ b/nls/C/Makefile.in
@@ -0,0 +1,237 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# nls/C/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+CXX = @CXX@
+DEBUG = @DEBUG@
+DLLTOOL = @DLLTOOL@
+GNOME = @GNOME@
+INTERLACE = @INTERLACE@
+KDE = @KDE@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+NEWWMSPEC = @NEWWMSPEC@
+NLS = @NLS@
+OBJDUMP = @OBJDUMP@
+ORDEREDPSEUDO = @ORDEREDPSEUDO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHAPE = @SHAPE@
+SLIT = @SLIT@
+TIMEDCACHE = @TIMEDCACHE@
+VERSION = @VERSION@
+gencat_cmd = @gencat_cmd@
+regex_cmd = @regex_cmd@
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST = $(MFILES)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps nls/C/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = nls/C
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-data-local
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-local
+uninstall: uninstall-am
+all-am: Makefile all-local
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+	-rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-local install-data-am install-data install-am install \
+uninstall-local uninstall-am uninstall all-local all-redirect all-am \
+all installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/C"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/C; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/C; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/US_ASCII; \
+		ln -fs C $(DESTDIR)$(pkgdatadir)/nls/US_ASCII; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/POSIX; \
+		ln -fs C $(DESTDIR)$(pkgdatadir)/nls/POSIX; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/en_US; \
+		ln -fs C $(DESTDIR)$(pkgdatadir)/nls/en_US; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/en; \
+		ln -fs C $(DESTDIR)$(pkgdatadir)/nls/en; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/C/blackbox.cat; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/US_ASCII; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/POSIX; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/en_US; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/en; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/C; \
+	fi
+
+# note... when adding new catalogs... you do not need the
+# header=../blackbox-nls.hh which is passed to awk... we
+# only need to generate it once.
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk header=../blackbox-nls.hh \
+			output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/nls/C/Screen.m b/nls/C/Screen.m
new file mode 100644
index 00000000..128c06e7
--- /dev/null
+++ b/nls/C/Screen.m
@@ -0,0 +1,54 @@
+$set 6 #Screen
+
+$ #AnotherWMRunning
+# BScreen::BScreen: an error occured while querying the X server.\n  \
+another window manager is already running on display %s.\n
+$ #ManagingScreen
+# BScreen::BScreen: managing screen %d using visual 0x%lx, depth %d\n
+$ #FontLoadFail
+# BScreen::LoadStyle(): couldn't load font '%s'\n
+$ #DefaultFontLoadFail
+# BScreen::LoadStyle(): couldn't load default font.\n
+$ #EmptyMenuFile
+# %s: empty menu file\n
+$ #xterm
+# xterm
+$ #Restart
+# Restart
+$ #Exit
+# Exit
+$ #EXECError
+# BScreen::parseMenuFile: [exec] error, no menu label and/or command defined\n
+$ #EXITError
+# BScreen::parseMenuFile: [exit] error, no menu label defined\n
+$ #STYLEError
+# BScreen::parseMenuFile: [style] error, no menu label and/or filename \
+defined\n
+$ #CONFIGError
+# BScreen::parseMenuFile: [config] error, no menu label defined\n
+$ #INCLUDEError
+# BScreen::parseMenuFile: [include] error, no filename defined\n
+$ #INCLUDEErrorReg
+# BScreen::parseMenuFile: [include] error, '%s' is not a regular file\n
+$ #SUBMENUError
+# BScreen::parseMenuFile: [submenu] error, no menu label defined\n
+$ #RESTARTError
+# BScreen::parseMenuFile: [restart] error, no menu label defined\n
+$ #RECONFIGError
+# BScreen::parseMenuFile: [reconfig] error, no menu label defined\n
+$ #STYLESDIRError
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] error, no directory defined\n
+$ #STYLESDIRErrorNotDir
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] error, '%s' is not a \
+directory\n
+$ #STYLESDIRErrorNoExist
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] error, '%s' does not exist\n
+$ #WORKSPACESError
+# BScreen::parseMenuFile: [workspaces] error, no menu label defined\n
+$ #PositionLength
+# 0: 0000 x 0: 0000
+$ #PositionFormat
+# X: %4d x Y: %4d
+$ #GeometryFormat
+# W: %4d x H: %4d
+
diff --git a/nls/C/Slit.m b/nls/C/Slit.m
new file mode 100644
index 00000000..0e5e3a4f
--- /dev/null
+++ b/nls/C/Slit.m
@@ -0,0 +1,8 @@
+$set 7 #Slit
+
+$ #SlitTitle
+# Slit
+$ #SlitDirection
+# Slit Direction
+$ #SlitPlacement
+# Slit Placement
diff --git a/nls/C/Toolbar.m b/nls/C/Toolbar.m
new file mode 100644
index 00000000..93e26453
--- /dev/null
+++ b/nls/C/Toolbar.m
@@ -0,0 +1,22 @@
+$set 8 #Toolbar
+
+$ #NoStrftimeLength
+# 00:00000
+$ #NoStrftimeDateFormat
+# %02d/%02d/%02d
+$ #NoStrftimeDateFormatEu
+# %02d.%02d.%02d
+$ #NoStrftimeTimeFormat24
+#  %02d:%02d 
+$ #NoStrftimeTimeFormat12
+# %02d:%02d %sm
+$ #NoStrftimeTimeFormatP
+# p
+$ #NoStrftimeTimeFormatA
+# a
+$ #ToolbarTitle
+# Toolbar
+$ #EditWkspcName
+# Edit current workspace name
+$ #ToolbarPlacement
+# Toolbar Placement
diff --git a/nls/C/Window.m b/nls/C/Window.m
new file mode 100644
index 00000000..be677cd4
--- /dev/null
+++ b/nls/C/Window.m
@@ -0,0 +1,17 @@
+$set 9 #Window
+
+
+$ #Creating
+# BlackboxWindow::BlackboxWindow: creating 0x%lx\n
+$ #XGetWindowAttributesFail
+# BlackboxWindow::BlackboxWindow: XGetWindowAttributres failed\n
+$ #CannotFindScreen
+# BlackboxWindow::BlackboxWindow: cannot find screen for root window 0x%lx\n
+$ #Unnamed
+# Unnamed
+$ #MapRequest
+# BlackboxWindow::mapRequestEvent() for 0x%lx\n
+$ #UnmapNotify
+# BlackboxWindow::unmapNotifyEvent() for 0x%lx\n
+$ #UnmapNotifyReparent
+# BlackboxWindow::unmapnotifyEvent: reparent 0x%lx to root\n
diff --git a/nls/C/Windowmenu.m b/nls/C/Windowmenu.m
new file mode 100644
index 00000000..13b3c38f
--- /dev/null
+++ b/nls/C/Windowmenu.m
@@ -0,0 +1,22 @@
+$set 10 #Windowmenu
+
+$ #SendTo
+# Send To ...
+$ #SendGroupTo
+# Send Group To ...
+$ #Shade
+# Shade
+$ #Iconify
+# Iconify
+$ #Maximize
+# Maximize
+$ #Raise
+# Raise
+$ #Lower
+# Lower
+$ #Stick
+# Stick
+$ #KillClient
+# Kill Client
+$ #Close
+# Close
diff --git a/nls/C/Workspace.m b/nls/C/Workspace.m
new file mode 100644
index 00000000..315460a0
--- /dev/null
+++ b/nls/C/Workspace.m
@@ -0,0 +1,4 @@
+$set 11 #Workspace
+
+$ #DefaultNameFormat
+# Workspace %d
diff --git a/nls/C/Workspacemenu.m b/nls/C/Workspacemenu.m
new file mode 100644
index 00000000..5423a191
--- /dev/null
+++ b/nls/C/Workspacemenu.m
@@ -0,0 +1,8 @@
+$set 12 #Workspacemenu
+
+$ #WorkspacesTitle
+# Workspaces
+$ #NewWorkspace
+# New Workspace
+$ #RemoveLast
+# Remove Last
diff --git a/nls/C/blackbox.m b/nls/C/blackbox.m
new file mode 100644
index 00000000..74d09f6e
--- /dev/null
+++ b/nls/C/blackbox.m
@@ -0,0 +1,6 @@
+$set 13 #blackbox
+
+$ #NoManagableScreens
+# Blackbox::Blackbox: no managable screens found, aborting\n
+$ #MapRequest
+# Blackbox::process_event: MapRequest for 0x%lx\n
diff --git a/nls/C/bsetroot.m b/nls/C/bsetroot.m
new file mode 100644
index 00000000..ddd7be6a
--- /dev/null
+++ b/nls/C/bsetroot.m
@@ -0,0 +1,16 @@
+$set 16 #bsetroot
+
+$ #MustSpecify
+# %s: error: must specify one of: -solid, -mod, -gradient\n
+$ #Usage
+# %s 2.0: (c) 1997-2000 Brad Hughes\n\n\
+  -display         display connection\n\
+  -mod               modula pattern\n\
+  -foreground, -fg  modula foreground color\n\
+  -background, -bg  modula background color\n\n\
+  -gradient       gradient texture\n\
+  -from             gradient start color\n\
+  -to               gradient end color\n\n\
+  -solid            solid color\n\n\
+  -help                    print this help text and exit\n
+
diff --git a/nls/C/common.m b/nls/C/common.m
new file mode 100644
index 00000000..c9208774
--- /dev/null
+++ b/nls/C/common.m
@@ -0,0 +1,57 @@
+$set 15 #Common
+
+$ #Yes
+# Yes
+$ #No
+# No
+
+$ #DirectionTitle
+# Direction
+$ #DirectionHoriz
+# Horizontal
+$ #DirectionVert
+# Vertical
+
+$ #AlwaysOnTop
+# Always on top
+
+$ #PlacementTitle
+# Placement
+$ #PlacementTopLeft
+# Top Left
+$ #PlacementCenterLeft
+# Center Left
+$ #PlacementBottomLeft
+# Bottom Left
+$ #PlacementTopCenter
+# Top Center
+$ #PlacementBottomCenter
+# BottomCenter
+$ #PlacementTopRight
+# Top Right
+$ #PlacementCenterRight
+# Center Right
+$ #PlacementBottomRight
+# Bottom Right
+$ #PlacementLeftTop
+# Left Top
+$ #PlacementLeftCenter
+# Left Center
+$ #PlacementLeftBottom
+# Left Bottom
+$ #PlacementRightTop
+# Right Top
+$ #PlacementRightCenter
+# Right Center
+$ #PlacementRightBottom
+# Right Bottom
+$ #PlacementTopRelative
+# Top Relative
+$ #PlacementBottomRelative
+# Bottom Relative
+$ #PlacementLeftRelative
+# Left Relative
+$ #PlacementRightRelative
+# Right Relative
+$ #AutoHide
+# Auto hide
diff --git a/nls/C/main.m b/nls/C/main.m
new file mode 100644
index 00000000..5ff1b70b
--- /dev/null
+++ b/nls/C/main.m
@@ -0,0 +1,21 @@
+$set 14 #main
+
+$ #RCRequiresArg
+# error: '-rc' requires an argument\n
+$ #DISPLAYRequiresArg
+# error: '-display' requires an argument\n
+$ #WarnDisplaySet
+# warning: could not set environment variable 'DISPLAY'\n
+$ #Usage
+# Fluxkbox %s: (c) 2001 Henrik Kinnunen\n\n\
+  -display \t\tuse display connection.\n\
+  -rc \t\t\tuse alternate resource file.\n\
+  -version\t\t\tdisplay version and exit.\n\
+  -help\t\t\t\tdisplay this help text and exit.\n\n
+$ #CompileOptions
+# Compile time options:\n\
+  Debugging\t\t\t%s\n\
+  Interlacing:\t\t\t%s\n\
+  Shape:\t\t\t%s\n\
+  Slit:\t\t\t\t%s\n\
+  8bpp Ordered Dithering:\t%s\n\n
diff --git a/nls/Makefile.am b/nls/Makefile.am
new file mode 100644
index 00000000..4cb9cf96
--- /dev/null
+++ b/nls/Makefile.am
@@ -0,0 +1,13 @@
+# nls/Makefile.am for Blackbox 0.61.x - an X11 Window Manager
+
+NLSTEST = @NLS@
+SUBDIRS = C da_DK es_ES et_EE fr_FR pt_BR ru_RU sv_SE tr_TR it_IT
+MAINTAINERCLEANFILES = Makefile.in blackbox-nls.hh
+EXTRA_DIST=blackbox-nls.hh convert.awk
+
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls; \
+	fi
+distclean-local:
+	rm -f *\~
diff --git a/nls/Makefile.in b/nls/Makefile.in
new file mode 100644
index 00000000..7a1ad678
--- /dev/null
+++ b/nls/Makefile.in
@@ -0,0 +1,308 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# nls/Makefile.am for Blackbox 0.61.x - an X11 Window Manager
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+CXX = @CXX@
+DEBUG = @DEBUG@
+DLLTOOL = @DLLTOOL@
+GNOME = @GNOME@
+INTERLACE = @INTERLACE@
+KDE = @KDE@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+NEWWMSPEC = @NEWWMSPEC@
+NLS = @NLS@
+OBJDUMP = @OBJDUMP@
+ORDEREDPSEUDO = @ORDEREDPSEUDO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHAPE = @SHAPE@
+SLIT = @SLIT@
+TIMEDCACHE = @TIMEDCACHE@
+VERSION = @VERSION@
+gencat_cmd = @gencat_cmd@
+regex_cmd = @regex_cmd@
+
+NLSTEST = @NLS@
+SUBDIRS = C da_DK es_ES et_EE fr_FR pt_BR ru_RU sv_SE tr_TR it_IT
+MAINTAINERCLEANFILES = Makefile.in blackbox-nls.hh
+EXTRA_DIST = blackbox-nls.hh convert.awk
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps nls/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+@SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive  \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+	@set fnord $(MAKEFLAGS); amf=$$2; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@set fnord $(MAKEFLAGS); amf=$$2; \
+	dot_seen=no; \
+	rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+	  rev="$$subdir $$rev"; \
+	  test "$$subdir" = "." && dot_seen=yes; \
+	done; \
+	test "$$dot_seen" = "no" && rev=". $$rev"; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	here=`pwd` && cd $(srcdir) \
+	  && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+   if test "$$subdir" = .; then :; else \
+	    test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+   fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+	-rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = nls
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+	for subdir in $(SUBDIRS); do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d $(distdir)/$$subdir \
+	    || mkdir $(distdir)/$$subdir \
+	    || exit 1; \
+	    chmod 777 $(distdir)/$$subdir; \
+	    (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am: uninstall-local
+uninstall: uninstall-recursive
+all-am: Makefile
+all-redirect: all-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+mostlyclean-am:  mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am:  clean-tags clean-generic mostlyclean-am
+
+clean: clean-recursive
+
+distclean-am:  distclean-tags distclean-generic clean-am distclean-local
+	-rm -f libtool
+
+distclean: distclean-recursive
+
+maintainer-clean-am:  maintainer-clean-tags maintainer-clean-generic \
+		distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+
+.PHONY: install-data-recursive uninstall-data-recursive \
+install-exec-recursive uninstall-exec-recursive installdirs-recursive \
+uninstalldirs-recursive all-recursive check-recursive \
+installcheck-recursive info-recursive dvi-recursive \
+mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-local uninstall-am uninstall all-redirect all-am all \
+installdirs-am installdirs mostlyclean-generic distclean-generic \
+clean-generic maintainer-clean-generic clean mostlyclean distclean \
+maintainer-clean
+
+
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls; \
+	fi
+distclean-local:
+	rm -f *\~
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/nls/blackbox-nls.hh b/nls/blackbox-nls.hh
new file mode 100644
index 00000000..4a17d81b
--- /dev/null
+++ b/nls/blackbox-nls.hh
@@ -0,0 +1,167 @@
+#define BaseDisplaySet 0x1
+#define BaseDisplayXError 0x1
+#define BaseDisplaySignalCaught 0x2
+#define BaseDisplayShuttingDown 0x3
+#define BaseDisplayAborting 0x4
+#define BaseDisplayXConnectFail 0x5
+#define BaseDisplayCloseOnExecFail 0x6
+#define BaseDisplayBadWindowRemove 0x7
+
+#define BasemenuSet 0x2
+#define BasemenuBlackboxMenu 0x1
+
+#define ConfigmenuSet 0x3
+#define ConfigmenuConfigOptions 0x1
+#define ConfigmenuFocusModel 0x2
+#define ConfigmenuWindowPlacement 0x3
+#define ConfigmenuImageDithering 0x4
+#define ConfigmenuOpaqueMove 0x5
+#define ConfigmenuFullMax 0x6
+#define ConfigmenuFocusNew 0x7
+#define ConfigmenuFocusLast 0x8
+#define ConfigmenuClickToFocus 0x9
+#define ConfigmenuSloppyFocus 0xa
+#define ConfigmenuAutoRaise 0xb
+#define ConfigmenuSmartRows 0xc
+#define ConfigmenuSmartCols 0xd
+#define ConfigmenuCascade 0xe
+#define ConfigmenuLeftRight 0xf
+#define ConfigmenuRightLeft 0x10
+#define ConfigmenuTopBottom 0x11
+#define ConfigmenuBottomTop 0x12
+#define ConfigmenuTabs 0x13
+#define ConfigmenuIcons 0x14
+#define ConfigmenuTabPlacement 0x15
+#define ConfigmenuTabRotateVertical 0x16
+#define ConfigmenuSemiSloppyFocus 0x17
+
+#define IconSet 0x4
+#define IconIcons 0x1
+
+#define ImageSet 0x5
+#define ImageErrorCreatingSolidPixmap 0x1
+#define ImageErrorCreatingXImage 0x2
+#define ImageUnsupVisual 0x3
+#define ImageErrorCreatingPixmap 0x4
+#define ImageInvalidColormapSize 0x5
+#define ImageErrorAllocatingColormap 0x6
+#define ImageColorAllocFail 0x7
+#define ImagePixmapRelease 0x8
+#define ImagePixmapCacheLarge 0x9
+#define ImageColorParseError 0xa
+#define ImageColorAllocError 0xb
+
+#define ScreenSet 0x6
+#define ScreenAnotherWMRunning 0x1
+#define ScreenManagingScreen 0x2
+#define ScreenFontLoadFail 0x3
+#define ScreenDefaultFontLoadFail 0x4
+#define ScreenEmptyMenuFile 0x5
+#define Screenxterm 0x6
+#define ScreenRestart 0x7
+#define ScreenExit 0x8
+#define ScreenEXECError 0x9
+#define ScreenEXITError 0xa
+#define ScreenSTYLEError 0xb
+#define ScreenCONFIGError 0xc
+#define ScreenINCLUDEError 0xd
+#define ScreenINCLUDEErrorReg 0xe
+#define ScreenSUBMENUError 0xf
+#define ScreenRESTARTError 0x10
+#define ScreenRECONFIGError 0x11
+#define ScreenSTYLESDIRError 0x12
+#define ScreenSTYLESDIRErrorNotDir 0x13
+#define ScreenSTYLESDIRErrorNoExist 0x14
+#define ScreenWORKSPACESError 0x15
+#define ScreenPositionLength 0x16
+#define ScreenPositionFormat 0x17
+#define ScreenGeometryFormat 0x18
+
+#define SlitSet 0x7
+#define SlitSlitTitle 0x1
+#define SlitSlitDirection 0x2
+#define SlitSlitPlacement 0x3
+
+#define ToolbarSet 0x8
+#define ToolbarNoStrftimeLength 0x1
+#define ToolbarNoStrftimeDateFormat 0x2
+#define ToolbarNoStrftimeDateFormatEu 0x3
+#define ToolbarNoStrftimeTimeFormat24 0x4
+#define ToolbarNoStrftimeTimeFormat12 0x5
+#define ToolbarNoStrftimeTimeFormatP 0x6
+#define ToolbarNoStrftimeTimeFormatA 0x7
+#define ToolbarToolbarTitle 0x8
+#define ToolbarEditWkspcName 0x9
+#define ToolbarToolbarPlacement 0xa
+
+#define WindowSet 0x9
+#define WindowCreating 0x1
+#define WindowXGetWindowAttributesFail 0x2
+#define WindowCannotFindScreen 0x3
+#define WindowUnnamed 0x4
+#define WindowMapRequest 0x5
+#define WindowUnmapNotify 0x6
+#define WindowUnmapNotifyReparent 0x7
+
+#define WindowmenuSet 0xa
+#define WindowmenuSendTo 0x1
+#define WindowmenuSendGroupTo 0x2
+#define WindowmenuShade 0x3
+#define WindowmenuIconify 0x4
+#define WindowmenuMaximize 0x5
+#define WindowmenuRaise 0x6
+#define WindowmenuLower 0x7
+#define WindowmenuStick 0x8
+#define WindowmenuKillClient 0x9
+#define WindowmenuClose 0xa
+
+#define WorkspaceSet 0xb
+#define WorkspaceDefaultNameFormat 0x1
+
+#define WorkspacemenuSet 0xc
+#define WorkspacemenuWorkspacesTitle 0x1
+#define WorkspacemenuNewWorkspace 0x2
+#define WorkspacemenuRemoveLast 0x3
+
+#define blackboxSet 0xd
+#define blackboxNoManagableScreens 0x1
+#define blackboxMapRequest 0x2
+
+#define CommonSet 0xe
+#define CommonYes 0x1
+#define CommonNo 0x2
+#define CommonDirectionTitle 0x3
+#define CommonDirectionHoriz 0x4
+#define CommonDirectionVert 0x5
+#define CommonAlwaysOnTop 0x6
+#define CommonPlacementTitle 0x7
+#define CommonPlacementTopLeft 0x8
+#define CommonPlacementCenterLeft 0x9
+#define CommonPlacementBottomLeft 0xa
+#define CommonPlacementTopCenter 0xb
+#define CommonPlacementBottomCenter 0xc
+#define CommonPlacementTopRight 0xd
+#define CommonPlacementCenterRight 0xe
+#define CommonPlacementBottomRight 0xf
+#define CommonPlacementLeftTop 0x10
+#define CommonPlacementLeftCenter 0x11
+#define CommonPlacementLeftBottom 0x12
+#define CommonPlacementRightTop 0x13
+#define CommonPlacementRightCenter 0x14
+#define CommonPlacementRightBottom 0x15
+#define CommonPlacementTopRelative 0x16
+#define CommonPlacementBottomRelative 0x17
+#define CommonPlacementLeftRelative 0x18
+#define CommonPlacementRightRelative 0x19
+#define CommonAutoHide 0x1a
+
+#define mainSet 0xf
+#define mainRCRequiresArg 0x1
+#define mainDISPLAYRequiresArg 0x2
+#define mainWarnDisplaySet 0x3
+#define mainUsage 0x4
+#define mainCompileOptions 0x5
+
+#define bsetrootSet 0x10
+#define bsetrootMustSpecify 0x1
+#define bsetrootUsage 0x2
diff --git a/nls/convert.awk b/nls/convert.awk
new file mode 100644
index 00000000..744179c7
--- /dev/null
+++ b/nls/convert.awk
@@ -0,0 +1,32 @@
+/^\$set/ {
+  major++
+  minor = 0
+
+  if (major > 1)
+    printf "\n" > output
+  printf "$set %d %s\n", major, $3 > output
+
+  if (header) {
+    majorName = substr($3, 2)
+    if (major > 1)
+      printf "\n" > header
+    printf "#define %sSet %#x\n", majorName, major > header
+  }
+}
+
+/^\$ #/ {
+  minor++
+
+  if (header) {
+    minorName = substr($2, 2)
+    printf "#define %s%s %#x\n", majorName, minorName, minor > header
+  }
+}
+
+/^#/ {
+  text = substr($0, 3)  
+  printf "%d %s\n", minor, text > output
+}
+  
+! /^(\$|#)/ { print > output }
+
diff --git a/nls/da_DK/BaseDisplay.m b/nls/da_DK/BaseDisplay.m
new file mode 100644
index 00000000..584e771b
--- /dev/null
+++ b/nls/da_DK/BaseDisplay.m
@@ -0,0 +1,16 @@
+$set 1 #BaseDisplay
+
+$ #XError
+# %s:  X fejl: %s(%d) kode %d/%d\n  resource 0x%lx\n
+$ #SignalCaught
+# %s: signal %d fanget\n
+$ #ShuttingDown
+# lukker ned\n
+$ #Aborting
+# Avbryder... dumper kernen\n
+$ #XConnectFail
+# BaseDisplay::BaseDisplay: tilslutning til X server mislykkedes.\n
+$ #CloseOnExecFail
+# BaseDisplay::BaseDisplay: kunne ikke markere skærmtilslutning som luk-ved-afslut\n
+$ #BadWindowRemove
+# BaseDisplay::eventLoop(): fjerner dårligt vindue fra hændelseskøen\n
diff --git a/nls/da_DK/Basemenu.m b/nls/da_DK/Basemenu.m
new file mode 100644
index 00000000..5af69f8e
--- /dev/null
+++ b/nls/da_DK/Basemenu.m
@@ -0,0 +1,4 @@
+$set 2 #Basemenu
+
+$ #BlackboxMenu
+# Blackboxmenu
diff --git a/nls/da_DK/Configmenu.m b/nls/da_DK/Configmenu.m
new file mode 100644
index 00000000..438af96c
--- /dev/null
+++ b/nls/da_DK/Configmenu.m
@@ -0,0 +1,46 @@
+$set 3 #Configmenu
+
+$ #ConfigOptions
+# Indstillinger
+$ #FocusModel
+# Fokus Model
+$ #WindowPlacement
+# Vindueplacering
+$ #ImageDithering
+# Billede Dithering
+$ #OpaqueMove
+# Uklar vinduesflytning
+$ #FullMax
+# Fuld maximering
+$ #FocusNew
+# Fokus nyt vindue
+$ #FocusLast
+# Fokus vindue ved skrivebords ændring
+$ #ClickToFocus
+# Klik for fokus
+$ #SloppyFocus
+# Dovent fokus
+$ #AutoRaise
+# Hæv automatisk
+$ #SmartRows
+# Intelligent placering (Rækker)
+$ #SmartCols
+# Intelligent placering (Søjler)
+$ #Cascade
+# Kaskade placering
+$ #LeftRight
+# Fra venstre mod højre
+$ #RightLeft
+# Fra højre mod venstre
+$ #TopBottom
+# Oppefra
+$ #BottomTop
+# Nedefra
+$ #Tabs
+# Use Tabs
+$ #Icons
+# Use Icons
+$ #TabRotateVertical
+# Rotate Vertical Tabs
+$ #SemiSloppyFocus
+# Semi Sloppy Focus
diff --git a/nls/da_DK/Icon.m b/nls/da_DK/Icon.m
new file mode 100644
index 00000000..e3630b47
--- /dev/null
+++ b/nls/da_DK/Icon.m
@@ -0,0 +1,6 @@
+$set 4 #Icon
+
+$ #Icons
+# Ikoner
+$ #Unnamed
+# Intet navn
diff --git a/nls/da_DK/Image.m b/nls/da_DK/Image.m
new file mode 100644
index 00000000..57562eb7
--- /dev/null
+++ b/nls/da_DK/Image.m
@@ -0,0 +1,24 @@
+$set 5 #Image
+
+$ #ErrorCreatingSolidPixmap
+# BImage::render_solid: fejl ved skabelse af pixmap\n
+$ #ErrorCreatingXImage
+# BImage::renderXImage: fejl ved skabelse af XImage\n
+$ #UnsupVisual
+# BImage::renderXImage: ikke support for farvedybden\n
+$ #ErrorCreatingPixmap
+# BImage::renderPixmap: fejl ved skabelse af pixmap\n
+$ #InvalidColormapSize
+# BImageControl::BImageControl: ugyldigt farvekort størrelse %d (%d/%d/%d) - reducing\n
+$ #ErrorAllocatingColormap
+# BImageControl::BImageControl: fejl ved allokering af farvekort\n
+$ #ColorAllocFail
+# BImageControl::BImageControl: fejl ved allokering af farve %d/%d/%d\n
+$ #PixmapRelease
+# BImageControl::~BImageControl: pixmap cache - sletter %d pixmaps\n
+$ #PixmapCacheLarge
+# BImageControl::renderImage: cache er for stor, gennemtvinger rensning\n
+$ #ColorParseError
+# BImageControl::getColor: farvefejl: '%s'\n
+$ #ColorAllocError
+# BImageControl::getColor: farveallokeringsfejl: '%s'\n
diff --git a/nls/da_DK/Makefile.am b/nls/da_DK/Makefile.am
new file mode 100644
index 00000000..6c9ea01a
--- /dev/null
+++ b/nls/da_DK/Makefile.am
@@ -0,0 +1,29 @@
+# nls/da_DK/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST= $(MFILES)
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/da_DK"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/da_DK; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/da_DK; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/da_DK/blackbox.cat; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/da_DK; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
diff --git a/nls/da_DK/Makefile.in b/nls/da_DK/Makefile.in
new file mode 100644
index 00000000..22fb3da5
--- /dev/null
+++ b/nls/da_DK/Makefile.in
@@ -0,0 +1,220 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# nls/da_DK/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+CXX = @CXX@
+DEBUG = @DEBUG@
+DLLTOOL = @DLLTOOL@
+GNOME = @GNOME@
+INTERLACE = @INTERLACE@
+KDE = @KDE@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+NEWWMSPEC = @NEWWMSPEC@
+NLS = @NLS@
+OBJDUMP = @OBJDUMP@
+ORDEREDPSEUDO = @ORDEREDPSEUDO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHAPE = @SHAPE@
+SLIT = @SLIT@
+TIMEDCACHE = @TIMEDCACHE@
+VERSION = @VERSION@
+gencat_cmd = @gencat_cmd@
+regex_cmd = @regex_cmd@
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST = $(MFILES)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps nls/da_DK/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = nls/da_DK
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-data-local
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-local
+uninstall: uninstall-am
+all-am: Makefile all-local
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+	-rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-local install-data-am install-data install-am install \
+uninstall-local uninstall-am uninstall all-local all-redirect all-am \
+all installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/da_DK"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/da_DK; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/da_DK; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/da_DK/blackbox.cat; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/da_DK; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/nls/da_DK/Screen.m b/nls/da_DK/Screen.m
new file mode 100644
index 00000000..00adb005
--- /dev/null
+++ b/nls/da_DK/Screen.m
@@ -0,0 +1,53 @@
+$set 6 #Screen
+
+$ #AnotherWMRunning
+# BScreen::BScreen: fejl ved forespørgsel til X server.\n  \
+en anden window manager er allerede kørende på display %s.\n
+$ #ManagingScreen
+# BScreen::BScreen: håndterer skærm %d med visuel 0x%lx, farvedybde %d\n
+$ #FontLoadFail
+# BScreen::LoadStyle(): kunne ikke hente font '%s'\n
+$ #DefaultFontLoadFail
+# BScreen::LoadStyle(): kunne ikke hente standardfonten.\n
+$ #EmptyMenuFile
+# %s: tom menu fil\n
+$ #xterm
+# xterm
+$ #Restart
+# Genstart
+$ #Exit
+# Afslut
+$ #EXECError
+# BScreen::parseMenuFile: [exec] fejl, ingen menu etikette og/eller kommando defineret\n
+$ #EXITError
+# BScreen::parseMenuFile: [exit] fejl, ingen menu etikette defineret\n
+$ #STYLEError
+# BScreen::parseMenuFile: [style] fejl, ingen menu etikette og/eller filnavn \
+defineret\n
+$ #CONFIGError
+# BScreen::parseMenuFile: [config] fejl, ingen menu etikette defineret\n
+$ #INCLUDEError
+# BScreen::parseMenuFile: [include] fejl, intet filnavn defineret\n
+$ #INCLUDEErrorReg
+# BScreen::parseMenuFile: [include] fejl, '%s' er ikke en normal fil\n
+$ #SUBMENUError
+# BScreen::parseMenuFile: [submenu] fejl, ingen menu etikette defineret\n
+$ #RESTARTError
+# BScreen::parseMenuFile: [restart] fejl, ingen menu etikette defineret\n
+$ #RECONFIGError
+# BScreen::parseMenuFile: [reconfig] fejl, ingen menu etikette defineret\n
+$ #STYLESDIRError
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] fejl, intet katalog defineret\n
+$ #STYLESDIRErrorNotDir
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] fejl, '%s' er ikke et katalog\n
+$ #STYLESDIRErrorNoExist
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] fejl, '%s' eksisterer ikke\n
+$ #WORKSPACESError
+# BScreen::parseMenuFile: [workspaces] fejl, ingen menu etikette defineret\n
+$ #PositionLength
+# 0: 0000 x 0: 0000
+$ #PositionFormat
+# X: %4d x Y: %4d
+$ #GeometryFormat
+# W: %4d x H: %4d
+
diff --git a/nls/da_DK/Slit.m b/nls/da_DK/Slit.m
new file mode 100644
index 00000000..e207e29d
--- /dev/null
+++ b/nls/da_DK/Slit.m
@@ -0,0 +1,8 @@
+$set 7 #Slit
+
+$ #SlitTitle
+# Slit
+$ #SlitDirection
+# Slit retning
+$ #SlitPlacement
+# Slit placering
diff --git a/nls/da_DK/Toolbar.m b/nls/da_DK/Toolbar.m
new file mode 100644
index 00000000..c889c94d
--- /dev/null
+++ b/nls/da_DK/Toolbar.m
@@ -0,0 +1,22 @@
+$set 8 #Toolbar
+
+$ #NoStrftimeLength
+# 00:00000
+$ #NoStrftimeDateFormat
+# %02d/%02d/%02d
+$ #NoStrftimeDateFormatEu
+# %02d.%02d.%02d
+$ #NoStrftimeTimeFormat24
+#  %02d:%02d 
+$ #NoStrftimeTimeFormat12
+# %02d:%02d %sm
+$ #NoStrftimeTimeFormatP
+# p
+$ #NoStrftimeTimeFormatA
+# a
+$ #ToolbarTitle
+# Værktøjsbjælke
+$ #EditWkspcName
+# Andring af skrivebordets navn
+$ #ToolbarPlacement
+# Værktøjsbjælkens placering
diff --git a/nls/da_DK/Window.m b/nls/da_DK/Window.m
new file mode 100644
index 00000000..f9002714
--- /dev/null
+++ b/nls/da_DK/Window.m
@@ -0,0 +1,17 @@
+$set 9 #Window
+
+
+$ #Creating
+# BlackboxWindow::BlackboxWindow: skaber 0x%lx\n
+$ #XGetWindowAttributesFail
+# BlackboxWindow::BlackboxWindow: XGetWindowAttributres fejlede\n
+$ #CannotFindScreen
+# BlackboxWindow::BlackboxWindow: kunne ikke finde skærm til hovedvinduet 0x%lx\n
+$ #Unnamed
+# Intet navn
+$ #MapRequest
+# BlackboxWindow::mapRequestEvent() for 0x%lx\n
+$ #UnmapNotify
+# BlackboxWindow::unmapNotifyEvent() for 0x%lx\n
+$ #UnmapNotifyReparent
+# BlackboxWindow::unmapnotifyEvent: sætter 0x%lx til hovedvinduet\n
diff --git a/nls/da_DK/Windowmenu.m b/nls/da_DK/Windowmenu.m
new file mode 100644
index 00000000..ebbf0adb
--- /dev/null
+++ b/nls/da_DK/Windowmenu.m
@@ -0,0 +1,20 @@
+$set 10 #Windowmenu
+
+$ #SendTo
+# Send til ...
+$ #Shade
+# Skygge
+$ #Iconify
+# Iconificeret
+$ #Maximize
+# Maksimer
+$ #Raise
+# Hæv
+$ #Lower
+# Sænk
+$ #Stick
+# Klæbrig
+$ #KillClient
+# Dræb klient
+$ #Close
+# Luk
diff --git a/nls/da_DK/Workspace.m b/nls/da_DK/Workspace.m
new file mode 100644
index 00000000..1093dda5
--- /dev/null
+++ b/nls/da_DK/Workspace.m
@@ -0,0 +1,4 @@
+$set 11 #Workspace
+
+$ #DefaultNameFormat
+# Skrivebord %d
diff --git a/nls/da_DK/Workspacemenu.m b/nls/da_DK/Workspacemenu.m
new file mode 100644
index 00000000..94317b85
--- /dev/null
+++ b/nls/da_DK/Workspacemenu.m
@@ -0,0 +1,8 @@
+$set 12 #Workspacemenu
+
+$ #WorkspacesTitle
+# Skriveborde
+$ #NewWorkspace
+# Nyt skrivebord
+$ #RemoveLast
+# Fjern sidste
diff --git a/nls/da_DK/blackbox.m b/nls/da_DK/blackbox.m
new file mode 100644
index 00000000..e4e8959d
--- /dev/null
+++ b/nls/da_DK/blackbox.m
@@ -0,0 +1,6 @@
+$set 13 #blackbox
+
+$ #NoManagableScreens
+# Blackbox::Blackbox: ingen håndterbare skærme fundet, afslutter\n
+$ #MapRequest
+# Blackbox::process_event: MapRequest for 0x%lx\n
diff --git a/nls/da_DK/bsetroot.m b/nls/da_DK/bsetroot.m
new file mode 100644
index 00000000..cd869ad6
--- /dev/null
+++ b/nls/da_DK/bsetroot.m
@@ -0,0 +1,16 @@
+$set 16 #bsetroot
+
+$ #MustSpecify
+# %s: fejl: specificér en af følgende: -solid, -mod, -gradient\n
+$ #Usage
+# %s 2.0: (c) 1997-2000 Brad Hughes\n\n\
+  -display         skærmtilslutning\n\
+  -mod               modula mønster\n\
+  -foreground, -fg  modula foregrundsfarve\n\
+  -background, -bg  modula baggrundsfarve\n\n\
+  -gradient       gradient tekstur\n\
+  -from             gradient start farve\n\
+  -to               gradient slut farve\n\n\
+  -solid            fast farve\n\n\
+  -help                    hvis denne hjælp og afslut\n
+
diff --git a/nls/da_DK/common.m b/nls/da_DK/common.m
new file mode 100644
index 00000000..b84396ed
--- /dev/null
+++ b/nls/da_DK/common.m
@@ -0,0 +1,57 @@
+$set 15 #Common
+
+$ #Yes
+# Ja
+$ #No
+# Nej
+
+$ #DirectionTitle
+# Retning
+$ #DirectionHoriz
+# Horisontal
+$ #DirectionVert
+# Vertikal
+
+$ #AlwaysOnTop
+# Altid øverst
+
+$ #PlacementTitle
+# Placering
+$ #PlacementTopLeft
+# Øverste venstre hjørne
+$ #PlacementCenterLeft
+# Venstre i midten
+$ #PlacementBottomLeft
+# Bunden til venstre
+$ #PlacementTopCenter
+# Toppen i midten
+$ #PlacementBottomCenter
+# Bunden i midten
+$ #PlacementTopRight
+# Øverst til højre
+$ #PlacementCenterRight
+# Til højre i midten
+$ #PlacementBottomRight
+# Til højre i bunden
+$ #PlacementLeftTop
+# Left Top
+$ #PlacementLeftCenter
+# Left Center
+$ #PlacementLeftBottom
+# Left Bottom
+$ #PlacementRightTop
+# Right Top
+$ #PlacementRightCenter
+# Right Center
+$ #PlacementRightBottom
+# Right Bottom
+$ #PlacementTopRelative
+# Top Relative
+$ #PlacementBottomRelative
+# Bottom Relative
+$ #PlacementLeftRelative
+# Left Relative
+$ #PlacementRightRelative
+# Right Relative
+$ #AutoHide
+# Gem automatisk
diff --git a/nls/da_DK/main.m b/nls/da_DK/main.m
new file mode 100644
index 00000000..5da1289c
--- /dev/null
+++ b/nls/da_DK/main.m
@@ -0,0 +1,21 @@
+$set 14 #main
+
+$ #RCRequiresArg
+# fejl: '-rc' kræver et argument\n
+$ #DISPLAYRequiresArg
+# fjel: '-display' kræver et argument\n
+$ #WarnDisplaySet
+# advarsel: kunne ikke sætte variablen 'DISPLAY'\n
+$ #Usage
+# Fluxbox %s: (c) 2001 Henrik Kinnunen\n\n\
+  -display \t\tbrug skærm tilslutning.\n\
+  -rc \t\t\tbrug alternativ resource fil.\n\
+  -version\t\t\tvis versionsnummer og afslut.\n\
+  -help\t\t\t\tvis denne hjælp og afslut.\n\n
+$ #CompileOptions
+# Kompileret med:\n\
+  Debugging\t\t\t%s\n\
+  Interlacing:\t\t\t%s\n\
+  Shape:\t\t\t%s\n\
+  Slit:\t\t\t\t%s\n\
+  8bpp Ordered Dithering:\t%s\n\n
diff --git a/nls/es_ES/BaseDisplay.m b/nls/es_ES/BaseDisplay.m
new file mode 100644
index 00000000..07e42282
--- /dev/null
+++ b/nls/es_ES/BaseDisplay.m
@@ -0,0 +1,16 @@
+$set 1 #BaseDisplay
+
+$ #XError
+# %s:  Un error de X: %s(%d) clave de operación %d/%d\n  recurso 0x%lx\n
+$ #SignalCaught
+# %s: señal %d capturada\n
+$ #ShuttingDown
+# cerrando\n
+$ #Aborting
+# cancelando... generando 'core'\n
+$ #XConnectFail
+# BaseDisplay::BaseDisplay: la conexión al servidor de X falló.\n
+$ #CloseOnExecFail
+# BaseDisplay::BaseDisplay: no se pude marcar la conexión de despliegue como close-on-exec\n
+$ #BadWindowRemove
+# BaseDisplay::eventLoop(): quitando la ventana errónea de la cola de eventos\n
diff --git a/nls/es_ES/Basemenu.m b/nls/es_ES/Basemenu.m
new file mode 100644
index 00000000..0f4f9c9b
--- /dev/null
+++ b/nls/es_ES/Basemenu.m
@@ -0,0 +1,4 @@
+$set 2 #Basemenu
+
+$ #BlackboxMenu
+# Menú de Blackbox
diff --git a/nls/es_ES/Configmenu.m b/nls/es_ES/Configmenu.m
new file mode 100644
index 00000000..bc38ea7c
--- /dev/null
+++ b/nls/es_ES/Configmenu.m
@@ -0,0 +1,48 @@
+$set 3 #Configmenu
+
+$ #ConfigOptions
+# Opciones de configuración
+$ #FocusModel
+# Modelo de enfoque
+$ #WindowPlacement
+# Ubicación de ventanas
+$ #ImageDithering
+# Simulación de colores en imágenes
+$ #OpaqueMove
+# Movimiento opaco de ventanas
+$ #FullMax
+# Maximización total
+$ #FocusNew
+# Enfocar ventanas nuevas
+$ #FocusLast
+# Enfocar la última ventana en el escritorio
+$ #ClickToFocus
+# Seleccionar para enfocar
+$ #SloppyFocus
+# Enfocar sin forma estricta
+$ #AutoRaise
+# Elevar automáticamente las ventanas
+$ #SmartRows
+# Ubicación inteligente (filas)
+$ #SmartCols
+# Ubicación inteligente (columnas)
+$ #Cascade
+# Ubicación en cascada
+$ #LeftRight
+# De izquierda a derecha
+$ #RightLeft
+# De derecha a izquierda
+$ #TopBottom
+# De arriba hacia abajo
+$ #BottomTop
+# De abajo hacia arriba
+$ #Tabs
+# Use Tabs
+$ #Icons
+# Use Icons
+$ #TabPlacement
+# Tab Placement
+$ #TabRotateVertical
+# Rotate Vertical Tabs
+$ #SemiSloppyFocus
+# Semi Sloppy Focus
diff --git a/nls/es_ES/Icon.m b/nls/es_ES/Icon.m
new file mode 100644
index 00000000..4d576de3
--- /dev/null
+++ b/nls/es_ES/Icon.m
@@ -0,0 +1,4 @@
+$set 4 #Icon
+
+$ #Icons
+# Iconos
diff --git a/nls/es_ES/Image.m b/nls/es_ES/Image.m
new file mode 100644
index 00000000..f7e85e9f
--- /dev/null
+++ b/nls/es_ES/Image.m
@@ -0,0 +1,24 @@
+$set 5 #Image
+
+$ #ErrorCreatingSolidPixmap
+# BImage::render_solid: error creando el pixmap\n
+$ #ErrorCreatingXImage
+# BImage::renderXImage: error creando el XImage\n
+$ #UnsupVisual
+# BImage::renderXImage: visual no soportado\n
+$ #ErrorCreatingPixmap
+# BImage::renderPixmap: error creando el pixmap\n
+$ #InvalidColormapSize
+# BImageControl::BImageControl: mapa no válido de colores tamaño %d (%d/%d/%d) - reduciendo\n
+$ #ErrorAllocatingColormap
+# BImageControl::BImageControl: error en la asignación del mapa de colores\n
+$ #ColorAllocFail
+# BImageControl::BImageControl: no se puede asignar el color %d/%d/%d\n
+$ #PixmapRelease
+# BImageControl::~BImageControl: reserva de pixmaps - liberando %d pixmaps\n
+$ #PixmapCacheLarge
+# BImageControl::renderImage: reserva de pixmaps grande, forzando limpieza\n
+$ #ColorParseError
+# BImageControl::getColor: error evaluando el color: '%s'\n
+$ #ColorAllocError
+# BImageControl::getColor: error asignando el color: '%s'\n
diff --git a/nls/es_ES/Makefile.am b/nls/es_ES/Makefile.am
new file mode 100644
index 00000000..5856c875
--- /dev/null
+++ b/nls/es_ES/Makefile.am
@@ -0,0 +1,32 @@
+# nls/es_ES/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST=$(MFILES)
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/es_ES"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/es_ES; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/es_ES; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/es; \
+		ln -fs es_ES $(DESTDIR)$(pkgdatadir)/nls/es; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/es_ES/blackbox.cat; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/es; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/es_ES; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
diff --git a/nls/es_ES/Makefile.in b/nls/es_ES/Makefile.in
new file mode 100644
index 00000000..4fa557ed
--- /dev/null
+++ b/nls/es_ES/Makefile.in
@@ -0,0 +1,223 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# nls/es_ES/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+CXX = @CXX@
+DEBUG = @DEBUG@
+DLLTOOL = @DLLTOOL@
+GNOME = @GNOME@
+INTERLACE = @INTERLACE@
+KDE = @KDE@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+NEWWMSPEC = @NEWWMSPEC@
+NLS = @NLS@
+OBJDUMP = @OBJDUMP@
+ORDEREDPSEUDO = @ORDEREDPSEUDO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHAPE = @SHAPE@
+SLIT = @SLIT@
+TIMEDCACHE = @TIMEDCACHE@
+VERSION = @VERSION@
+gencat_cmd = @gencat_cmd@
+regex_cmd = @regex_cmd@
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST = $(MFILES)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps nls/es_ES/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = nls/es_ES
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-data-local
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-local
+uninstall: uninstall-am
+all-am: Makefile all-local
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+	-rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-local install-data-am install-data install-am install \
+uninstall-local uninstall-am uninstall all-local all-redirect all-am \
+all installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/es_ES"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/es_ES; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/es_ES; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/es; \
+		ln -fs es_ES $(DESTDIR)$(pkgdatadir)/nls/es; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/es_ES/blackbox.cat; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/es; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/es_ES; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/nls/es_ES/Screen.m b/nls/es_ES/Screen.m
new file mode 100644
index 00000000..25841263
--- /dev/null
+++ b/nls/es_ES/Screen.m
@@ -0,0 +1,51 @@
+$set 6 #Screen
+
+$ #AnotherWMRunning
+# BScreen::BScreen: un error ocurrió mientras cuestionaba el servidor X.\n  otro gestor de ventanas se está ejecutando en conexión de despliegue %s.\n
+$ #ManagingScreen
+# BScreen::BScreen: gestionando la pantalla %d usando visual 0x%lx, profundidad %d\n
+$ #FontLoadFail
+# BScreen::LoadStyle(): no se puede cargar el tipo de letra '%s'\n
+$ #DefaultFontLoadFail
+# BScreen::LoadStyle(): no se puede cargar el tipo de letra por omisión.\n
+$ #EmptyMenuFile
+# %s: archivo de menú vacío\n
+$ #xterm
+# xterm
+$ #Restart
+# Reiniciar
+$ #Exit
+# Salir
+$ #EXECError
+# BScreen::parseMenuFile: [exec] error, no hay etiqueta de menú ni comando definido\n
+$ #EXITError
+# BScreen::parseMenuFile: [exit] error, no hay etiqueta de menú definida\n
+$ #STYLEError
+# BScreen::parseMenuFile: [style] error, no hay etiqueta de menú ni archivo \
+definido\n
+$ #CONFIGError
+# BScreen::parseMenuFile: [config] error, no hay etiqueta de menú definida\n
+$ #INCLUDEError
+# BScreen::parseMenuFile: [include] error, no hay nombre de archivo definido\n
+$ #INCLUDEErrorReg
+# BScreen::parseMenuFile: [include] error, '%s' no es un archivo regular\n
+$ #SUBMENUError
+# BScreen::parseMenuFile: [submenu] error, no hay etiqueta de menú definida\n
+$ #RESTARTError
+# BScreen::parseMenuFile: [restart] error, no hay etiqueta de menú definida\n
+$ #RECONFIGError
+# BScreen::parseMenuFile: [reconfig] error, no hay etiqueta de menú definida\n
+$ #STYLESDIRError
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] error, no hay directorio definido\n
+$ #STYLESDIRErrorNotDir
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] error, '%s' no es un directorio\n
+$ #STYLESDIRErrorNoExist
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] error, '%s' no existe\n
+$ #WORKSPACESError
+# BScreen::parseMenuFile: [workspaces] error, no hay etiqueta de menú definida\n
+$ #PositionLength
+# 0: 0000 x 0: 0000
+$ #PositionFormat
+# X: %4d x Y: %4d
+$ #GeometryFormat
+# W: %4d x H: %4d
diff --git a/nls/es_ES/Slit.m b/nls/es_ES/Slit.m
new file mode 100644
index 00000000..9af9a6af
--- /dev/null
+++ b/nls/es_ES/Slit.m
@@ -0,0 +1,8 @@
+$set 7 #Slit
+
+$ #SlitTitle
+# Slit
+$ #SlitDirection
+# Dirección de slit
+$ #SlitPlacement
+# Ubicación de slit
diff --git a/nls/es_ES/Toolbar.m b/nls/es_ES/Toolbar.m
new file mode 100644
index 00000000..36be026a
--- /dev/null
+++ b/nls/es_ES/Toolbar.m
@@ -0,0 +1,22 @@
+$set 8 #Toolbar
+
+$ #NoStrftimeLength
+# 00:00000
+$ #NoStrftimeDateFormat
+# %02d/%02d/%02d
+$ #NoStrftimeDateFormatEu
+# %02d.%02d.%02d
+$ #NoStrftimeTimeFormat24
+# %02d:%02d
+$ #NoStrftimeTimeFormat12
+# %02d:%02d %sm
+$ #NoStrftimeTimeFormatP
+# p
+$ #NoStrftimeTimeFormatA
+# a
+$ #ToolbarTitle
+# Escritorio
+$ #EditWkspcName
+# Cambiar el nombre del escritorio actual
+$ #ToolbarPlacement
+# Ubicación de la barra de herramientas
diff --git a/nls/es_ES/Window.m b/nls/es_ES/Window.m
new file mode 100644
index 00000000..810f0644
--- /dev/null
+++ b/nls/es_ES/Window.m
@@ -0,0 +1,18 @@
+$set 9 #Window
+
+
+$ #Creating
+# BlackboxWindow::BlackboxWindow: creando 0x%lx\n
+$ #XGetWindowAttributesFail
+# BlackboxWindow::BlackboxWindow: XGetWindowAttributres falló\n
+$ #CannotFindScreen
+# BlackboxWindow::BlackboxWindow: no se puede encontrar la pantalla para la ventana \
+  raíz 0x%lx\n
+$ #Unnamed
+# Sin nombre
+$ #MapRequest
+# BlackboxWindow::mapRequestEvent() para 0x%lx\n
+$ #UnmapNotify
+# BlackboxWindow::unmapNotifyEvent() para 0x%lx\n
+$ #UnmapNotifyReparent
+# BlackboxWindow::unmapnotifyEvent: el padre nuevo para 0x%lx es la raíz\n
diff --git a/nls/es_ES/Windowmenu.m b/nls/es_ES/Windowmenu.m
new file mode 100644
index 00000000..b2e0c540
--- /dev/null
+++ b/nls/es_ES/Windowmenu.m
@@ -0,0 +1,20 @@
+$set 10 #Windowmenu
+
+$ #SendTo
+# Enviar a ...
+$ #Shade
+# Enrollar
+$ #Iconify
+# Convertir en icono
+$ #Maximize
+# Maximizar
+$ #Raise
+# Elevar
+$ #Lower
+# Bajar
+$ #Stick
+# Fijar
+$ #KillClient
+# Matar al cliente
+$ #Close
+# Cerrar
diff --git a/nls/es_ES/Workspace.m b/nls/es_ES/Workspace.m
new file mode 100644
index 00000000..234e310c
--- /dev/null
+++ b/nls/es_ES/Workspace.m
@@ -0,0 +1,4 @@
+$set 11 #Workspace
+
+$ #DefaultNameFormat
+# Escritorio %d
diff --git a/nls/es_ES/Workspacemenu.m b/nls/es_ES/Workspacemenu.m
new file mode 100644
index 00000000..64fb4606
--- /dev/null
+++ b/nls/es_ES/Workspacemenu.m
@@ -0,0 +1,8 @@
+$set 12 #Workspacemenu
+
+$ #WorkspacesTitle
+# Escritorios
+$ #NewWorkspace
+# Escritorio nuevo
+$ #RemoveLast
+# Quitar el último escritorio
diff --git a/nls/es_ES/blackbox.m b/nls/es_ES/blackbox.m
new file mode 100644
index 00000000..469c6068
--- /dev/null
+++ b/nls/es_ES/blackbox.m
@@ -0,0 +1,6 @@
+$set 13 #blackbox
+
+$ #NoManagableScreens
+# Blackbox::Blackbox: no encontré pantallas manejables, cerrando\n
+$ #MapRequest
+# Blackbox::process_event: MapRequest para 0x%lx\n
diff --git a/nls/es_ES/bsetroot.m b/nls/es_ES/bsetroot.m
new file mode 100644
index 00000000..0692e9e4
--- /dev/null
+++ b/nls/es_ES/bsetroot.m
@@ -0,0 +1,16 @@
+$set 16 #bsetroot
+
+$ #MustSpecify
+# %s: error: es necesario especifiar uno de: -solid, -mod, -gradient\n
+$ #Usage
+# %s 2.0: (c) 1997-2000 Brad Hughes\n\n\
+  -display         conexión de despliegue\n\
+  -mod               diseño de modula \n\
+  -foreground, -fg  color del primer plano de modula\n\
+  -background, -bg  color del fondo de modula\n\n\
+  -gradient       textura de la pendiente\n\
+  -from             color inicial de la pendiente\n\
+  -to               color final de la pendiente\n\n\
+  -solid            color sólido\n\n\
+  -help                    mostrar este texto de ayuda y salir\n
+
diff --git a/nls/es_ES/common.m b/nls/es_ES/common.m
new file mode 100644
index 00000000..b42232b8
--- /dev/null
+++ b/nls/es_ES/common.m
@@ -0,0 +1,58 @@
+$set 15 #Common
+
+$ #Yes
+# Sí
+$ #No
+# No
+
+$ #DirectionTitle
+# Dirección
+$ #DirectionHoriz
+# Horizontal
+$ #DirectionVert
+# Vertical
+
+$ #AlwaysOnTop
+# Siempre encima/arriba
+
+$ #PlacementTitle
+# Ubicación 
+$ #PlacementTopLeft
+# Arriba a la izquierda
+$ #PlacementCenterLeft
+# Centro a la izquierda
+$ #PlacementBottomLeft
+# Abajo a la izquierda
+$ #PlacementTopCenter
+# Arriba al centro
+$ #PlacementBottomCenter
+# Abajo al centro
+$ #PlacementTopRight
+# Arriba a la derecha
+$ #PlacementCenterRight
+# Centro a la derecha
+$ #PlacementBottomRight
+# Abajo a la derecha
+$ #PlacementLeftTop
+# Left Top
+$ #PlacementLeftCenter
+# Left Center
+$ #PlacementLeftBottom
+# Left Bottom
+$ #PlacementRightTop
+# Right Top
+$ #PlacementRightCenter
+# Right Center
+$ #PlacementRightBottom
+# Right Bottom
+$ #PlacementTopRelative
+# Top Relative
+$ #PlacementBottomRelative
+# Bottom Relative
+$ #PlacementLeftRelative
+# Left Relative
+$ #PlacementRightRelative
+# Right Relative
+
+$ #AutoHide
+# Auto hide
diff --git a/nls/es_ES/main.m b/nls/es_ES/main.m
new file mode 100644
index 00000000..3b12caa3
--- /dev/null
+++ b/nls/es_ES/main.m
@@ -0,0 +1,21 @@
+$set 14 #main
+
+$ #RCRequiresArg
+# error: '-rc' requiere un argumento
+$ #DISPLAYRequiresArg
+# error: '-display' requiere un argumento
+$ #WarnDisplaySet
+# cuidado: no se puede establecer la variable de ambiente 'DISPLAY'
+$ #Usage
+# Fluxbox %s: (c) 2001 Henrik Kinnunen\n\n\
+  -display  conexión de despliegue.\n\
+  -rc       archivo alternativo de recuros.\n\
+  -version          mostrar la versión y cerrar.\n\
+  -help             mostrar este texto de ayuda y cerrar.\n\n
+$ #CompileOptions
+# Opciones durante la compilación:\n\
+  Información extra para depuración:               %s\n\
+  Entrelazado:                                     %s\n\
+  Forma:                                           %s\n\
+  Slit:                                            %s\n\
+  8bpp simulación ordenada de colores en imágenes: %s\n\n
diff --git a/nls/et_EE/BaseDisplay.m b/nls/et_EE/BaseDisplay.m
new file mode 100644
index 00000000..b27c26be
--- /dev/null
+++ b/nls/et_EE/BaseDisplay.m
@@ -0,0 +1,16 @@
+$set 1 #BaseDisplay
+
+$ #XError
+# %s:  X'i viga: %s(%d) opkood %d/%d\n  resurss 0x%lx\n
+$ #SignalCaught
+# %s: signaal %d püütud\n
+$ #ShuttingDown
+# lõpetame\n
+$ #Aborting
+# katkestame... mälupilt tehtud\n
+$ #XConnectFail
+# BaseDisplay::BaseDisplay: ühenduse saamine X serveriga ebaõnnestus.\n
+$ #CloseOnExecFail
+# BaseDisplay::BaseDisplay: ühenduse märgistamine 'close-on-exec' ebaõnnestus\n
+$ #BadWindowRemove
+# BaseDisplay::eventLoop(): eemaldame vigase akna tominigute reast\n
diff --git a/nls/et_EE/Basemenu.m b/nls/et_EE/Basemenu.m
new file mode 100644
index 00000000..3ecf9009
--- /dev/null
+++ b/nls/et_EE/Basemenu.m
@@ -0,0 +1,4 @@
+$set 2 #Basemenu
+
+$ #BlackboxMenu
+# Blackbox'i Menüü
diff --git a/nls/et_EE/Configmenu.m b/nls/et_EE/Configmenu.m
new file mode 100644
index 00000000..02857bc4
--- /dev/null
+++ b/nls/et_EE/Configmenu.m
@@ -0,0 +1,48 @@
+$set 3 #Configmenu
+
+$ #ConfigOptions
+# Konfiguratsioon
+$ #FocusModel
+# Fookusmood
+$ #WindowPlacement
+# Akende paigutamine
+$ #ImageDithering
+# Piltide teravustamine
+$ #OpaqueMove
+# Nähtav akende liigutamine
+$ #FullMax
+# Üle-ekraani suurendus
+$ #FocusNew
+# Fookus uutele akendele
+$ #FocusLast
+# Fokusseeri viimane aken
+$ #ClickToFocus
+# Klikka fookuse saamiseks
+$ #SloppyFocus
+# Kaasaskäiv fookus
+$ #AutoRaise
+# Akende esiletoomine
+$ #SmartRows
+# Arukas paigutus (read)
+$ #SmartCols
+# Arukas paigutus (tulbad)
+$ #Cascade
+# Kaskaadis
+$ #LeftRight
+# Vasakult paremale
+$ #RightLeft
+# Paremalt vasakule
+$ #TopBottom
+# Ülevalt alla
+$ #BottomTop
+# Alt ülesse
+$ #Tabs
+# Use Tabs
+$ #Icons
+# Use Icons
+$ #TabPlacement
+# Tab Placement
+$ #TabRotateVertical
+# Rotate Vertical Tabs
+$ #SemiSloppyFocus
+# Semi Sloppy Focus
diff --git a/nls/et_EE/Icon.m b/nls/et_EE/Icon.m
new file mode 100644
index 00000000..5f42f625
--- /dev/null
+++ b/nls/et_EE/Icon.m
@@ -0,0 +1,4 @@
+$set 4 #Icon
+
+$ #Icons
+# Ikoonid
diff --git a/nls/et_EE/Image.m b/nls/et_EE/Image.m
new file mode 100644
index 00000000..8700c4d9
--- /dev/null
+++ b/nls/et_EE/Image.m
@@ -0,0 +1,24 @@
+$set 5 #Image
+
+$ #ErrorCreatingSolidPixmap
+# BImage::render_solid: viga pixmapi loomisel\n
+$ #ErrorCreatingXImage
+# BImage::renderXImage: viga XImage loomisel\n
+$ #UnsupVisual
+# BImage::renderXImage: toeta visuaal\n
+$ #ErrorCreatingPixmap
+# BImage::renderPixmap: viga pixmapi loomisel\n
+$ #InvalidColormapSize
+# BImageControl::BImageControl: vale värvipaletti suurus %d (%d/%d/%d) - vähendame\n
+$ #ErrorAllocatingColormap
+# BImageControl::BImageControl: viga värvipaletti määramisel \n
+$ #ColorAllocFail
+# BImageControl::BImageControl: ei õnnestunud värvi määrata %d/%d/%d\n
+$ #PixmapRelease
+# BImageControl::~BImageControl: pixmap cache - vabastame %d pixmappi\n
+$ #PixmapCacheLarge
+# BImageControl::renderImage: cache on liiga suur, sundpuhastus\n
+$ #ColorParseError
+# BImageControl::getColor: viga värvi analüüsimisel: '%s'\n
+$ #ColorAllocError
+# BImageControl::getColor: viga värvi määramisel: '%s'\n
diff --git a/nls/et_EE/Makefile.am b/nls/et_EE/Makefile.am
new file mode 100644
index 00000000..6bd65a21
--- /dev/null
+++ b/nls/et_EE/Makefile.am
@@ -0,0 +1,29 @@
+# nls/et_EE/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST=$(MFILES)
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/et_EE"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/et_EE ; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/et_EE; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/et_EE/blackbox.cat; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/et_EE; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
diff --git a/nls/et_EE/Makefile.in b/nls/et_EE/Makefile.in
new file mode 100644
index 00000000..4048b6f1
--- /dev/null
+++ b/nls/et_EE/Makefile.in
@@ -0,0 +1,220 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# nls/et_EE/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+CXX = @CXX@
+DEBUG = @DEBUG@
+DLLTOOL = @DLLTOOL@
+GNOME = @GNOME@
+INTERLACE = @INTERLACE@
+KDE = @KDE@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+NEWWMSPEC = @NEWWMSPEC@
+NLS = @NLS@
+OBJDUMP = @OBJDUMP@
+ORDEREDPSEUDO = @ORDEREDPSEUDO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHAPE = @SHAPE@
+SLIT = @SLIT@
+TIMEDCACHE = @TIMEDCACHE@
+VERSION = @VERSION@
+gencat_cmd = @gencat_cmd@
+regex_cmd = @regex_cmd@
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST = $(MFILES)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps nls/et_EE/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = nls/et_EE
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-data-local
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-local
+uninstall: uninstall-am
+all-am: Makefile all-local
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+	-rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-local install-data-am install-data install-am install \
+uninstall-local uninstall-am uninstall all-local all-redirect all-am \
+all installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/et_EE"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/et_EE ; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/et_EE; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/et_EE/blackbox.cat; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/et_EE; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/nls/et_EE/Screen.m b/nls/et_EE/Screen.m
new file mode 100644
index 00000000..f8a15c81
--- /dev/null
+++ b/nls/et_EE/Screen.m
@@ -0,0 +1,53 @@
+$set 6 #Screen
+
+$ #AnotherWMRunning
+# BScreen::BScreen: viga X serveri küsitlemisel.\n  \
+teine akahaldur juba töötab displeil %s.\n
+$ #ManagingScreen
+# BScreen::BScreen: haldame displeid %d reolutsioonis 0x%lx, vörvisügavusel %d\n
+$ #FontLoadFail
+# BScreen::LoadStyle(): ei saanud laadida fonti '%s'\n
+$ #DefaultFontLoadFail
+# BScreen::LoadStyle(): ei saanud laadida vaikimisi määratud fonti.\n
+$ #EmptyMenuFile
+# %s: tühi menüüfail\n
+$ #xterm
+# xterm
+$ #Restart
+# Restart
+$ #Exit
+# Välju
+$ #EXECError
+# BScreen::parseMenuFile: [exec] viga, menüü pealkirja ja/või käsku pole määratud\n
+$ #EXITError
+# BScreen::parseMenuFile: [exit] viga, menüü pealkirja pole määratud\n
+$ #STYLEError
+# BScreen::parseMenuFile: [style] viga, menüü pealkirja ja/või failinime \
+pole määratud\n
+$ #CONFIGError
+# BScreen::parseMenuFile: [config] viga, menüü pealkirja pole määratud\n
+$ #INCLUDEError
+# BScreen::parseMenuFile: [include] viga, failinime pole määratud\n
+$ #INCLUDEErrorReg
+# BScreen::parseMenuFile: [include] viga, '%s' ei ole tavaline fail\n
+$ #SUBMENUError
+# BScreen::parseMenuFile: [submenu] viga, menüü pealkirja pole määratud\n
+$ #RESTARTError
+# BScreen::parseMenuFile: [restart] viga, menüü pealkirja pole määratud\n
+$ #RECONFIGError
+# BScreen::parseMenuFile: [reconfig] viga, menüü pealkirja pole määratud\n
+$ #STYLESDIRError
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] viga, kataloogi pole määratud\n
+$ #STYLESDIRErrorNotDir
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] viga, '%s' pole kataloog\n
+$ #STYLESDIRErrorNoExist
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] viga, '%s' pole olemas\n
+$ #WORKSPACESError
+# BScreen::parseMenuFile: [workspaces] viga, menüü pealkirja pole määratud\n
+$ #PositionLength
+# 0: 0000 x 0: 0000
+$ #PositionFormat
+# X: %4d x Y: %4d
+$ #GeometryFormat
+# W: %4d x H: %4d
+
diff --git a/nls/et_EE/Slit.m b/nls/et_EE/Slit.m
new file mode 100644
index 00000000..798b4490
--- /dev/null
+++ b/nls/et_EE/Slit.m
@@ -0,0 +1,8 @@
+$set 7 #Slit
+
+$ #SlitTitle
+# Pragu
+$ #SlitDirection
+# Prao suund
+$ #SlitPlacement
+# Prao asukoht
diff --git a/nls/et_EE/Toolbar.m b/nls/et_EE/Toolbar.m
new file mode 100644
index 00000000..e1879f97
--- /dev/null
+++ b/nls/et_EE/Toolbar.m
@@ -0,0 +1,22 @@
+$set 8 #Toolbar
+
+$ #NoStrftimeLength
+# 00:00000
+$ #NoStrftimeDateFormat
+# %02d/%02d/%02d
+$ #NoStrftimeDateFormatEu
+# %02d.%02d.%02d
+$ #NoStrftimeTimeFormat24
+#  %02d:%02d 
+$ #NoStrftimeTimeFormat12
+# %02d:%02d %sm
+$ #NoStrftimeTimeFormatP
+# p
+$ #NoStrftimeTimeFormatA
+# a
+$ #ToolbarTitle
+# Tegumiriba
+$ #EditWkspcName
+# Muuda töölaua nime
+$ #ToolbarPlacement
+# Tegumiriba asukoht
diff --git a/nls/et_EE/Window.m b/nls/et_EE/Window.m
new file mode 100644
index 00000000..5c9f75bd
--- /dev/null
+++ b/nls/et_EE/Window.m
@@ -0,0 +1,17 @@
+$set 9 #Window
+
+
+$ #Creating
+# BlackboxWindow::BlackboxWindow: loome 0x%lx\n
+$ #XGetWindowAttributesFail
+# BlackboxWindow::BlackboxWindow: XGetWindowAttributres ebaõnnestus\n
+$ #CannotFindScreen
+# BlackboxWindow::BlackboxWindow: ei leidnud displeid juuraknale 0x%lx\n
+$ #Unnamed
+# Nimeta
+$ #MapRequest
+# BlackboxWindow::mapRequestEvent() 0x%lx'le\n
+$ #UnmapNotify
+# BlackboxWindow::unmapNotifyEvent() 0x%lx'le\n
+$ #UnmapNotifyReparent
+# BlackboxWindow::unmapnotifyEvent: 0x%lx juurele\n
diff --git a/nls/et_EE/Windowmenu.m b/nls/et_EE/Windowmenu.m
new file mode 100644
index 00000000..863a9453
--- /dev/null
+++ b/nls/et_EE/Windowmenu.m
@@ -0,0 +1,20 @@
+$set 10 #Windowmenu
+
+$ #SendTo
+# Saada...
+$ #Shade
+# Varjuta
+$ #Iconify
+# Ikoniseeri
+$ #Maximize
+# Suurenda
+$ #Raise
+# Esiplaanile
+$ #Lower
+# Tahaplaanile
+$ #Stick
+# Kleebi
+$ #KillClient
+# Killi klient
+$ #Close
+# Sulge
diff --git a/nls/et_EE/Workspace.m b/nls/et_EE/Workspace.m
new file mode 100644
index 00000000..c12bfb23
--- /dev/null
+++ b/nls/et_EE/Workspace.m
@@ -0,0 +1,4 @@
+$set 11 #Workspace
+
+$ #DefaultNameFormat
+# Töölaud %d
diff --git a/nls/et_EE/Workspacemenu.m b/nls/et_EE/Workspacemenu.m
new file mode 100644
index 00000000..62747192
--- /dev/null
+++ b/nls/et_EE/Workspacemenu.m
@@ -0,0 +1,8 @@
+$set 12 #Workspacemenu
+
+$ #WorkspacesTitle
+# Töölauad
+$ #NewWorkspace
+# Uus töölaud
+$ #RemoveLast
+# Eemalda viimane
diff --git a/nls/et_EE/blackbox.m b/nls/et_EE/blackbox.m
new file mode 100644
index 00000000..3fbf74cc
--- /dev/null
+++ b/nls/et_EE/blackbox.m
@@ -0,0 +1,6 @@
+$set 13 #blackbox
+
+$ #NoManagableScreens
+# Blackbox::Blackbox: ei leidnud hallatavaid displeisid, katkestame\n
+$ #MapRequest
+# Blackbox::process_event: MapRequest 0x%lx'le\n
diff --git a/nls/et_EE/bsetroot.m b/nls/et_EE/bsetroot.m
new file mode 100644
index 00000000..110176c8
--- /dev/null
+++ b/nls/et_EE/bsetroot.m
@@ -0,0 +1,16 @@
+$set 16 #bsetroot
+
+$ #MustSpecify
+# %s: viga: pead määratlema ühe järgnevaist: -solid, -mod, -gradient\n
+$ #Usage
+# %s 2.0: (c) 1997-2000 Brad Hughes\n\n\
+  -display         displei ühendus\n\
+  -mod               moodula tapeet\n\
+  -foreground, -fg  esiplaani värvi moodula\n\
+  -background, -bg  tausta värvi moodula\n\n\
+  -gradient       gradientne tekstuur\n\
+  -from             gradiendi algusvärv\n\
+  -to               gradiendi lõpuvärv\n\n\
+  -solid            ühtne värv\n\n\
+  -help                    näida seda abiteksti ja välju\n
+
diff --git a/nls/et_EE/common.m b/nls/et_EE/common.m
new file mode 100644
index 00000000..eaf02186
--- /dev/null
+++ b/nls/et_EE/common.m
@@ -0,0 +1,58 @@
+$set 15 #Common
+
+$ #Yes
+# Jah
+$ #No
+# Ei
+
+$ #DirectionTitle
+# Suund
+$ #DirectionHoriz
+# Horisontaalne
+$ #DirectionVert
+# Vertikaalne
+
+$ #AlwaysOnTop
+# Alati esiplaanil
+
+$ #PlacementTitle
+# Asetus
+$ #PlacementTopLeft
+# Üleval vasakul
+$ #PlacementCenterLeft
+# Keskel vasakul
+$ #PlacementBottomLeft
+# All vasakul
+$ #PlacementTopCenter
+# Üleval keskel
+$ #PlacementBottomCenter
+# All keskel
+$ #PlacementTopRight
+# Üleval paremal
+$ #PlacementCenterRight
+# Keskel paremal
+$ #PlacementBottomRight
+# All paremal
+$ #PlacementLeftTop
+# Left Top
+$ #PlacementLeftCenter
+# Left Center
+$ #PlacementLeftBottom
+# Left Bottom
+$ #PlacementRightTop
+# Right Top
+$ #Placement
+# Right Center
+$ #Placement
+# Right Bottom
+$ #PlacementTopRelative
+# Top Relative
+$ #PlacementBottomRelative
+# Bottom Relative
+$ #PlacementLeftRelative
+# Left Relative
+$ #PlacementRightRelative
+# Right Relative
+
+$ #AutoHide
+# Auto hide
diff --git a/nls/et_EE/main.m b/nls/et_EE/main.m
new file mode 100644
index 00000000..4dc7648e
--- /dev/null
+++ b/nls/et_EE/main.m
@@ -0,0 +1,21 @@
+$set 14 #main
+
+$ #RCRequiresArg
+# viga: '-rc' vajab argumenti\n
+$ #DISPLAYRequiresArg
+# viga: '-display' vajab argumenti\n
+$ #WarnDisplaySet
+# hoiatus: ei saanud määrata keskonna muutujat 'DISPLAY'\n
+$ #Usage
+# Fluxbox %s: (c) 2001 Henrik Kinnunen\n\n\
+  -display \t\tkasuta displei ühendust.\n\
+  -rc \t\t\tkasuta alternatiivseid resursse.\n\
+  -version\t\t\tnäita versiooninumber ja välju.\n\
+  -help\t\t\t\tnäita seda abiteksti ja välju.\n\n
+$ #CompileOptions
+# Kompileerimisoptsioonid:\n\
+  Debuggimine\t\t\t%s\n\
+  Põimimine:\t\t\t%s\n\
+  Kuju:\t\t\t%s\n\
+  Pragu:\t\t\t\t%s\n\
+  8bpp määratud teravustamine:\t%s\n\n
diff --git a/nls/fr_FR/BaseDisplay.m b/nls/fr_FR/BaseDisplay.m
new file mode 100644
index 00000000..a3bf54f3
--- /dev/null
+++ b/nls/fr_FR/BaseDisplay.m
@@ -0,0 +1,16 @@
+$set 1 #BaseDisplay
+
+$ #XError
+# %s:  Erreur de X %s(%d) opcodes %d/%d\n  ressource 0x%lx\n
+$ #SignalCaught
+# %s: signal %d capturé\n
+$ #ShuttingDown
+# arrêt du programme\n
+$ #Aborting
+# annulation... ponte du fichier core\n
+$ #XConnectFail
+# BaseDisplay::BaseDisplay: échec de la connexion à X\n
+$ #CloseOnExecFail
+# BaseDisplay::BaseDisplay: impossible d'attribuer close-on-exec à l'affichage\n
+$ #BadWindowRemove
+# BaseDisplay::eventLoop(): suppression d'une mauvaise fenêtre de la queue\n
diff --git a/nls/fr_FR/Basemenu.m b/nls/fr_FR/Basemenu.m
new file mode 100644
index 00000000..16bc86ab
--- /dev/null
+++ b/nls/fr_FR/Basemenu.m
@@ -0,0 +1,4 @@
+$set 2 #Basemenu
+
+$ #BlackboxMenu
+# Menu de Blackbox
diff --git a/nls/fr_FR/Configmenu.m b/nls/fr_FR/Configmenu.m
new file mode 100644
index 00000000..b9ee923a
--- /dev/null
+++ b/nls/fr_FR/Configmenu.m
@@ -0,0 +1,48 @@
+$set 3 #Configmenu
+
+$ #ConfigOptions
+# Options de configuration
+$ #FocusModel
+# Mode de convergence
+$ #WindowPlacement
+# Disposition des fenêtres
+$ #ImageDithering
+# Lissage d'images
+$ #OpaqueMove
+# Déplacement opaque des fenêtres
+$ #FullMax
+# Maximization complète
+$ #FocusNew
+# Convergence de la nouvelle fenêtre
+$ #FocusLast
+# Convergence de la dernière fenêtre
+$ #ClickToFocus
+# Cliquer pour converger
+$ #SloppyFocus
+# Convergence souple
+$ #AutoRaise
+# Premier plan automatique
+$ #SmartRows
+# Disposition futée (Lignes)
+$ #SmartCols
+# Disposition futée (Colonnes)
+$ #Cascade
+# Disposition en cascade
+$ #LeftRight
+# De gauche à droite
+$ #RightLeft
+# De droite à gauche
+$ #TopBottom
+# De haut en bas
+$ #BottomTop
+# De bas en haut
+$ #Tabs
+# Use Tabs
+$ #Icons
+# Use Icons
+$ #TabPlacement
+# Tab Placement
+$ #TabRotateVertical
+# Rotate Vertical Tabs
+$ #SemiSloppyFocus
+# Semi Sloppy Focus
diff --git a/nls/fr_FR/Icon.m b/nls/fr_FR/Icon.m
new file mode 100644
index 00000000..2e350970
--- /dev/null
+++ b/nls/fr_FR/Icon.m
@@ -0,0 +1,4 @@
+$set 4 #Icon
+
+$ #Icons
+# Icones
diff --git a/nls/fr_FR/Image.m b/nls/fr_FR/Image.m
new file mode 100644
index 00000000..d8642e70
--- /dev/null
+++ b/nls/fr_FR/Image.m
@@ -0,0 +1,24 @@
+$set 5 #Image
+
+$ #ErrorCreatingSolidPixmap
+# BImage::render_solid: Erreur de création de pixmap\n
+$ #ErrorCreatingXImage
+# BImage::renderXImage: Erreur de création de XImage\n
+$ #UnsupVisual
+# BImage::renderXImage: Image non endossée\n
+$ #ErrorCreatingPixmap
+# BImage::renderPixmap: Erreur de création de pixmap\n
+$ #InvalidColormapSize
+# BImageControl::BImageControl: Taille des couleurs parentes invalide%d (%d/%d/%d) - coupe\n
+$ #ErrorAllocatingColormap
+# BImageControl::BImageControl: Erreur d'allocation des couleurs parentes\n
+$ #ColorAllocFail
+# BImageControl::BImageControl: Echec d'allocation de couleur %d/%d/%d\n
+$ #PixmapRelease
+# BImageControl::~BImageControl: Cache pixmap - abandon %d pixmaps\n
+$ #PixmapCacheLarge
+# BImageControl::renderImage: Cache important, nettoyage conséquent\n
+$ #ColorParseError
+# BImageControl::getColor: Erreur de lecture de couleur: '%s'\n
+$ #ColorAllocError
+# BImageControl::getColor: Erreur d'allocation,couleur: '%s'\n
diff --git a/nls/fr_FR/Makefile.am b/nls/fr_FR/Makefile.am
new file mode 100644
index 00000000..91c9f01d
--- /dev/null
+++ b/nls/fr_FR/Makefile.am
@@ -0,0 +1,33 @@
+# nls/fr_FR/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST=$(MFILES)
+
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/fr_FR"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/fr_FR; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/fr_FR; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/fr; \
+		ln -fs fr_FR $(DESTDIR)$(pkgdatadir)/nls/fr; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/fr_FR/blackbox.cat; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/fr; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/fr_FR; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
diff --git a/nls/fr_FR/Makefile.in b/nls/fr_FR/Makefile.in
new file mode 100644
index 00000000..77c81819
--- /dev/null
+++ b/nls/fr_FR/Makefile.in
@@ -0,0 +1,224 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# nls/fr_FR/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+CXX = @CXX@
+DEBUG = @DEBUG@
+DLLTOOL = @DLLTOOL@
+GNOME = @GNOME@
+INTERLACE = @INTERLACE@
+KDE = @KDE@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+NEWWMSPEC = @NEWWMSPEC@
+NLS = @NLS@
+OBJDUMP = @OBJDUMP@
+ORDEREDPSEUDO = @ORDEREDPSEUDO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHAPE = @SHAPE@
+SLIT = @SLIT@
+TIMEDCACHE = @TIMEDCACHE@
+VERSION = @VERSION@
+gencat_cmd = @gencat_cmd@
+regex_cmd = @regex_cmd@
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST = $(MFILES)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps nls/fr_FR/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = nls/fr_FR
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-data-local
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-local
+uninstall: uninstall-am
+all-am: Makefile all-local
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+	-rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-local install-data-am install-data install-am install \
+uninstall-local uninstall-am uninstall all-local all-redirect all-am \
+all installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/fr_FR"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/fr_FR; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/fr_FR; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/fr; \
+		ln -fs fr_FR $(DESTDIR)$(pkgdatadir)/nls/fr; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/fr_FR/blackbox.cat; \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/fr; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/fr_FR; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/nls/fr_FR/Screen.m b/nls/fr_FR/Screen.m
new file mode 100644
index 00000000..40296a8a
--- /dev/null
+++ b/nls/fr_FR/Screen.m
@@ -0,0 +1,54 @@
+$set 6 #Screen
+
+$ #AnotherWMRunning
+# BScreen::BScreen: Occurence d'une erreur pendant une requête vers X.\n  \
+Un autre gestionnaire de fenêtres est déjà lancé %s.\n
+$ #ManagingScreen
+# BScreen::BScreen: Gestion de l'écran %d avec le visuel 0x%lx, profondeur %d\n
+$ #FontLoadFail
+# BScreen::LoadStyle(): Impossible de charger la police de caractère '%s'\n
+$ #DefaultFontLoadFail
+# BScreen::LoadStyle(): Impossible de charger la police de caractère initiale.\n
+$ #EmptyMenuFile
+# %s: Fichier de menu vide\n
+$ #xterm
+# xterm
+$ #Restart
+# Redémarrer
+$ #Exit
+# Sortie
+$ #EXECError
+# BScreen::parseMenuFile: [exec] Erreur, pas d'indication de menu &/ou de commande definie\n
+$ #EXITError
+# BScreen::parseMenuFile: [exit] Erreur, aucune indication de menu définie\n
+$ #STYLEError
+# BScreen::parseMenuFile: [style] Erreur, pas d'indication de menu &/ou de nom de fichier\
+defini\n
+$ #CONFIGError
+# BScreen::parseMenuFile: [config] Erreur, aucune indication de menu définie\n
+$ #INCLUDEError
+# BScreen::parseMenuFile: [include] Erreur, aucun nom de fichier défini\n
+$ #INCLUDEErrorReg
+# BScreen::parseMenuFile: [include] Erreur, '%s' est un fichier invalide\n
+$ #SUBMENUError
+# BScreen::parseMenuFile: [submenu] Erreur, aucune indication de menu définie\n
+$ #RESTARTError
+# BScreen::parseMenuFile: [restart] Erreur, aucune indication de menu définie\n
+$ #RECONFIGError
+# BScreen::parseMenuFile: [reconfig] Erreur, aucune indication de menu définie\n
+$ #STYLESDIRError
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] Erreur, aucun répertoire défini\n
+$ #STYLESDIRErrorNotDir
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] Erreur, '%s' est un répertoire \
+invalide\n
+$ #STYLESDIRErrorNoExist
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] Erreur, '%s' est inexistant\n
+$ #WORKSPACESError
+# BScreen::parseMenuFile: [workspaces] Erreur, aucune indication de menu définie\n
+$ #PositionLength
+# 0: 0000 x 0: 0000
+$ #PositionFormat
+# X: %4d x Y: %4d
+$ #GeometryFormat
+# L: %4d x H: %4d
+
diff --git a/nls/fr_FR/Slit.m b/nls/fr_FR/Slit.m
new file mode 100644
index 00000000..95f05957
--- /dev/null
+++ b/nls/fr_FR/Slit.m
@@ -0,0 +1,8 @@
+$set 7 #Slit
+
+$ #SlitTitle
+# Slit
+$ #SlitDirection
+# Orientation du Slit
+$ #SlitPlacement
+# Disposition du Slit
diff --git a/nls/fr_FR/Toolbar.m b/nls/fr_FR/Toolbar.m
new file mode 100644
index 00000000..8d9808fb
--- /dev/null
+++ b/nls/fr_FR/Toolbar.m
@@ -0,0 +1,22 @@
+$set 8 #Toolbar
+
+$ #NoStrftimeLength
+# 00:00000
+$ #NoStrftimeDateFormat
+# %02d/%02d/%02d
+$ #NoStrftimeDateFormatEu
+# %02d.%02d.%02d
+$ #NoStrftimeTimeFormat24
+#  %02d:%02d 
+$ #NoStrftimeTimeFormat12
+# %02d:%02d %sm
+$ #NoStrftimeTimeFormatP
+# p
+$ #NoStrftimeTimeFormatA
+# a
+$ #ToolbarTitle
+# Barre d'outils
+$ #EditWkspcName
+# Bâptème du bureau courant
+$ #ToolbarPlacement
+# Disposition de la barre d'outils
diff --git a/nls/fr_FR/Window.m b/nls/fr_FR/Window.m
new file mode 100644
index 00000000..65a43bfb
--- /dev/null
+++ b/nls/fr_FR/Window.m
@@ -0,0 +1,17 @@
+$set 9 #Window
+
+
+$ #Creating
+# BlackboxWindow::BlackboxWindow: Génération 0x%lx\n
+$ #XGetWindowAttributesFail
+# BlackboxWindow::BlackboxWindow: Echec de XGetWindowAttributres\n
+$ #CannotFindScreen
+# BlackboxWindow::BlackboxWindow: Impossible de trouver l'écran de la fenêtre racine0x%lx\n
+$ #Unnamed
+# Inconnu
+$ #MapRequest
+# BlackboxWindow::mapRequestEvent() pour 0x%lx\n
+$ #UnmapNotify
+# BlackboxWindow::unmapNotifyEvent() pour 0x%lx\n
+$ #UnmapNotifyReparent
+# BlackboxWindow::unmapnotifyEvent: réattribue 0x%lx à la fenêtre principale\n
diff --git a/nls/fr_FR/Windowmenu.m b/nls/fr_FR/Windowmenu.m
new file mode 100644
index 00000000..c7696965
--- /dev/null
+++ b/nls/fr_FR/Windowmenu.m
@@ -0,0 +1,20 @@
+$set 10 #Windowmenu
+
+$ #SendTo
+# Redirige vers...
+$ #Shade
+# Ombrage
+$ #Iconify
+# Iconifie
+$ #Maximize
+# Maximize
+$ #Raise
+# Résurrection
+$ #Lower
+# Réduit
+$ #Stick
+# Epingle
+$ #KillClient
+# Massacre
+$ #Close
+# Ferme
diff --git a/nls/fr_FR/Workspace.m b/nls/fr_FR/Workspace.m
new file mode 100644
index 00000000..505e670c
--- /dev/null
+++ b/nls/fr_FR/Workspace.m
@@ -0,0 +1,4 @@
+$set 11 #Workspace
+
+$ #DefaultNameFormat
+# Bureau %d
diff --git a/nls/fr_FR/Workspacemenu.m b/nls/fr_FR/Workspacemenu.m
new file mode 100644
index 00000000..48293941
--- /dev/null
+++ b/nls/fr_FR/Workspacemenu.m
@@ -0,0 +1,8 @@
+$set 12 #Workspacemenu
+
+$ #WorkspacesTitle
+# Bureaux
+$ #NewWorkspace
+# Nouveau bureau
+$ #RemoveLast
+# Supprimer le dernier
diff --git a/nls/fr_FR/blackbox.m b/nls/fr_FR/blackbox.m
new file mode 100644
index 00000000..4da9e7a3
--- /dev/null
+++ b/nls/fr_FR/blackbox.m
@@ -0,0 +1,6 @@
+$set 13 #blackbox
+
+$ #NoManagableScreens
+# Blackbox::Blackbox: Aucun écran exploitable n'a été trouvé, annulation\n
+$ #MapRequest
+# Blackbox::process_event: MapRequest pour 0x%lx\n
diff --git a/nls/fr_FR/bsetroot.m b/nls/fr_FR/bsetroot.m
new file mode 100644
index 00000000..4d34a543
--- /dev/null
+++ b/nls/fr_FR/bsetroot.m
@@ -0,0 +1,16 @@
+$set 16 #bsetroot
+
+$ #MustSpecify
+# %s: Erreur: il faut préciser: -solid, -mod, -gradient\n
+$ #Usage
+# %s 2.0: (c) 1997-2000 Brad Hughes\n\n\
+  -display         	connexion à l'écran\n\
+  -mod               	schéma\n\
+  -foreground, -fg  	couleur au premier plan\n\
+  -background, -bg  	couleur au second plan\n\n\
+  -gradient       	texture du dégradé\n\
+  -from             	couleur de départ du dégradé\n\
+  -to               	couleur d'arrivé du dégradé\n\n\
+  -solid            	couleur pleine\n\n\
+  -help                    	affiche ce texte d'aide et quitte\n
+
diff --git a/nls/fr_FR/common.m b/nls/fr_FR/common.m
new file mode 100644
index 00000000..d98ea249
--- /dev/null
+++ b/nls/fr_FR/common.m
@@ -0,0 +1,58 @@
+$set 15 #Common
+
+$ #Yes
+# Oui
+$ #No
+# Non
+
+$ #DirectionTitle
+# Orientation
+$ #DirectionHoriz
+# Horizontal
+$ #DirectionVert
+# Vertical
+
+$ #AlwaysOnTop
+# Toujours au-dessus
+
+$ #PlacementTitle
+# Disposition
+$ #PlacementTopLeft
+# En haut à gauche
+$ #PlacementCenterLeft
+# Au centre à gauche
+$ #PlacementBottomLeft
+# En bas à gauche
+$ #PlacementTopCenter
+# En haut au centre
+$ #PlacementBottomCenter
+# En bas au centre
+$ #PlacementTopRight
+# En haut à droite
+$ #PlacementCenterRight
+# Au centre à droite
+$ #PlacementBottomRight
+# En bas à droite
+$ #PlacementLeftTop
+# Left Top
+$ #PlacementLeftCenter
+# Left Center
+$ #PlacementLeftBottom
+# Left Bottom
+$ #PlacementRightTop
+# Right Top
+$ #PlacementRightCenter
+# Right Center
+$ #PlacementRightBottom
+# Right Bottom
+$ #PlacementTopRelative
+# Top Relative
+$ #PlacementBottomRelative
+# Bottom Relative
+$ #PlacementLeftRelative
+# Left Relative
+$ #PlacementRightRelative
+# Right Relative
+
+$ #AutoHide
+# Auto hide
diff --git a/nls/fr_FR/main.m b/nls/fr_FR/main.m
new file mode 100644
index 00000000..8844f636
--- /dev/null
+++ b/nls/fr_FR/main.m
@@ -0,0 +1,21 @@
+$set 14 #main
+
+$ #RCRequiresArg
+# Erreur: '-rc' nécessite un argument\n
+$ #DISPLAYRequiresArg
+# Erreur: '-display' nécessite un argument\n
+$ #WarnDisplaySet
+# Attention: impossible d'attribuer la variable d'environnement 'DISPLAY'\n
+$ #Usage
+# Fluxbox %s: (c) 2001 Henrik Kinnunen\n\n\
+  -display \t\tutilise la connexion à l'affichage.\n\
+  -rc \t\t\tutilise un autre fichier de configuration.\n\
+  -version\t\t\taffiche la version et quitte.\n\
+  -help\t\t\t\taffiche ce texte d'aide et quitte.\n\n
+$ #CompileOptions
+# Options de compilation:\n\
+  Debugging\t\t\t%s\n\
+  Interlacing:\t\t\t%s\n\
+  Shape:\t\t\t%s\n\
+  Slit:\t\t\t\t%s\n\
+  8bpp Ordered Dithering:\t%s\n\n
diff --git a/nls/it_IT/BaseDisplay.m b/nls/it_IT/BaseDisplay.m
new file mode 100644
index 00000000..806f3b35
--- /dev/null
+++ b/nls/it_IT/BaseDisplay.m
@@ -0,0 +1,16 @@
+$set 1 #BaseDisplay
+
+$ #XError
+# %s:  Errore di X: %s(%d) opcodes %d/%d\n  resource 0x%lx\n
+$ #SignalCaught
+# %s: intercettato segnale %d\n
+$ #ShuttingDown
+# sto uscendo\n
+$ #Aborting
+# abortito... sto generando un core dump\n
+$ #XConnectFail
+# BaseDisplay::BaseDisplay: Connessione al server X sbagliata\n
+$ #CloseOnExecFail
+# BaseDisplay::BaseDisplay: non posso marcare la connesione al display come close-on-exec\n
+$ #BadWindowRemove
+# BaseDisplay::eventLoop(): sto rimuovendo la finestra sbagliata dalla coda degli eventi\n
diff --git a/nls/it_IT/Basemenu.m b/nls/it_IT/Basemenu.m
new file mode 100644
index 00000000..46409c70
--- /dev/null
+++ b/nls/it_IT/Basemenu.m
@@ -0,0 +1,4 @@
+$set 2 #Basemenu
+
+$ #BlackboxMenu
+# Fluxbox Menu
diff --git a/nls/it_IT/Configmenu.m b/nls/it_IT/Configmenu.m
new file mode 100644
index 00000000..6c4d03cf
--- /dev/null
+++ b/nls/it_IT/Configmenu.m
@@ -0,0 +1,48 @@
+$set 3 #Configmenu
+
+$ #ConfigOptions
+# Configurazione
+$ #FocusModel
+# Tipo Di Focus
+$ #WindowPlacement
+# Posizionamento delle finestre
+$ #ImageDithering
+# Dithering Delle Immagini
+$ #OpaqueMove
+# Movimento Delle Finestre Opaco
+$ #FullMax
+# Massimizzazione Completa
+$ #FocusNew
+# Dai Il Focus Alle Nuove Finestre
+$ #FocusLast
+# Dai Il Focus Alla Finestra Al Cambio di Workspace
+$ #ClickToFocus
+# Clicca Per Il Focus
+$ #SloppyFocus
+# Sloppy Focus
+$ #AutoRaise
+# Auto Raise
+$ #SmartRows
+# Posizionamento Intelligente (Righe)
+$ #SmartCols
+# Posizionamento Intelligente (Colonne)
+$ #Cascade
+# Posizionamento A Cascata
+$ #LeftRight
+# Da Sinistra A Destra
+$ #RightLeft
+# Da Destra A Sinistra
+$ #TopBottom
+# Da Sopra A Sotto
+$ #BottomTop
+# Da Sotto A Sopra
+$ #Tabs
+# Usa I Tabs
+$ #Icons
+# Usa Le Icone
+$ #TabPlacement
+# Posizionamento Del Tab
+$ #TabRotateVertical
+# Routa Verticalmente I Tab
+$ #SemiSloppyFocus
+# Semi Sloppy Focus
diff --git a/nls/it_IT/Icon.m b/nls/it_IT/Icon.m
new file mode 100644
index 00000000..b5af81c5
--- /dev/null
+++ b/nls/it_IT/Icon.m
@@ -0,0 +1,4 @@
+$set 4 #Icon
+
+$ #Icons
+# Icone
diff --git a/nls/it_IT/Image.m b/nls/it_IT/Image.m
new file mode 100644
index 00000000..a7928948
--- /dev/null
+++ b/nls/it_IT/Image.m
@@ -0,0 +1,24 @@
+$set 5 #Image
+
+$ #ErrorCreatingSolidPixmap
+# BImage::render_solid: errore creando la pixmap\n
+$ #ErrorCreatingXImage
+# BImage::renderXImage: errore creando XImage\n
+$ #UnsupVisual
+# BImage::renderXImage: visuale non supportata\n
+$ #ErrorCreatingPixmap
+# BImage::renderPixmap: errore creando la pixmap\n
+$ #InvalidColormapSize
+# BImageControl::BImageControl: colormap non valida dimensione %d (%d/%d/%d) - riducendo\n
+$ #ErrorAllocatingColormap
+# BImageControl::BImageControl: error allocando la colormap\n
+$ #ColorAllocFail
+# BImageControl::BImageControl: Fallimento nell'allocare il colore %d/%d/%d\n
+$ #PixmapRelease
+# BImageControl::~BImageControl: pixmap cache - rilasciando %d pixmaps\n
+$ #PixmapCacheLarge
+# BImageControl::renderImage: cache e' grande, forzando pulizia\n
+$ #ColorParseError
+# BImageControl::getColor: errore nel parsing del colore: '%s'\n
+$ #ColorAllocError
+# BImageControl::getColor: errore nella allocazione del colore: '%s'\n
diff --git a/nls/it_IT/Makefile.am b/nls/it_IT/Makefile.am
new file mode 100644
index 00000000..d4df3909
--- /dev/null
+++ b/nls/it_IT/Makefile.am
@@ -0,0 +1,30 @@
+# nls/it_IT/Makefile.am for Fluxbox - an X11 Window Manager
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST= $(MFILES)
+
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/it_IT"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/da_DK; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/it_IT; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/it_IT/blackbox.cat; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/it_IT; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
diff --git a/nls/it_IT/Makefile.in b/nls/it_IT/Makefile.in
new file mode 100644
index 00000000..f2a380ff
--- /dev/null
+++ b/nls/it_IT/Makefile.in
@@ -0,0 +1,221 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# nls/it_IT/Makefile.am for Fluxbox - an X11 Window Manager
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+CXX = @CXX@
+DEBUG = @DEBUG@
+DLLTOOL = @DLLTOOL@
+GNOME = @GNOME@
+INTERLACE = @INTERLACE@
+KDE = @KDE@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+NEWWMSPEC = @NEWWMSPEC@
+NLS = @NLS@
+OBJDUMP = @OBJDUMP@
+ORDEREDPSEUDO = @ORDEREDPSEUDO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHAPE = @SHAPE@
+SLIT = @SLIT@
+TIMEDCACHE = @TIMEDCACHE@
+VERSION = @VERSION@
+gencat_cmd = @gencat_cmd@
+regex_cmd = @regex_cmd@
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST = $(MFILES)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps nls/it_IT/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = nls/it_IT
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-data-local
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-local
+uninstall: uninstall-am
+all-am: Makefile all-local
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+	-rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-local install-data-am install-data install-am install \
+uninstall-local uninstall-am uninstall all-local all-redirect all-am \
+all installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/it_IT"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/da_DK; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/it_IT; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/it_IT/blackbox.cat; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/it_IT; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/nls/it_IT/Screen.m b/nls/it_IT/Screen.m
new file mode 100644
index 00000000..6bb804ab
--- /dev/null
+++ b/nls/it_IT/Screen.m
@@ -0,0 +1,54 @@
+$set 6 #Screen
+
+$ #AnotherWMRunning
+# BScreen::BScreen: e' accaduto un errore nella interrogazione del server X.\n  \
+un altro window manager e' gia' attivo per il display %s.\n
+$ #ManagingScreen
+# BScreen::BScreen: usando schermo %d usando visuale 0x%lx, profondita' %d\n
+$ #FontLoadFail
+# BScreen::LoadStyle(): non posso caricare il font '%s'\n
+$ #DefaultFontLoadFail
+# BScreen::LoadStyle(): non posso caricare il font predefinito.\n
+$ #EmptyMenuFile
+# %s: file del menu vuoto\n
+$ #xterm
+# xterm
+$ #Restart
+# Restart
+$ #Exit
+# Exit
+$ #EXECError
+# BScreen::parseMenuFile: [exec] errore, etichetta/comando di menu' non specificato\n
+$ #EXITError
+# BScreen::parseMenuFile: [exit] errore, nessuna etichetta di menu' definita\n
+$ #STYLEError
+# BScreen::parseMenuFile: [style] errore, nessuna etichetta di menu' e/o nome di file \
+specificato\n
+$ #CONFIGError
+# BScreen::parseMenuFile: [config] error, nessuna etichetta di menu' specificata\n
+$ #INCLUDEError
+# BScreen::parseMenuFile: [include] error, nessun nome di file specificato\n
+$ #INCLUDEErrorReg
+# BScreen::parseMenuFile: [include] error, '%s' non e' un file regolare\n
+$ #SUBMENUError
+# BScreen::parseMenuFile: [submenu] error, nessuna etichetta di menu' specificata\n 
+$ #RESTARTError
+# BScreen::parseMenuFile: [restart] error, nessuna etichetta di menu' specificata\n
+$ #RECONFIGError
+# BScreen::parseMenuFile: [reconfig] error, nessuna etichetta di menu' specificata\n
+$ #STYLESDIRError
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] error, nessuna directory specificata\n
+$ #STYLESDIRErrorNotDir
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] error, '%s' non e' una \
+directory\n
+$ #STYLESDIRErrorNoExist
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] error, '%s' non esiste\n
+$ #WORKSPACESError
+# BScreen::parseMenuFile: [workspaces] error, nessuna etichetta di menu' specificata\n
+$ #PositionLength
+# 0: 0000 x 0: 0000
+$ #PositionFormat
+# X: %4d x Y: %4d
+$ #GeometryFormat
+# W: %4d x H: %4d
+
diff --git a/nls/it_IT/Slit.m b/nls/it_IT/Slit.m
new file mode 100644
index 00000000..8bd23926
--- /dev/null
+++ b/nls/it_IT/Slit.m
@@ -0,0 +1,8 @@
+$set 7 #Slit
+
+$ #SlitTitle
+# Slit
+$ #SlitDirection
+# Direzione Della Slit
+$ #SlitPlacement
+# Posizionamento Della Slit
diff --git a/nls/it_IT/Toolbar.m b/nls/it_IT/Toolbar.m
new file mode 100644
index 00000000..1073951c
--- /dev/null
+++ b/nls/it_IT/Toolbar.m
@@ -0,0 +1,22 @@
+$set 8 #Toolbar
+
+$ #NoStrftimeLength
+# 00:00000
+$ #NoStrftimeDateFormat
+# %02d/%02d/%02d
+$ #NoStrftimeDateFormatEu
+# %02d.%02d.%02d
+$ #NoStrftimeTimeFormat24
+#  %02d:%02d 
+$ #NoStrftimeTimeFormat12
+# %02d:%02d %sm
+$ #NoStrftimeTimeFormatP
+# p
+$ #NoStrftimeTimeFormatA
+# a
+$ #ToolbarTitle
+# Toolbar
+$ #EditWkspcName
+# Cambia il nome del workspace corrente
+$ #ToolbarPlacement
+# Posizionamento della Toolbar
diff --git a/nls/it_IT/Window.m b/nls/it_IT/Window.m
new file mode 100644
index 00000000..4093665f
--- /dev/null
+++ b/nls/it_IT/Window.m
@@ -0,0 +1,17 @@
+$set 9 #Window
+
+
+$ #Creating
+# BlackboxWindow::BlackboxWindow: creando 0x%lx\n
+$ #XGetWindowAttributesFail
+# BlackboxWindow::BlackboxWindow: XGetWindowAttributres fallito\n
+$ #CannotFindScreen
+# BlackboxWindow::BlackboxWindow: non riesco a trovare lo schermo per la root window 0x%lx\n
+$ #Unnamed
+# Senza nome
+$ #MapRequest
+# BlackboxWindow::mapRequestEvent() per 0x%lx\n
+$ #UnmapNotify
+# BlackboxWindow::unmapNotifyEvent() per 0x%lx\n
+$ #UnmapNotifyReparent
+# BlackboxWindow::unmapnotifyEvent: reparent 0x%lx alla root\n
diff --git a/nls/it_IT/Windowmenu.m b/nls/it_IT/Windowmenu.m
new file mode 100644
index 00000000..6752320d
--- /dev/null
+++ b/nls/it_IT/Windowmenu.m
@@ -0,0 +1,22 @@
+$set 10 #Windowmenu
+
+$ #SendTo
+# Manda A ...
+$ #SendGroupTo
+# Manda Gruppo A ...
+$ #Shade
+# Riduci A Barra
+$ #Iconify
+# Iconifica
+$ #Maximize
+# Massimizza
+$ #Raise
+# In Primo Piano
+$ #Lower
+# In Secondo Piano
+$ #Stick
+# Stick
+$ #KillClient
+# Killa Il Client
+$ #Close
+# Chiudi
diff --git a/nls/it_IT/Workspace.m b/nls/it_IT/Workspace.m
new file mode 100644
index 00000000..315460a0
--- /dev/null
+++ b/nls/it_IT/Workspace.m
@@ -0,0 +1,4 @@
+$set 11 #Workspace
+
+$ #DefaultNameFormat
+# Workspace %d
diff --git a/nls/it_IT/Workspacemenu.m b/nls/it_IT/Workspacemenu.m
new file mode 100644
index 00000000..a97c0b01
--- /dev/null
+++ b/nls/it_IT/Workspacemenu.m
@@ -0,0 +1,8 @@
+$set 12 #Workspacemenu
+
+$ #WorkspacesTitle
+# Workspaces
+$ #NewWorkspace
+# New Workspace
+$ #RemoveLast
+# Rimuovi L'ultimo
diff --git a/nls/it_IT/blackbox.m b/nls/it_IT/blackbox.m
new file mode 100644
index 00000000..f82a2148
--- /dev/null
+++ b/nls/it_IT/blackbox.m
@@ -0,0 +1,7 @@
+$set 13 #blackbox
+
+$ #NoManagableScreens
+# Blackbox::Blackbox: no managable screens found, aborting\n
+# Blackbox::Blackbox: nessun schermo gestibile, uscendo\n
+$ #MapRequest
+# Blackbox::process_event: MapRequest per 0x%lx\n
diff --git a/nls/it_IT/bsetroot.m b/nls/it_IT/bsetroot.m
new file mode 100644
index 00000000..1298203a
--- /dev/null
+++ b/nls/it_IT/bsetroot.m
@@ -0,0 +1,16 @@
+$set 16 #bsetroot
+
+$ #MustSpecify
+# %s: errore: specicare una delle opzioni : -solid, -mod, -gradient\n
+$ #Usage
+# %s 2.0: (c) 1997-2000 Brad Hughes\n\n\
+  -display         conneessione al display\n\
+  -mod               modula pattern\n\
+  -foreground, -fg  colore del primo piano\n\
+  -background, -bg  colore dello sfondo\n\n\
+  -gradient       texture del gradiente\n\
+  -from             colore di partenza del gradiente\n\
+  -to               colore finale del gradiente\n\n\
+  -solid            colore solido\n\n\
+  -help                    mostra questo messaggio ed esci\n
+
diff --git a/nls/it_IT/common.m b/nls/it_IT/common.m
new file mode 100644
index 00000000..5f35bf26
--- /dev/null
+++ b/nls/it_IT/common.m
@@ -0,0 +1,57 @@
+$set 15 #Common
+
+$ #Yes
+# Si
+$ #No
+# No
+
+$ #DirectionTitle
+# Direzione
+$ #DirectionHoriz
+# Orizzontale
+$ #DirectionVert
+# Verticale
+
+$ #AlwaysOnTop
+# Sempre In Primo Piano
+
+$ #PlacementTitle
+# Posizionamento
+$ #PlacementTopLeft
+# Alto A Sinistra
+$ #PlacementCenterLeft
+# Centro A Sinistra
+$ #PlacementBottomLeft
+# Basso A Sinistra
+$ #PlacementTopCenter
+# Alto Al Centro
+$ #PlacementBottomCenter
+# Basso Al Centro
+$ #PlacementTopRight
+# Alto A Destra
+$ #PlacementCenterRight
+# Centro A Destra
+$ #PlacementBottomRight
+# Basso A Destra
+$ #PlacementLeftTop
+# Sinistra In Alto
+$ #PlacementLeftCenter
+# Sinistra Al Centro
+$ #PlacementLeftBottom
+# Sinistra In Basso
+$ #PlacementRightTop
+# Destra In Alto
+$ #PlacementRightCenter
+# Destra Al Centro
+$ #PlacementRightBottom
+# Destra In Basso
+$ #PlacementTopRelative
+# Relativo In Alto
+$ #PlacementBottomRelative
+# Relativo In Basso
+$ #PlacementLeftRelative
+# Relativo A Sinistra
+$ #PlacementRightRelative
+# Relativo A Destra
+$ #AutoHide
+# Nascondi Automaticamente
\ No newline at end of file
diff --git a/nls/it_IT/main.m b/nls/it_IT/main.m
new file mode 100644
index 00000000..5d5f1880
--- /dev/null
+++ b/nls/it_IT/main.m
@@ -0,0 +1,21 @@
+$set 14 #main
+
+$ #RCRequiresArg
+# errore: '-rc' richiede un argomento\n
+$ #DISPLAYRequiresArg
+# error: '-display' richiede un argomento\n
+$ #WarnDisplaySet
+# warning: non posso settare la variabile di ambiente 'DISPLAY'\n
+$ #Usage
+# Fluxkbox %s: (c) 2001 Henrik Kinnunen\n\n\
+  -display \t\tusa la connesione al display.\n\
+  -rc \t\t\tusa file di risorse alternativo.\n\
+  -version\t\t\tmostra la versione ed esci.\n\
+  -help\t\t\t\tmostra questo messaggio di aiuto ed esci.\n\n
+$ #CompileOptions
+# Opzioni Di Compilazione:\n\
+  Debugging\t\t\t%s\n\
+  Interlacing:\t\t\t%s\n\
+  Shape:\t\t\t%s\n\
+  Slit:\t\t\t\t%s\n\
+  8bpp Ordered Dithering:\t%s\n\n
diff --git a/nls/pt_BR/BaseDisplay.m b/nls/pt_BR/BaseDisplay.m
new file mode 100644
index 00000000..fbd626ee
--- /dev/null
+++ b/nls/pt_BR/BaseDisplay.m
@@ -0,0 +1,16 @@
+$set 1 #BaseDisplay
+
+$ #XError
+# %s:  X erro: %s(%d) opcodes %d/%d\n  recurso 0x%lx\n
+$ #SignalCaught
+# %s: recebeido sinal %d\n
+$ #ShuttingDown
+# desligando\n
+$ #Aborting
+# abortando... gerando arquivo core\n
+$ #XConnectFail
+# BaseDisplay::BaseDisplay: conecção ao servidor X falhou.\n
+$ #CloseOnExecFail
+# BaseDisplay::BaseDisplay: impossivel marcar a conexão ao display como close-on-exec\n
+$ #BadWindowRemove
+# BaseDisplay::eventLoop(): removendo má janela da trilha de eventos\n
diff --git a/nls/pt_BR/Basemenu.m b/nls/pt_BR/Basemenu.m
new file mode 100644
index 00000000..80e56ed3
--- /dev/null
+++ b/nls/pt_BR/Basemenu.m
@@ -0,0 +1,4 @@
+$set 2 #Basemenu
+
+$ #BlackboxMenu
+# Menu Blackbox
diff --git a/nls/pt_BR/Configmenu.m b/nls/pt_BR/Configmenu.m
new file mode 100644
index 00000000..129d991f
--- /dev/null
+++ b/nls/pt_BR/Configmenu.m
@@ -0,0 +1,48 @@
+$set 3 #Configmenu
+
+$ #ConfigOptions
+# Configurações
+$ #FocusModel
+# Modelo de Foco
+$ #WindowPlacement
+# Posicionamento das Janelas
+$ #ImageDithering
+# Simulação de Cores em Imagens
+$ #OpaqueMove
+# Movimento Opaco de Janelas
+$ #FullMax
+# Maximização Total
+$ #FocusNew
+# Foco em Novas Janelas
+$ #FocusLast
+# Foco na Ultima Janela Da Area de Trabalho
+$ #ClickToFocus
+# Foco na Janela Quando Clicada
+$ #SloppyFocus
+# Foco na Janela Quando Apontada
+$ #AutoRaise
+# Sobrepor Janela Quando Ativa
+$ #SmartRows
+# Posicionamento em Fila
+$ #SmartCols
+# Posicionamento em Coluna
+$ #Cascade
+# Posicionamento em Cascata
+$ #LeftRight
+# Esquerda para Direita
+$ #RightLeft
+# Direita para Esquerda
+$ #TopBottom
+# Cima para Baixo
+$ #BottomTop
+# Baixo para Cima
+$ #Tabs
+# Use Tabs
+$ #Icons
+# Use Icons
+$ #TabPlacement
+# Tab Placement
+$ #TabRotateVertical
+# Rotate Vertical Tabs
+$ #SemiSloppyFocus
+# Semi Sloppy Focus
diff --git a/nls/pt_BR/Icon.m b/nls/pt_BR/Icon.m
new file mode 100644
index 00000000..2e350970
--- /dev/null
+++ b/nls/pt_BR/Icon.m
@@ -0,0 +1,4 @@
+$set 4 #Icon
+
+$ #Icons
+# Icones
diff --git a/nls/pt_BR/Image.m b/nls/pt_BR/Image.m
new file mode 100644
index 00000000..596f097b
--- /dev/null
+++ b/nls/pt_BR/Image.m
@@ -0,0 +1,24 @@
+$set 5 #Image
+
+$ #ErrorCreatingSolidPixmap
+# BImage::render_solid: erro criando pixmap\n
+$ #ErrorCreatingXImage
+# BImage::renderXImage: erro criando XImage\n
+$ #UnsupVisual
+# BImage::renderXImage: visual não suportado\n
+$ #ErrorCreatingPixmap
+# BImage::renderPixmap: erro criando pixmap\n
+$ #InvalidColormapSize
+# BImageControl::BImageControl: mapa de cores de tamanho invalido %d (%d/%d/%d) - reduzindo\n
+$ #ErrorAllocatingColormap
+# BImageControl::BImageControl: erro localizando mapa de cores\n
+$ #ColorAllocFail
+# BImageControl::BImageControl: falha localizando cor %d/%d/%d\n
+$ #PixmapRelease
+# BImageControl::~BImageControl: reserva de pixmap cheia - liberando %d pixmaps\n
+$ #PixmapCacheLarge
+# BImageControl::renderImage: reserva cheia, forçando limpeza\n
+$ #ColorParseError
+# BImageControl::getColor: color parse error: '%s'\n
+$ #ColorAllocError
+# BImageControl::getColor: erro localizando cor: '%s'\n
diff --git a/nls/pt_BR/Makefile.am b/nls/pt_BR/Makefile.am
new file mode 100644
index 00000000..197c57da
--- /dev/null
+++ b/nls/pt_BR/Makefile.am
@@ -0,0 +1,29 @@
+# nls/pt_BR/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST=$(MFILES)
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/pr_BR"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/pt_BR; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/pt_BR; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/pt_BR/blackbox.cat; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/pt_BR; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
diff --git a/nls/pt_BR/Makefile.in b/nls/pt_BR/Makefile.in
new file mode 100644
index 00000000..42515d6f
--- /dev/null
+++ b/nls/pt_BR/Makefile.in
@@ -0,0 +1,220 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# nls/pt_BR/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+CXX = @CXX@
+DEBUG = @DEBUG@
+DLLTOOL = @DLLTOOL@
+GNOME = @GNOME@
+INTERLACE = @INTERLACE@
+KDE = @KDE@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+NEWWMSPEC = @NEWWMSPEC@
+NLS = @NLS@
+OBJDUMP = @OBJDUMP@
+ORDEREDPSEUDO = @ORDEREDPSEUDO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHAPE = @SHAPE@
+SLIT = @SLIT@
+TIMEDCACHE = @TIMEDCACHE@
+VERSION = @VERSION@
+gencat_cmd = @gencat_cmd@
+regex_cmd = @regex_cmd@
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST = $(MFILES)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps nls/pt_BR/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = nls/pt_BR
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-data-local
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-local
+uninstall: uninstall-am
+all-am: Makefile all-local
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+	-rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-local install-data-am install-data install-am install \
+uninstall-local uninstall-am uninstall all-local all-redirect all-am \
+all installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/pr_BR"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/pt_BR; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/pt_BR; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/pt_BR/blackbox.cat; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/pt_BR; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/nls/pt_BR/Screen.m b/nls/pt_BR/Screen.m
new file mode 100644
index 00000000..6c6c06d8
--- /dev/null
+++ b/nls/pt_BR/Screen.m
@@ -0,0 +1,52 @@
+$set 6 #Screen
+
+$ #AnotherWMRunning
+# BScreen::BScreen: um erro occorreu enquanto chamando o servidor X.\n  \
+existe outro window menager rodando no display. %s.\n
+$ #ManagingScreen
+# BScreen::BScreen: managing screen %d using visual 0x%lx, depth %d\n
+$ #FontLoadFail
+# BScreen::LoadStyle(): impossivel carregar fonte '%s'\n
+$ #DefaultFontLoadFail
+# BScreen::LoadStyle(): impossivel carregar fonte padrão.\n
+$ #EmptyMenuFile
+# %s: arquivo de menu vazio\n
+$ #xterm
+# xterm
+$ #Restart
+# Reiniciar
+$ #Exit
+# Sair
+$ #EXECError
+# BScreen::parseMenuFile: [exec] erro, não há indicação definida no menu e/ou comando definido\n
+$ #EXITError
+# BScreen::parseMenuFile: [exit] erro, não há indicação definida no menu\n
+$ #STYLEError
+# BScreen::parseMenuFile: [style] erro, não há indicação de menu e/ou nome de arquivo difinido\n
+$ #CONFIGError
+# BScreen::parseMenuFile: [config] erro, não há indicação definida no menu\n
+$ #INCLUDEError
+# BScreen::parseMenuFile: [include] erro, nome de arquivo não definido\n
+$ #INCLUDEErrorReg
+# BScreen::parseMenuFile: [include] error, '%s' não é um arquivo regular\n
+$ #SUBMENUError
+# BScreen::parseMenuFile: [submenu] erro, não há indicação definida no menu\n
+$ #RESTARTError
+# BScreen::parseMenuFile: [restart] erro, não há indicação definida no menu\n
+$ #RECONFIGError
+# BScreen::parseMenuFile: [reconfig] erro, não há indicação definida no menu\n
+$ #STYLESDIRError
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] erro, não há diretorio difinido\n
+$ #STYLESDIRErrorNotDir
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] erro, '%s' não é um diretorio\n
+$ #STYLESDIRErrorNoExist
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] erro, '%s' não existe\n
+$ #WORKSPACESError
+# BScreen::parseMenuFile: [workspaces] erro, não há indicação definida no menu\n
+$ #PositionLength
+# 0: 0000 x 0: 0000
+$ #PositionFormat
+# X: %4d x Y: %4d
+$ #GeometryFormat
+# W: %4d x H: %4d
+
diff --git a/nls/pt_BR/Slit.m b/nls/pt_BR/Slit.m
new file mode 100644
index 00000000..73cff228
--- /dev/null
+++ b/nls/pt_BR/Slit.m
@@ -0,0 +1,8 @@
+$set 7 #Slit
+
+$ #SlitTitle
+# Slit
+$ #SlitDirection
+# Direção
+$ #SlitPlacement
+# Posicionamento
diff --git a/nls/pt_BR/Toolbar.m b/nls/pt_BR/Toolbar.m
new file mode 100644
index 00000000..bf1a77be
--- /dev/null
+++ b/nls/pt_BR/Toolbar.m
@@ -0,0 +1,22 @@
+$set 8 #Toolbar
+
+$ #NoStrftimeLength
+# 00:00000
+$ #NoStrftimeDateFormat
+# %02d/%02d/%02d
+$ #NoStrftimeDateFormatEu
+# %02d.%02d.%02d
+$ #NoStrftimeTimeFormat24
+#  %02d:%02d 
+$ #NoStrftimeTimeFormat12
+# %02d:%02d %sm
+$ #NoStrftimeTimeFormatP
+# p
+$ #NoStrftimeTimeFormatA
+# a
+$ #ToolbarTitle
+# Toolbar
+$ #EditWkspcName
+# Renomear Area de Trabalho
+$ #ToolbarPlacement
+# Posicionamento
diff --git a/nls/pt_BR/Window.m b/nls/pt_BR/Window.m
new file mode 100644
index 00000000..36f9d10c
--- /dev/null
+++ b/nls/pt_BR/Window.m
@@ -0,0 +1,17 @@
+$set 9 #Window
+
+
+$ #Creating
+# BlackboxWindow::BlackboxWindow: criando 0x%lx\n
+$ #XGetWindowAttributesFail
+# BlackboxWindow::BlackboxWindow: XGetWindowAttributres falhou\n
+$ #CannotFindScreen
+# BlackboxWindow::BlackboxWindow: impossivel encontrar tela para janela 0x%lx\n
+$ #Unnamed
+# Sem Nome
+$ #MapRequest
+# BlackboxWindow::mapRequestEvent() para 0x%lx\n
+$ #UnmapNotify
+# BlackboxWindow::unmapNotifyEvent() para 0x%lx\n
+$ #UnmapNotifyReparent
+# BlackboxWindow::unmapnotifyEvent: reparent 0x%lx to root\n
diff --git a/nls/pt_BR/Windowmenu.m b/nls/pt_BR/Windowmenu.m
new file mode 100644
index 00000000..fe81d4f9
--- /dev/null
+++ b/nls/pt_BR/Windowmenu.m
@@ -0,0 +1,20 @@
+$set 10 #Windowmenu
+
+$ #SendTo
+# Enviar Para ...
+$ #Shade
+# Encolher
+$ #Iconify
+# Minimizar
+$ #Maximize
+# Maximizar
+$ #Raise
+# Focalizar
+$ #Lower
+# Desfocalizar
+$ #Stick
+# Sempre Visivel
+$ #KillClient
+# Kill Cliente
+$ #Close
+# Fechar
diff --git a/nls/pt_BR/Workspace.m b/nls/pt_BR/Workspace.m
new file mode 100644
index 00000000..e9516f16
--- /dev/null
+++ b/nls/pt_BR/Workspace.m
@@ -0,0 +1,4 @@
+$set 11 #Workspace
+
+$ #DefaultNameFormat
+# Area de Trabalho %d
diff --git a/nls/pt_BR/Workspacemenu.m b/nls/pt_BR/Workspacemenu.m
new file mode 100644
index 00000000..64ab9d0f
--- /dev/null
+++ b/nls/pt_BR/Workspacemenu.m
@@ -0,0 +1,8 @@
+$set 12 #Workspacemenu
+
+$ #WorkspacesTitle
+# Areas de Trabalho
+$ #NewWorkspace
+# Nova Area de Trabalho
+$ #RemoveLast
+# Remover Ultima
diff --git a/nls/pt_BR/blackbox.m b/nls/pt_BR/blackbox.m
new file mode 100644
index 00000000..136cb0e6
--- /dev/null
+++ b/nls/pt_BR/blackbox.m
@@ -0,0 +1,6 @@
+$set 13 #blackbox
+
+$ #NoManagableScreens
+# Blackbox::Blackbox: não foram encontradas telas administraveis, abortando..\n
+$ #MapRequest
+# Blackbox::process_event: MapRequest para 0x%lx\n
diff --git a/nls/pt_BR/bsetroot.m b/nls/pt_BR/bsetroot.m
new file mode 100644
index 00000000..c63f994d
--- /dev/null
+++ b/nls/pt_BR/bsetroot.m
@@ -0,0 +1,16 @@
+$set 16 #bsetroot
+
+$ #MustSpecify
+# %s: erro: necessario especificar um dos seguintes argumentos: -solid, -mod, -gradient\n
+$ #Usage
+# %s 2.0: (c) 1997-2000 Brad Hughes\n\n\
+  -display         conexão com display\n\
+  -mod               modula pattern\n\
+  -foreground, -fg  modula foreground color\n\
+  -background, -bg  modula background color\n\n\
+  -gradient       textura gradiente\n\
+  -from             cor de inicio do gradiente\n\
+  -to               com do fim do gradiente\n\n\
+  -solid            cor solida\n\n\
+  -help                    mostra essa ajuda e sai\n
+
diff --git a/nls/pt_BR/common.m b/nls/pt_BR/common.m
new file mode 100644
index 00000000..ba8a41b8
--- /dev/null
+++ b/nls/pt_BR/common.m
@@ -0,0 +1,58 @@
+$set 15 #Common
+
+$ #Yes
+# Sim
+$ #No
+# Não
+
+$ #DirectionTitle
+# Direção
+$ #DirectionHoriz
+# Horizontal
+$ #DirectionVert
+# Vertical
+
+$ #AlwaysOnTop
+# Sempre Visivel
+
+$ #PlacementTitle
+# Posicionamento
+$ #PlacementTopLeft
+# No Alto a Esquerda
+$ #PlacementCenterLeft
+# No Centro a Esquerda
+$ #PlacementBottomLeft
+# Em Baixo a Esquerda
+$ #PlacementTopCenter
+# No Alto e no Centro
+$ #PlacementBottomCenter
+# Em Baixo e no Centro
+$ #PlacementTopRight
+# No Alto a Direita
+$ #PlacementCenterRight
+# No Meio a Direita
+$ #PlacementBottomRight
+# Em Baixo a Direita
+$ #PlacementLeftTop
+# Left Top
+$ #PlacementLeftCenter
+# Left Center
+$ #PlacementLeftBottom
+# Left Bottom
+$ #PlacementRightTop
+# Right Top
+$ #PlacementRightCenter
+# Right Center
+$ #PlacementRightBottom
+# Right Bottom
+$ #PlacementTopRelative
+# Top Relative
+$ #PlacementBottomRelative
+# Bottom Relative
+$ #PlacementLeftRelative
+# Left Relative
+$ #PlacementRightRelative
+# Right Relative
+
+$ #AutoHide
+# Auto hide
diff --git a/nls/pt_BR/main.m b/nls/pt_BR/main.m
new file mode 100644
index 00000000..b04cc771
--- /dev/null
+++ b/nls/pt_BR/main.m
@@ -0,0 +1,21 @@
+$set 14 #main
+
+$ #RCRequiresArg
+# erro: '-rc' requer um argumento\n
+$ #DISPLAYRequiresArg
+# erro: '-display' requer um argumento\n
+$ #WarnDisplaySet
+# aviso: não foi possivel setar a variavel de ambiente 'DISPLAY'\n
+$ #Usage
+# Fluxbox %s: (c) 2001 Henrik Kinnunen\n\n\
+  -display \t\tusar conexão com o display.\n\
+  -rc \t\t\tusar arquivo alternativo de recursos.\n\
+  -version\t\t\tmostrar versao e sair.\n\
+  -help\t\t\t\tmostrar esta ajuda e sair.\n\n
+$ #CompileOptions
+# Opções em tempo de compilação:\n\
+  Informações extras para problemas:\t\t\t%s\n\
+  Interlacing:\t\t\t%s\n\
+  Forma:\t\t\t%s\n\
+  Slit:\t\t\t\t%s\n\
+  8bpp Simulação ordenada de cores em imagens:\t%s\n\n
diff --git a/nls/ru_RU/BaseDisplay.m b/nls/ru_RU/BaseDisplay.m
new file mode 100644
index 00000000..809dc92c
--- /dev/null
+++ b/nls/ru_RU/BaseDisplay.m
@@ -0,0 +1,16 @@
+$set 1 #BaseDisplay
+
+$ #XError
+# %s:  ÏÛÉÂËÁ X ÓÅÒ×ÅÒÁ: %s(%d) ÚÎÁÞÅÎÉÑ %d/%d\n ÒÅÓÕÒÓ 0x%lx\n
+$ #SignalCaught
+# %s: ÐÏÌÕÞÅÎ ÓÉÇÎÁÌ %d \n
+$ #ShuttingDown
+# ÏÔËÌÀÞÅÎÉÅ\n
+$ #Aborting
+# ïÔÍÅÎÁ... ÓÏÚÄÁÅÔÓÑ ÄÁÍÐ core\n
+$ #XConnectFail
+# BaseDisplay::BaseDisplay: ÓÏÅÄÉÎÅÎÉÅ Ó X ÓÅÒ×ÅÒÏÍ ÐÒÏ×ÁÌÅÎÏ.\n
+$ #CloseOnExecFail
+# BaseDisplay::BaseDisplay: ÎÅÔ ×ÏÚÍÏÖÎÏÓÔÉ ÐÏÍÅÔÉÔØ ÁËÔÉ×ÎÙÊ ÄÉÓÐÌÅÊ ËÁË "ÚÁËÒÙÔÙÊ-ÎÁ-ÉÓÐÏÌÎÅÎÉÅ"\n
+$ #BadWindowRemove
+# BaseDisplay::eventLoop(): ÐÌÏÈÏÅ ÏËÎÏ ÕÄÁÌÑÅÔÓÑ ÉÚ ÏÞÅÒÅÄÉ ÓÏÂÙÔÉÊ\n
diff --git a/nls/ru_RU/Basemenu.m b/nls/ru_RU/Basemenu.m
new file mode 100644
index 00000000..d555ac37
--- /dev/null
+++ b/nls/ru_RU/Basemenu.m
@@ -0,0 +1,4 @@
+$set 2 #Basemenu
+
+$ #BlackboxMenu
+# íÅÎÀ BlackBox
diff --git a/nls/ru_RU/Configmenu.m b/nls/ru_RU/Configmenu.m
new file mode 100644
index 00000000..4eac1079
--- /dev/null
+++ b/nls/ru_RU/Configmenu.m
@@ -0,0 +1,48 @@
+$set 3 #Configmenu
+
+$ #ConfigOptions
+# ëÏÎÆÉÇÕÒÁÃÉÑ
+$ #FocusModel
+# íÏÄÅÌØ ÆÏËÕÓÉÒÏ×ËÉ
+$ #WindowPlacement
+# ðÏÌÏÖÅÎÉÅ ÏËÎÁ
+$ #ImageDithering
+# Image Dithering
+$ #OpaqueMove
+# ðÅÒÅÍÅÝÅÎÉÅ ÚÁÐÏÌÎÅÎÎÙÈ ÏËÏÎ
+$ #FullMax
+# ðÏÌÎÁÑ ÍÁËÓÉÍÉÚÁÃÉÑ
+$ #FocusNew
+# ðÅÒÅÍÅÝÁÔØ ÆÏËÕÓ ÎÁ ÎÏ×ÙÅ ÏËÎÁ
+$ #FocusLast
+# æÏËÕÓ ÎÁ ÐÏÓÌÅÄÎÅÅ ÏËÎÏ ÒÁÂÏÞÅÇÏ ÓÔÏÌÁ
+$ #ClickToFocus
+# æÏËÕÓ ÐÏ ÝÅÌÞËÕ
+$ #SloppyFocus
+# æÏËÕÓ ÐÏ ÐÅÒÅÍÅÝÅÎÉÀ
+$ #AutoRaise
+# á×ÔÏ×ÓÐÌÙÔÉÅ
+$ #SmartRows
+# "õÍÎÏÅ" ÒÁÓÐÏÌÏÖÅÎÉÅ (ÐÏ ÇÏÒÉÚÏÎÔÁÌÉ)
+$ #SmartCols
+# "õÍÎÏÅ" ÒÁÓÐÏÌÏÖÅÎÉÅ (ÐÏ ×ÅÒÔÉËÁÌÉ)
+$ #Cascade
+# ëÁÓËÁÄÏÍ
+$ #LeftRight
+# óÌÅ×Á ÎÁÐÒÁ×Ï
+$ #RightLeft
+# óÐÒÁ×Á ÎÁÌÅ×Ï
+$ #TopBottom
+# ó×ÅÒÈÕ ×ÎÉÚ
+$ #BottomTop
+# óÎÉÚÕ ××ÅÒÈ
+$ #Tabs
+# Use Tabs
+$ #Icons
+# Use Icons
+$ #TabPlacement
+# Tab Placement
+$ #TabRotateVertical
+# Rotate Vertical Tabs
+$ #SemiSloppyFocus
+# Semi Sloppy Focus
diff --git a/nls/ru_RU/Icon.m b/nls/ru_RU/Icon.m
new file mode 100644
index 00000000..401f66cf
--- /dev/null
+++ b/nls/ru_RU/Icon.m
@@ -0,0 +1,4 @@
+$set 4 #Icon
+
+$ #Icons
+# ó×ÅÒÎÕÔÙÅ\nÏËÎÁ
diff --git a/nls/ru_RU/Image.m b/nls/ru_RU/Image.m
new file mode 100644
index 00000000..ea6b32bc
--- /dev/null
+++ b/nls/ru_RU/Image.m
@@ -0,0 +1,24 @@
+$set 5 #Image
+
+$ #ErrorCreatingSolidPixmap
+# BImage::render_solid: ÏÛÉÂËÁ ÓÏÚÄÁÎÉÑ pixmap\n
+$ #ErrorCreatingXImage
+# BImage::renderXImage: ÏÛÉÂËÁ ÓÏÚÄÁÎÉÑ XImage\n
+$ #UnsupVisual
+# BImage::renderXImage: ÎÅÐÏÄÄÅÒÖÉ×ÁÅÍÙÊ ÔÉÐ ×ÉÚÕÁÌÉÚÁÃÉÉ\n
+$ #ErrorCreatingPixmap
+# BImage::renderPixmap: ÏÛÉÂËÁ ÓÏÚÄÁÎÉÑ pixmap\n
+$ #InvalidColormapSize
+# BImageControl::BImageControl: ÎÅ×ÅÒÎÙÊ ÒÁÚÍÅÒ ÔÁÂÌÉÃÙ Ã×ÅÔÏ× %d (%d/%d/%d) - ÕÄÁÌÑÅÔÓÑ\n
+$ #ErrorAllocatingColormap
+# BImageControl::BImageControl: ÏÛÉÂËÁ ÒÁÚÍÅÝÅÎÉÑ ÔÁÂÌÉÃÙ Ã×ÅÔÏ×\n
+$ #ColorAllocFail
+# BImageControl::BImageControl: ÎÅ×ÏÚÍÏÖÎÏ ÒÁÚÍÅÓÔÉÔØ Ã×ÅÔ %d/%d/%d × ÐÁÍÑÔÉ\n
+$ #PixmapRelease
+# BImageControl::~BImageControl: ËÜÛ ÔÏÞÅÞÎÙÈ ÉÚÏÂÒÁÖÅÎÉÊ - ÏÓ×ÏÂÏÖÄÁÅÔÓÑ %d ÂÌÏËÏ×\n
+$ #PixmapCacheLarge
+# BImageControl::renderImage: ÐÅÒÅÐÏÌÎÅÎÉÅ ËÜÛÁ, ÐÒÏÉÚ×ÏÄÉÔÓÑ ÂÙÓÔÒÁÑ ÏÞÉÓÔËÁ\n
+$ #ColorParseError
+# BImageControl::getColor: ÏÛÉÂËÁ ÒÁÚÂÏÒÁ ÓÔÒÏËÉ, ÏÐÉÓÙ×ÁÀÝÅÊ Ã×ÅÔ: '%s'\n
+$ #ColorAllocError
+# BImageControl::getColor: ÏÛÉÂËÁ ÒÁÚÍÅÝÅÎÉÑ Ã×ÅÔÁ × ÐÁÍÑÔÉ: '%s'\n
diff --git a/nls/ru_RU/Makefile.am b/nls/ru_RU/Makefile.am
new file mode 100644
index 00000000..a95d0356
--- /dev/null
+++ b/nls/ru_RU/Makefile.am
@@ -0,0 +1,29 @@
+# nls/ru_RU/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST=$(MFILES)
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/ru_RU"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/ru_RU; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/ru_RU; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/ru_RU/blackbox.cat; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/ru_RU; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
diff --git a/nls/ru_RU/Makefile.in b/nls/ru_RU/Makefile.in
new file mode 100644
index 00000000..b2bb3243
--- /dev/null
+++ b/nls/ru_RU/Makefile.in
@@ -0,0 +1,220 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# nls/ru_RU/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+CXX = @CXX@
+DEBUG = @DEBUG@
+DLLTOOL = @DLLTOOL@
+GNOME = @GNOME@
+INTERLACE = @INTERLACE@
+KDE = @KDE@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+NEWWMSPEC = @NEWWMSPEC@
+NLS = @NLS@
+OBJDUMP = @OBJDUMP@
+ORDEREDPSEUDO = @ORDEREDPSEUDO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHAPE = @SHAPE@
+SLIT = @SLIT@
+TIMEDCACHE = @TIMEDCACHE@
+VERSION = @VERSION@
+gencat_cmd = @gencat_cmd@
+regex_cmd = @regex_cmd@
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST = $(MFILES)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps nls/ru_RU/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = nls/ru_RU
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-data-local
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-local
+uninstall: uninstall-am
+all-am: Makefile all-local
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+	-rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-local install-data-am install-data install-am install \
+uninstall-local uninstall-am uninstall all-local all-redirect all-am \
+all installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/ru_RU"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/ru_RU; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/ru_RU; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/ru_RU/blackbox.cat; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/ru_RU; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/nls/ru_RU/Screen.m b/nls/ru_RU/Screen.m
new file mode 100644
index 00000000..10add528
--- /dev/null
+++ b/nls/ru_RU/Screen.m
@@ -0,0 +1,52 @@
+$set 6 #Screen
+
+$ #AnotherWMRunning
+# BScreen::BScreen: ÐÒÏÉÚÏÛÌÁ ÏÛÉÂËÁ ÐÒÉ ÏÂÒÁÝÅÎÉÉ Ë X ÓÅÒ×ÅÒÕ.\n  \
+ÄÒÕÇÏÊ ÍÅÎÅÄÖÅÒ ÏËÏÎ ÕÖÅ ÚÁÐÕÝÅÎ ÎÁ ÄÉÓÐÌÅÅ %s.\n
+$ #ManagingScreen
+# BScreen::BScreen: ÏÂÓÌÕÖÉ×ÁÅÔÓÑ ÜËÒÁÎ %d, ÉÓÐÏÌØÚÕÅÍÙÊ ÔÉÐ ×ÉÚÕÁÌÉÚÁÃÉÉ 0x%lx, ÇÌÕÂÉÎÁ Ã×ÅÔÁ %d\n
+$ #FontLoadFail
+# BScreen::LoadStyle(): ÎÅÔ ×ÏÚÍÏÖÎÏÓÔÉ ÚÁÇÒÕÚÉÔØ ÛÒÉÆÔ '%s'\n
+$ #DefaultFontLoadFail
+# BScreen::LoadStyle(): ÎÅÔ ×ÏÚÍÏÖÎÏÓÔÉ ÚÁÇÒÕÚÉÔØ ÐÒÅÄÏÐÒÅÄÅÌÅÎÎÙÊ ÛÒÉÆÔ.\n
+$ #EmptyMenuFile
+# %s: ÐÕÓÔÏÊ ÆÁÊÌ ÍÅÎÀ\n
+$ #xterm
+# Xterm
+$ #Restart
+# ðÅÒÅÚÁÐÕÓË
+$ #Exit
+# ÷ÙÈÏÄ
+$ #EXECError
+# BScreen::parseMenuFile: ÏÛÉÂËÁ [exec], ÎÅ ÏÐÒÅÄÅÌÅÎÏ ÎÁÚ×ÁÎÉÅ ÐÕÎËÔÁ ÍÅÎÀ É/ÉÌÉ ÎÁÚ×ÁÎÉÅ ËÏÍÍÁÎÄÙ\n
+$ #EXITError
+# BScreen::parseMenuFile: ÏÛÉÂËÁ [exit], ÎÅ ÏÐÒÅÄÅÌÅÎÏ ÎÁÚ×ÁÎÉÅ ÐÕÎËÔÁ ÍÅÎÀ\n
+$ #STYLEError
+# BScreen::parseMenuFile: ÏÛÉÂËÁ [style], ÎÅ ÏÐÒÅÄÅÌÅÎÏ ÎÁÚ×ÁÎÉÅ ÐÕÎËÔÁ ÍÅÎÀ É/ÉÌÉ ÉÍÑ ÆÁÊÌÁ\n
+$ #CONFIGError
+# BScreen::parseMenuFile: ÏÛÉÂËÁ [config], ÎÅ ÏÐÒÅÄÅÌÅÎÏ ÎÁÚ×ÁÎÉÅ ÐÕÎËÔÁ ÍÅÎÀ\n
+$ #INCLUDEError
+# BScreen::parseMenuFile: ÏÛÉÂËÁ [include], ÎÅ ÏÐÒÅÄÅÌÅÎÏ ÉÍÑ ÆÁÊÌÁ\n
+$ #INCLUDEErrorReg
+# BScreen::parseMenuFile: ÏÛÉÂËÁ [include], '%s' ÎÅ ÏÂÙÞÎÙÊ ÆÁÊÌ\n
+$ #SUBMENUError
+# BScreen::parseMenuFile: ÏÛÉÂËÁ [submenu], ÎÅ ÏÐÒÅÄÅÌÅÎÏ ÎÁÚ×ÁÎÉÅ ÐÕÎËÔÁ ÍÅÎÀ\n
+$ #RESTARTError
+# BScreen::parseMenuFile: ÏÛÉÂËÁ [restart], ÎÅ ÏÐÒÅÄÅÌÅÎÏ ÎÁÚ×ÁÎÉÅ ÐÕÎËÔÁ ÍÅÎÀ\n
+$ #RECONFIGError
+# BScreen::parseMenuFile: ÏÛÉÂËÁ [reconfig], ÎÅ ÏÐÒÅÄÅÌÅÎÏ ÎÁÚ×ÁÎÉÅ ÐÕÎËÔÁ ÍÅÎÀ\n
+$ #STYLESDIRError
+# BScreen::parseMenuFile: ÏÛÉÂËÁ [stylesdir/stylesmenu], ÎÅ ÏÐÒÅÄÅÌÅÎÏ ÉÍÑ ÄÉÒÅËÔÏÒÉÉ\n
+$ #STYLESDIRErrorNotDir
+# BScreen::parseMenuFile: ÏÛÉÂËÁ [stylesdir/stylesmenu], '%s' ÎÅ ÄÉÒÅËÔÏÒÉÑ\n
+$ #STYLESDIRErrorNoExist
+# BScreen::parseMenuFile: ÏÛÉÂËÁ [stylesdir/stylesmenu], '%s' ÎÅ ÓÕÝÅÓÔ×ÕÅÔ\n
+$ #WORKSPACESError
+# BScreen::parseMenuFile: ÏÛÉÂËÁ [workspaces], ÎÅ ÏÐÒÅÄÅÌÅÎÏ ÎÁÚ×ÁÎÉÅ ÐÕÎËÔÁ ÍÅÎÀ\n
+$ #PositionLength
+# 0: 0000 x 0: 0000
+$ #PositionFormat
+# X: %4d x Y: %4d
+$ #GeometryFormat
+# W: %4d x H: %4d
+
diff --git a/nls/ru_RU/Slit.m b/nls/ru_RU/Slit.m
new file mode 100644
index 00000000..d06d296f
--- /dev/null
+++ b/nls/ru_RU/Slit.m
@@ -0,0 +1,8 @@
+$set 7 #Slit
+
+$ #SlitTitle
+# äÏËÅÒ
+$ #SlitDirection
+# ïÒÉÅÎÔÁÃÉÑ ÄÏËÅÒÁ
+$ #SlitPlacement
+# íÅÓÔÏÐÏÌÏÖÅÎÉÑ ÄÏËÅÒÁ
diff --git a/nls/ru_RU/Toolbar.m b/nls/ru_RU/Toolbar.m
new file mode 100644
index 00000000..f84495f0
--- /dev/null
+++ b/nls/ru_RU/Toolbar.m
@@ -0,0 +1,22 @@
+$set 8 #Toolbar
+
+$ #NoStrftimeLength
+# 00:00000
+$ #NoStrftimeDateFormat
+# %02d/%02d/%02d
+$ #NoStrftimeDateFormatEu
+# %02d.%02d.%02d
+$ #NoStrftimeTimeFormat24
+#  %02d:%02d 
+$ #NoStrftimeTimeFormat12
+# %02d:%02d %sm
+$ #NoStrftimeTimeFormatP
+# ÐÐ
+$ #NoStrftimeTimeFormatA
+# ÄÐ
+$ #ToolbarTitle
+# ôÕÌÂÁÒ
+$ #EditWkspcName
+# òÅÄÁËÔÉÒÏ×ÁÔØ ÉÍÑ ÔÅËÕÝÅÇÏ ÒÁÂÏÞÅÇÏ ÓÔÏÌÁ
+$ #ToolbarPlacement
+# íÅÓÔÏÐÏÌÏÖÅÎÉÅ ÔÕÌÂÁÒÁ
diff --git a/nls/ru_RU/Window.m b/nls/ru_RU/Window.m
new file mode 100644
index 00000000..ba277cda
--- /dev/null
+++ b/nls/ru_RU/Window.m
@@ -0,0 +1,17 @@
+$set 9 #Window
+
+
+$ #Creating
+# BlackboxWindow::BlackboxWindow: ÓÏÚÄÁÅÔÓÑ 0x%lx\n
+$ #XGetWindowAttributesFail
+# BlackboxWindow::BlackboxWindow: ÐÒÏ×ÁÌÅÎ ÐÒÏÃÅÓÓ XGetWindowAttributres\n
+$ #CannotFindScreen
+# BlackboxWindow::BlackboxWindow: ÎÅÔ ×ÏÚÍÏÖÎÏÓÔÉ ÎÁÊÔÉ ÜËÒÁÎ ÄÌÑ ËÏÒÎÅ×ÏÇÏ ÏËÎÁ 0x%lx\n
+$ #Unnamed
+# âÅÚÙÍÑÎÎÏÅ
+$ #MapRequest
+# BlackboxWindow::mapRequestEvent() ÄÌÑ 0x%lx\n
+$ #UnmapNotify
+# BlackboxWindow::unmapNotifyEvent() ÄÌÑ 0x%lx\n
+$ #UnmapNotifyReparent
+# BlackboxWindow::unmapnotifyEvent: reparent 0x%lx to root\n
diff --git a/nls/ru_RU/Windowmenu.m b/nls/ru_RU/Windowmenu.m
new file mode 100644
index 00000000..0883c255
--- /dev/null
+++ b/nls/ru_RU/Windowmenu.m
@@ -0,0 +1,20 @@
+$set 10 #Windowmenu
+
+$ #SendTo
+# ïÔÐÒÁ×ÉÔØ ÎÁ ...
+$ #Shade
+# ó×ÅÒÎÕÔØ × ÚÁÇÏÌÏ×ÏË
+$ #Iconify
+# ó×ÅÒÎÕÔØ × ÉËÏÎËÕ
+$ #Maximize
+# íÁËÓÉÍÉÚÉÒÏ×ÁÔØ
+$ #Raise
+# ðÏÄÎÑÔØ ÎÁ×ÅÒÈ
+$ #Lower
+# ïÐÕÓÔÉÔØ ×ÎÉÚ
+$ #Stick
+# ðÒÉËÌÅÉÔØ
+$ #KillClient
+# õÂÉÔØ ËÌÉÅÎÔÓËÏÅ ÐÒÉÌÏÖÅÎÉÅ
+$ #Close
+# úÁËÒÙÔØ
diff --git a/nls/ru_RU/Workspace.m b/nls/ru_RU/Workspace.m
new file mode 100644
index 00000000..47cfcc5d
--- /dev/null
+++ b/nls/ru_RU/Workspace.m
@@ -0,0 +1,4 @@
+$set 11 #Workspace
+
+$ #DefaultNameFormat
+# òÁÂÏÞÉÊ ÓÔÏÌ %d
diff --git a/nls/ru_RU/Workspacemenu.m b/nls/ru_RU/Workspacemenu.m
new file mode 100644
index 00000000..1b9b7770
--- /dev/null
+++ b/nls/ru_RU/Workspacemenu.m
@@ -0,0 +1,8 @@
+$set 12 #Workspacemenu
+
+$ #WorkspacesTitle
+# òÁÂÏÞÉÅ ÓÔÏÌÙ
+$ #NewWorkspace
+# îÏ×ÙÊ ÒÁÂÏÞÉÊ ÓÔÏÌ
+$ #RemoveLast
+# õÄÁÌÉÔØ ÐÏÓÌÅÄÎÉÊ
diff --git a/nls/ru_RU/blackbox.m b/nls/ru_RU/blackbox.m
new file mode 100644
index 00000000..134299f5
--- /dev/null
+++ b/nls/ru_RU/blackbox.m
@@ -0,0 +1,6 @@
+$set 13 #blackbox
+
+$ #NoManagableScreens
+# Blackbox::Blackbox: ÎÅ ÎÁÊÄÅÎÏ ÜËÒÁÎÏ× ÄÌÑ ÏÂÓÌÕÖÉ×ÁÎÉÑ, ÏÔÍÅÎÁ...\n
+$ #MapRequest
+# Blackbox::process_event: MapRequest for 0x%lx\n
diff --git a/nls/ru_RU/bsetroot.m b/nls/ru_RU/bsetroot.m
new file mode 100644
index 00000000..5a659802
--- /dev/null
+++ b/nls/ru_RU/bsetroot.m
@@ -0,0 +1,16 @@
+$set 16 #bsetroot
+
+$ #MustSpecify
+# %s: ÏÛÉÂËÁ: ÎÅÏÂÈÏÄÉÍÏ ÚÁÄÁÔØ ÏÄÉÎ ÉÚ ÓÌÅÄÕÀÝÉÈ ËÌÀÞÅÊ: -solid, -mod, -gradient\n
+$ #Usage
+# %s 2.0: (c) 1997-2000 Brad Hughes\n\n\
+  -display         ÓÏÅÄÉÎÅÎÉÅ Ó ÄÉÓÐÌÅÅÍ\n\
+  -mod               ÍÁËÅÔ ËÌÅÔËÉ\n\
+  -foreground, -fg  Ã×ÅÔ ÐÅÒÅÄÎÅÇÏ ÐÌÁÎÁ ËÌÅÔËÉ\n\
+  -background, -bg  Ã×ÅÔ ÆÏÎÁ ËÌÅÔËÉ\n\n\
+  -gradient       ÇÒÁÄÉÅÎÔ\n\
+  -from             ÎÁÞÁÌØÎÙÊ Ã×ÅÔ ÇÒÁÄÉÅÎÔÁ\n\
+  -to               ËÏÎÅÞÎÙÊ Ã×ÅÔ ÇÒÁÄÉÅÎÔÁ\n\n\
+  -solid            ÓÐÌÏÛÎÏÊ Ã×ÅÔ\n\n\
+  -help                    ×Ù×ÅÓÔÉ ÜÔÕ ÐÏÄÓËÁÚËÕ É ×ÙÊÔÉ\n
+
diff --git a/nls/ru_RU/common.m b/nls/ru_RU/common.m
new file mode 100644
index 00000000..e991e45d
--- /dev/null
+++ b/nls/ru_RU/common.m
@@ -0,0 +1,58 @@
+$set 15 #Common
+
+$ #Yes
+# äÁ
+$ #No
+# îÅÔ
+
+$ #DirectionTitle
+# îÁÐÒÁ×ÌÅÎÉÅ
+$ #DirectionHoriz
+# ðÏ ÇÏÒÉÚÏÎÔÁÌÉ
+$ #DirectionVert
+# ðÏ ×ÅÒÔÉËÁÌÉ
+
+$ #AlwaysOnTop
+# ÷ÓÅÇÄÁ ÎÁ×ÅÒÈÕ
+
+$ #PlacementTitle
+# íÅÓÔÏÐÏÌÏÖÅÎÉÅ
+$ #PlacementTopLeft
+# óÌÅ×Á ××ÅÒÈÕ
+$ #PlacementCenterLeft
+# óÌÅ×Á ÐÏ ÃÅÎÔÒÕ
+$ #PlacementBottomLeft
+# óÌÅ×Á ×ÎÉÚÕ
+$ #PlacementTopCenter
+# ó×ÅÒÈÕ ÐÏ ÃÅÎÔÒÕ
+$ #PlacementBottomCenter
+# óÎÉÚÕ ÐÏ ÃÅÎÔÒÕ
+$ #PlacementTopRight
+# óÐÒÁ×Á Ó×ÅÒÈÕ
+$ #PlacementCenterRight
+# óÐÒÁ×Á ÐÏ ÃÅÎÔÒÕ
+$ #PlacementBottomRight
+# óÐÒÁ×Á ×ÎÉÚÕ
+$ #PlacementLeftTop
+# Left Top
+$ #PlacementLeftCenter
+# Left Center
+$ #PlacementLeftBottom
+# Left Bottom
+$ #PlacementRightTop
+# Right Top
+$ #PlacementRightCenter
+# Right Center
+$ #PlacementRightBottom
+# Right Bottom
+$ #PlacementTopRelative
+# Top Relative
+$ #PlacementBottomRelative
+# Bottom Relative
+$ #PlacementLeftRelative
+# Left Relative
+$ #PlacementRightRelative
+# Right Relative
+
+$ #AutoHide
+# Auto hide
diff --git a/nls/ru_RU/main.m b/nls/ru_RU/main.m
new file mode 100644
index 00000000..d18ddb31
--- /dev/null
+++ b/nls/ru_RU/main.m
@@ -0,0 +1,21 @@
+$set 14 #main
+
+$ #RCRequiresArg
+# ÏÛÉÂËÁ: '-rc' ÔÒÅÂÕÅÔ ÎÁÌÉÞÉÅ ÁÒÇÕÍÅÎÔÁ\n
+$ #DISPLAYRequiresArg
+# ÏÛÉÂËÁ: '-display' ÔÒÅÂÕÅÔ ÎÁÌÉÞÉÅ ÁÒÇÕÍÅÎÔÁ\n
+$ #WarnDisplaySet
+# ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ: ÎÅ×ÏÚÍÏÖÎÏ ÕÓÔÁÎÏ×ÉÔØ ÐÅÒÅÍÅÎÎÕÀ ÏËÒÕÖÅÎÉÑ 'DISPLAY'\n
+$ #Usage
+# Fluxbox %s: (c) 2001 Henrik Kinnunen\n\n\
+  -display \t\tÉÓÐÏÌØÚÏ×ÁÔØ ÚÁÄÁÎÎÙÊ ÄÉÓÐÌÅÊ.\n\
+  -rc \t\t\tÉÓÐÏÌØÚÏ×ÁÔØ ÁÌØÔÅÒÎÁÔÉ×ÎÙÊ ÆÁÊÌ ÒÅÓÕÒÓÏ×.\n\
+  -version\t\t\t×Ù×ÅÓÔÉ ÎÏÍÅÒ ×ÅÒÓÉÉ É ×ÙÊÔÉ.\n\
+  -help\t\t\t\t×Ù×ÅÓÔÉ ÜÔÕ ÐÏÄÓËÁÚËÕ É ×ÙÊÔÉ.\n\n
+$ #CompileOptions
+# Compile time options:\n\
+  Debugging\t\t\t%s\n\
+  Interlacing:\t\t\t%s\n\
+  Shape:\t\t\t%s\n\
+  Slit:\t\t\t\t%s\n\
+  8bpp Ordered Dithering:\t%s\n\n
diff --git a/nls/sv_SE/BaseDisplay.m b/nls/sv_SE/BaseDisplay.m
new file mode 100644
index 00000000..9516b41b
--- /dev/null
+++ b/nls/sv_SE/BaseDisplay.m
@@ -0,0 +1,16 @@
+$set 1 #BaseDisplay
+
+$ #XError
+# %s:  X-fel: %s(%d) opkod %d/%d\n  resurs 0x%lx\n
+$ #SignalCaught
+# %s: signal %d fångad\n
+$ #ShuttingDown
+# stänger ner\n
+$ #Aborting
+# avbryter... dumpar kärna\n
+$ #XConnectFail
+# BaseDisplay::BaseDisplay: anslutning till X server misslyckades.\n
+$ #CloseOnExecFail
+# BaseDisplay::BaseDisplay: kunde inte markera skärmanslutning som stäng-vid-exekvering\n
+$ #BadWindowRemove
+# BaseDisplay::eventLoop(): tar bort dåligt fönster från händelsekön\n
diff --git a/nls/sv_SE/Basemenu.m b/nls/sv_SE/Basemenu.m
new file mode 100644
index 00000000..9d6d9424
--- /dev/null
+++ b/nls/sv_SE/Basemenu.m
@@ -0,0 +1,4 @@
+$set 2 #Basemenu
+
+$ #BlackboxMenu
+# Blackboxmeny
diff --git a/nls/sv_SE/Configmenu.m b/nls/sv_SE/Configmenu.m
new file mode 100644
index 00000000..2d2f4a2a
--- /dev/null
+++ b/nls/sv_SE/Configmenu.m
@@ -0,0 +1,48 @@
+$set 3 #Configmenu
+
+$ #ConfigOptions
+# Inställningar
+$ #FocusModel
+# Fokusmodell
+$ #WindowPlacement
+# Fönsterplacering
+$ #ImageDithering
+# Bilddithering
+$ #OpaqueMove
+# Ogenomskinlig fönsterförflyttning
+$ #FullMax
+# Full maximering
+$ #FocusNew
+# Fokus på nya fönster
+$ #FocusLast
+# Fokusera fönster vid skrivbordsbyte
+$ #ClickToFocus
+# Klicka för fokus
+$ #SloppyFocus
+# Hafsig fokus
+$ #AutoRaise
+# Höj automatiskt
+$ #SmartRows
+# Smart placering (Rader)
+$ #SmartCols
+# Smart placering (Kolumner)
+$ #Cascade
+# Kaskadplacering
+$ #LeftRight
+# Från vänster
+$ #RightLeft
+# Från höger
+$ #TopBottom
+# Uppifrån
+$ #BottomTop
+# Nerifrån
+$ #Tabs
+# Använd Flikar
+$ #Icons
+# Använd Ikoner
+$ #TabPlacement
+# Flik Placering
+$ #TabRotateVertical
+# Rotera Vertikala Flikar
+$ #SemiSloppyFocus
+# Halv hafsig fokus
diff --git a/nls/sv_SE/Icon.m b/nls/sv_SE/Icon.m
new file mode 100644
index 00000000..32b247e6
--- /dev/null
+++ b/nls/sv_SE/Icon.m
@@ -0,0 +1,4 @@
+$set 4 #Icon
+
+$ #Icons
+# Ikoner
diff --git a/nls/sv_SE/Image.m b/nls/sv_SE/Image.m
new file mode 100644
index 00000000..1099d50b
--- /dev/null
+++ b/nls/sv_SE/Image.m
@@ -0,0 +1,24 @@
+$set 5 #Image
+
+$ #ErrorCreatingSolidPixmap
+# BImage::render_solid: fel under skapande av pixmap\n
+$ #ErrorCreatingXImage
+# BImage::renderXImage: fel under skapande av XImage\n
+$ #UnsupVisual
+# BImage::renderXImage: ej stöd för färgdjup\n
+$ #ErrorCreatingPixmap
+# BImage::renderPixmap: fel under skapande av pixmap\n
+$ #InvalidColormapSize
+# BImageControl::BImageControl: ogiltig färgkarta storlek %d (%d/%d/%d) - reducerar\n
+$ #ErrorAllocatingColormap
+# BImageControl::BImageControl: fel under allokering av färgkarta\n
+$ #ColorAllocFail
+# BImageControl::BImageControl: misslyckades att allokera färg %d/%d/%d\n
+$ #PixmapRelease
+# BImageControl::~BImageControl: pixmap cache - släpper %d pixmappar\n
+$ #PixmapCacheLarge
+# BImageControl::renderImage: stor cache, tvingar upprensning\n
+$ #ColorParseError
+# BImageControl::getColor: färgfel: '%s'\n
+$ #ColorAllocError
+# BImageControl::getColor: färgallokeringsfel: '%s'\n
diff --git a/nls/sv_SE/Makefile.am b/nls/sv_SE/Makefile.am
new file mode 100644
index 00000000..b1706c34
--- /dev/null
+++ b/nls/sv_SE/Makefile.am
@@ -0,0 +1,30 @@
+# nls/sv_SE/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST=$(MFILES)
+
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/sv_SE"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/sv_SE; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/sv_SE; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/sv_SE/blackbox.cat; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/sv_SE; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
diff --git a/nls/sv_SE/Makefile.in b/nls/sv_SE/Makefile.in
new file mode 100644
index 00000000..ee2e99ce
--- /dev/null
+++ b/nls/sv_SE/Makefile.in
@@ -0,0 +1,221 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# nls/sv_SE/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+CXX = @CXX@
+DEBUG = @DEBUG@
+DLLTOOL = @DLLTOOL@
+GNOME = @GNOME@
+INTERLACE = @INTERLACE@
+KDE = @KDE@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+NEWWMSPEC = @NEWWMSPEC@
+NLS = @NLS@
+OBJDUMP = @OBJDUMP@
+ORDEREDPSEUDO = @ORDEREDPSEUDO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHAPE = @SHAPE@
+SLIT = @SLIT@
+TIMEDCACHE = @TIMEDCACHE@
+VERSION = @VERSION@
+gencat_cmd = @gencat_cmd@
+regex_cmd = @regex_cmd@
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST = $(MFILES)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps nls/sv_SE/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = nls/sv_SE
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-data-local
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-local
+uninstall: uninstall-am
+all-am: Makefile all-local
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+	-rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-local install-data-am install-data install-am install \
+uninstall-local uninstall-am uninstall all-local all-redirect all-am \
+all installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/sv_SE"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/sv_SE; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/sv_SE; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/sv_SE/blackbox.cat; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/sv_SE; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/nls/sv_SE/Screen.m b/nls/sv_SE/Screen.m
new file mode 100644
index 00000000..20cba274
--- /dev/null
+++ b/nls/sv_SE/Screen.m
@@ -0,0 +1,52 @@
+$set 6 #Screen
+
+$ #AnotherWMRunning
+# BScreen::BScreen: ett fel inträffade under en förfrågan till X servern.\n  \
+en annan fönsterhanterare körs redan på skärmen %s.\n
+$ #ManagingScreen
+# BScreen::BScreen: hanterar skärm %d med visuell 0x%lx, färgdjup %d\n
+$ #FontLoadFail
+# BScreen::LoadStyle(): kunde inte ladda font '%s'\n
+$ #DefaultFontLoadFail
+# BScreen::LoadStyle(): kunde inte ladda standardfont.\n
+$ #EmptyMenuFile
+# %s: tom menyfil\n
+$ #xterm
+# xterm
+$ #Restart
+# Starta om
+$ #Exit
+# Avsluta
+$ #EXECError
+# BScreen::parseMenuFile: [exec] fel, ingen menyetikett och/eller kommando definierat\n
+$ #EXITError
+# BScreen::parseMenuFile: [exit] fel, ingen menyetikett definierad\n
+$ #STYLEError
+# BScreen::parseMenuFile: [style] fel, ingen menyetikett och/eller filnamn definierat\n
+$ #CONFIGError
+# BScreen::parseMenuFile: [config] fel, ingen menyetikett definierad\n
+$ #INCLUDEError
+# BScreen::parseMenuFile: [include] fel, inget filnamn definierat\n
+$ #INCLUDEErrorReg
+# BScreen::parseMenuFile: [include] fel, '%s' är inte en vanlig fil\n
+$ #SUBMENUError
+# BScreen::parseMenuFile: [submenu] fel, ingen menyetikett definierad\n
+$ #RESTARTError
+# BScreen::parseMenuFile: [restart] fel, ingen menyetikett definiera\n
+$ #RECONFIGError
+# BScreen::parseMenuFile: [reconfig] fel, ingen menyetikett definierad\n
+$ #STYLESDIRError
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] fel, ingen katalog definierad\n
+$ #STYLESDIRErrorNotDir
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] fel, '%s' är inte en katalog\n
+$ #STYLESDIRErrorNoExist
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] fel, '%s' existerar inte\n
+$ #WORKSPACESError
+# BScreen::parseMenuFile: [workspaces] fel, ingen menyetikett definierad\n
+$ #PositionLength
+# 0: 0000 x 0: 0000
+$ #PositionFormat
+# X: %4d x Y: %4d
+$ #GeometryFormat
+# W: %4d x H: %4d
+
diff --git a/nls/sv_SE/Slit.m b/nls/sv_SE/Slit.m
new file mode 100644
index 00000000..807c13ff
--- /dev/null
+++ b/nls/sv_SE/Slit.m
@@ -0,0 +1,8 @@
+$set 7 #Slit
+
+$ #SlitTitle
+# Slit
+$ #SlitDirection
+# Slitriktning
+$ #SlitPlacement
+# Slitplacering
diff --git a/nls/sv_SE/Toolbar.m b/nls/sv_SE/Toolbar.m
new file mode 100644
index 00000000..341d8607
--- /dev/null
+++ b/nls/sv_SE/Toolbar.m
@@ -0,0 +1,22 @@
+$set 8 #Toolbar
+
+$ #NoStrftimeLength
+# 00:00000
+$ #NoStrftimeDateFormat
+# %02d/%02d/%02d
+$ #NoStrftimeDateFormatEu
+# %02d.%02d.%02d
+$ #NoStrftimeTimeFormat24
+#  %02d:%02d 
+$ #NoStrftimeTimeFormat12
+# %02d:%02d %sm
+$ #NoStrftimeTimeFormatP
+# p
+$ #NoStrftimeTimeFormatA
+# a
+$ #ToolbarTitle
+# Verktygslist
+$ #EditWkspcName
+# Ändra namn på skrivbordet
+$ #ToolbarPlacement
+# Verktygslistens placering
diff --git a/nls/sv_SE/Window.m b/nls/sv_SE/Window.m
new file mode 100644
index 00000000..eb64b8a6
--- /dev/null
+++ b/nls/sv_SE/Window.m
@@ -0,0 +1,17 @@
+$set 9 #Window
+
+
+$ #Creating
+# BlackboxWindow::BlackboxWindow: skapar 0x%lx\n
+$ #XGetWindowAttributesFail
+# BlackboxWindow::BlackboxWindow: XGetWindowAttributes misslyckades\n
+$ #CannotFindScreen
+# BlackboxWindow::BlackboxWindow: kan inte hitta skärm för rootfönster 0x%lx\n
+$ #Unnamed
+# Inget namn
+$ #MapRequest
+# BlackboxWindow::mapRequestEvent() för 0x%lx\n
+$ #UnmapNotify
+# BlackboxWindow::unmapNotifyEvent() för 0x%lx\n
+$ #UnmapNotifyReparent
+# BlackboxWindow::unmapnotifyEvent: återför 0x%lx till root\n
diff --git a/nls/sv_SE/Windowmenu.m b/nls/sv_SE/Windowmenu.m
new file mode 100644
index 00000000..25e61b43
--- /dev/null
+++ b/nls/sv_SE/Windowmenu.m
@@ -0,0 +1,22 @@
+$set 10 #Windowmenu
+
+$ #SendTo
+# Skicka till...
+$ #SendGroupTo
+# Skicka grupp till...
+$ #Shade
+# Skugga
+$ #Iconify
+# Ikonifiera
+$ #Maximize
+# Maximera
+$ #Raise
+# Höj
+$ #Lower
+# Sänk
+$ #Stick
+# Klibbig
+$ #KillClient
+# Döda klient
+$ #Close
+# Stäng
diff --git a/nls/sv_SE/Workspace.m b/nls/sv_SE/Workspace.m
new file mode 100644
index 00000000..bc40d71d
--- /dev/null
+++ b/nls/sv_SE/Workspace.m
@@ -0,0 +1,4 @@
+$set 11 #Workspace
+
+$ #DefaultNameFormat
+# Skrivbord %d
diff --git a/nls/sv_SE/Workspacemenu.m b/nls/sv_SE/Workspacemenu.m
new file mode 100644
index 00000000..544c91aa
--- /dev/null
+++ b/nls/sv_SE/Workspacemenu.m
@@ -0,0 +1,8 @@
+$set 12 #Workspacemenu
+
+$ #WorkspacesTitle
+# Skrivbord
+$ #NewWorkspace
+# Nytt skrivbord
+$ #RemoveLast
+# Ta bort sista
diff --git a/nls/sv_SE/blackbox.m b/nls/sv_SE/blackbox.m
new file mode 100644
index 00000000..846d7be3
--- /dev/null
+++ b/nls/sv_SE/blackbox.m
@@ -0,0 +1,6 @@
+$set 13 #blackbox
+
+$ #NoManagableScreens
+# Blackbox::Blackbox: inga hanterbara skärmar hittades, avslutar\n
+$ #MapRequest
+# Blackbox::process_event: MapRequest för 0x%lx\n
diff --git a/nls/sv_SE/bsetroot.m b/nls/sv_SE/bsetroot.m
new file mode 100644
index 00000000..3ed67be9
--- /dev/null
+++ b/nls/sv_SE/bsetroot.m
@@ -0,0 +1,16 @@
+$set 16 #bsetroot
+
+$ #MustSpecify
+# %s: fel: måste specifiera en av: -solid, -mod, -gradient\n
+$ #Usage
+# %s 2.0: (c) 1997-2000 Brad Hughes\n\n\
+  -display         skärmanslutning\n\
+  -mod               modulamönster\n\
+  -foreground, -fg  förgrundsfärg för modulamönster\n\
+  -background, -bg  bakgrundsfärg för modulamönster\n\n\
+  -gradient       texturlutning\n\
+  -from             startfärg\n\
+  -to               slutfärg\n\n\
+  -solid            solid färg\n\n\
+  -help                    visa denna hjälptext och avsluta\n
+
diff --git a/nls/sv_SE/common.m b/nls/sv_SE/common.m
new file mode 100644
index 00000000..c7bca45b
--- /dev/null
+++ b/nls/sv_SE/common.m
@@ -0,0 +1,58 @@
+$set 15 #Common
+
+$ #Yes
+# Ja
+$ #No
+# Nej
+
+$ #DirectionTitle
+# Riktning
+$ #DirectionHoriz
+# Horisontell
+$ #DirectionVert
+# Vertikal
+
+$ #AlwaysOnTop
+# Alltid överst
+
+$ #PlacementTitle
+# Placering
+$ #PlacementTopLeft
+# Uppe till vänster
+$ #PlacementCenterLeft
+# Mitten till vänster
+$ #PlacementBottomLeft
+# Nere till vänster
+$ #PlacementTopCenter
+# Uppe i mitten
+$ #PlacementBottomCenter
+# Nere i mitten
+$ #PlacementTopRight
+# Uppe till höger
+$ #PlacementCenterRight
+# Mitten till höger
+$ #PlacementBottomRight
+# Nere till höger
+$ #PlacementLeftTop
+# Till vänster uppe
+$ #PlacementLeftCenter
+# Till vänster i mitten
+$ #PlacementLeftBottom
+# Till vänster nere
+$ #PlacementRightTop
+# Till höger uppe
+$ #PlacementRightCenter
+# Till höger i mitten
+$ #PlacementRightBottom
+# Till höger nere
+$ #PlacementTopRelative
+# Utdragen uppe
+$ #PlacementBottomRelative
+# Utdragen nere
+$ #PlacementLeftRelative
+# Till vänster utdragen
+$ #PlacementRightRelative
+# Till höger utdragen
+
+$ #AutoHide
+# Göm automatiskt
diff --git a/nls/sv_SE/main.m b/nls/sv_SE/main.m
new file mode 100644
index 00000000..2a50c610
--- /dev/null
+++ b/nls/sv_SE/main.m
@@ -0,0 +1,21 @@
+$set 14 #main
+
+$ #RCRequiresArg
+# fel: '-rc' kräver ett argument\n
+$ #DISPLAYRequiresArg
+# fel: '-display' kräver ett argument\n
+$ #WarnDisplaySet
+# varning: kunde inte sätta variabeln 'DISPLAY'\n
+$ #Usage
+# Fluxbox %s: (c) 2001 Henrik Kinnunen\n\n\
+  -display \t\tanvänd skärmanslutning.\n\
+  -rc \t\t\tanvänd alternativ resursfil.\n\
+  -version\t\t\tvisa version och avsluta.\n\
+  -help\t\t\t\tvisa denna hjälptext och avsluta.\n\n
+$ #CompileOptions
+# Kompilerad med:\n\
+  Avlusning\t\t\t%s\n\
+  Interlacing:\t\t\t%s\n\
+  Form:\t\t\t\t%s\n\
+  Slit:\t\t\t\t%s\n\
+  8bpp ordnad dithering:\t%s\n\n
diff --git a/nls/tr_TR/BaseDisplay.m b/nls/tr_TR/BaseDisplay.m
new file mode 100644
index 00000000..8a307066
--- /dev/null
+++ b/nls/tr_TR/BaseDisplay.m
@@ -0,0 +1,16 @@
+$set 1 #BaseDisplay
+
+$ #XError
+# %s : X hatasý : %s ( %d ) opkodlar %d/%d\n  kaynak 0x%lx\n
+$ #SignalCaught
+# %s : %d sinyali alýndý \n
+$ #ShuttingDown
+# kapatýlýyorum\n
+$ #Aborting
+# kapatýlýyorum ... çöküntüyü býrakýyorum\n
+$ #XConnectFail
+# BaseDisplay::BaseDisplay : X sunucusuna baðlanýlýnamadý .\n
+$ #CloseOnExecFail
+# BaseDisplay::BaseDisplay : çalýþtýrýrken kapatmada ekrana baðlanýlýnamadý \n
+$ #BadWindowRemove
+# BaseDisplay::eventLoop() : eylem kuyruðundaki 'kötü' pencereyi siliyorum \n
diff --git a/nls/tr_TR/Basemenu.m b/nls/tr_TR/Basemenu.m
new file mode 100644
index 00000000..7ab8decb
--- /dev/null
+++ b/nls/tr_TR/Basemenu.m
@@ -0,0 +1,4 @@
+$set 2 #Basemenu
+
+$ #BlackboxMenu
+# Blackbox mönüsü
diff --git a/nls/tr_TR/Configmenu.m b/nls/tr_TR/Configmenu.m
new file mode 100644
index 00000000..cab451e6
--- /dev/null
+++ b/nls/tr_TR/Configmenu.m
@@ -0,0 +1,48 @@
+$set 3 #Configmenu
+
+$ #ConfigOptions
+# Ayarlar
+$ #FocusModel
+# Foküsleme
+$ #WindowPlacement
+# Pencere yerleþimi
+$ #ImageDithering
+# Resim oluþturmasý
+$ #OpaqueMove
+# Ekraný içerikli taþý
+$ #FullMax
+# Tam ekranla, vallahi
+$ #FocusNew
+# Yeni pencereleri foküsle
+$ #FocusLast
+# Masaüstündeki son pencereyi foküsle
+$ #ClickToFocus
+# Týklayarak foküsle
+$ #SloppyFocus
+# Aðýr foküsle
+$ #AutoRaise
+# Otomatikman yükselt
+$ #SmartRows
+# Akýllý yerleþim( Sýralar )
+$ #SmartCols
+# Akýllý yerleþim( Sütunlar )
+$ #Cascade
+# Cascade Placement
+$ #LeftRight
+# Soldan saða
+$ #RightLeft
+# Saðdan sola
+$ #TopBottom
+# Üstten aþaða
+$ #BottomTop
+# Alttan üste
+$ #Tabs
+# Use Tabs
+$ #Icons
+# Use Icons
+$ #TabPlacement
+# Tab Placement
+$ #TabRotateVertical
+# Rotate Vertical Tabs
+$ #SemiSloppyFocus
+# Semi Sloppy Focus
diff --git a/nls/tr_TR/Icon.m b/nls/tr_TR/Icon.m
new file mode 100644
index 00000000..74a344d1
--- /dev/null
+++ b/nls/tr_TR/Icon.m
@@ -0,0 +1,4 @@
+$set 4 #Icon
+
+$ #Icons
+# Ikonalar
diff --git a/nls/tr_TR/Image.m b/nls/tr_TR/Image.m
new file mode 100644
index 00000000..30a46f57
--- /dev/null
+++ b/nls/tr_TR/Image.m
@@ -0,0 +1,24 @@
+$set 5 #Image
+
+$ #ErrorCreatingSolidPixmap
+# BImage::render_solid : resmi yaratamadým\n
+$ #ErrorCreatingXImage
+# BImage::renderXImage : XImage'i yaratamadým\n
+$ #UnsupVisual
+# BImage::renderXImage : desteklenmeyen görünüþ( renk derinliði )\n
+$ #ErrorCreatingPixmap
+# BImage::renderPixmap : resmi yaratamadým\n
+$ #InvalidColormapSize
+# BImageControl::BImageControl : geçersiz renk haritasý büyüklüðü %d (%d/%d/%d) - azaltýyorum\n
+$ #ErrorAllocatingColormap
+# BImageControl::BImageControl : renk haritasý ayrýlanamadý\n
+$ #ColorAllocFail
+# BImageControl::BImageControl : rengi ayrýrken hata oldu : %d/%d/%d\n
+$ #PixmapRelease
+# BImageControl::~BImageControl : resim arabelleði - %d resim temizlendi\n
+$ #PixmapCacheLarge
+# BImageControl::renderImage : arabellek büyük, temizlemeye baþlýyorum\n
+$ #ColorParseError
+# BImageControl::getColor : renk tarama hatasý : '%s'\n
+$ #ColorAllocError
+# BImageControl::getColor : renk ayýrma hatasý : '%s'\n
diff --git a/nls/tr_TR/Makefile.am b/nls/tr_TR/Makefile.am
new file mode 100644
index 00000000..d6e34cb9
--- /dev/null
+++ b/nls/tr_TR/Makefile.am
@@ -0,0 +1,34 @@
+# nls/tr_TR/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+# 
+# -- Türkce tercüme dizini için bir yapim-dosya-tabaný
+# 	kabalak -- kabalak@gmx.net
+#
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST=$(MFILES)
+
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/tr_TR"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/tr_TR; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/tr_TR; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/tr_TR/blackbox.cat; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/tr_TR; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
diff --git a/nls/tr_TR/Makefile.in b/nls/tr_TR/Makefile.in
new file mode 100644
index 00000000..e6eac755
--- /dev/null
+++ b/nls/tr_TR/Makefile.in
@@ -0,0 +1,225 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# nls/tr_TR/Makefile.am for Blackbox-0.61.x - an X11 Window Manager
+# 
+# -- Türkce tercüme dizini için bir yapim-dosya-tabaný
+# 	kabalak -- kabalak@gmx.net
+#
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+CXX = @CXX@
+DEBUG = @DEBUG@
+DLLTOOL = @DLLTOOL@
+GNOME = @GNOME@
+INTERLACE = @INTERLACE@
+KDE = @KDE@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+NEWWMSPEC = @NEWWMSPEC@
+NLS = @NLS@
+OBJDUMP = @OBJDUMP@
+ORDEREDPSEUDO = @ORDEREDPSEUDO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHAPE = @SHAPE@
+SLIT = @SLIT@
+TIMEDCACHE = @TIMEDCACHE@
+VERSION = @VERSION@
+gencat_cmd = @gencat_cmd@
+regex_cmd = @regex_cmd@
+
+NLSTEST = @NLS@
+CLEANFILES = blackbox.cat
+MAINTAINERCLEANFILES = Makefile.in Translation.m
+MFILES = BaseDisplay.m Basemenu.m Configmenu.m Icon.m Image.m Screen.m Slit.m Toolbar.m Window.m Windowmenu.m Workspace.m Workspacemenu.m blackbox.m common.m main.m bsetroot.m
+EXTRA_DIST = $(MFILES)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps nls/tr_TR/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = nls/tr_TR
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-data-local
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-local
+uninstall: uninstall-am
+all-am: Makefile all-local
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+	-rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-local install-data-am install-data install-am install \
+uninstall-local uninstall-am uninstall all-local all-redirect all-am \
+all installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+all-local: blackbox.cat
+install-data-local: blackbox.cat
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		echo "Installing catalog in $(DESTDIR)$(pkgdatadir)/nls/tr_TR"; \
+		$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/nls/tr_TR; \
+		$(INSTALL_DATA) blackbox.cat $(DESTDIR)$(pkgdatadir)/nls/tr_TR; \
+	fi
+uninstall-local:
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		rm -f $(DESTDIR)$(pkgdatadir)/nls/tr_TR/blackbox.cat; \
+		rmdir $(DESTDIR)$(pkgdatadir)/nls/tr_TR; \
+	fi
+
+Translation.m: $(MFILES)
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		awk -f ../convert.awk output=Translation.m $(MFILES); \
+	fi
+
+blackbox.cat: Translation.m
+	@if test x$(NLSTEST) = "x-DNLS"; then \
+		$(gencat_cmd) blackbox.cat Translation.m; \
+	fi
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/nls/tr_TR/Screen.m b/nls/tr_TR/Screen.m
new file mode 100644
index 00000000..54d3cf57
--- /dev/null
+++ b/nls/tr_TR/Screen.m
@@ -0,0 +1,52 @@
+$set 6 #Screen
+
+$ #AnotherWMRunning
+# BScreen::BScreen : X sunucusunu sorgularken hata oldu.\n  \
+%s ekranýnda baþka bir pencere yöneticisi çalýþýyor gibi.\n
+$ #ManagingScreen
+# BScreen::BScreen : %d ekraný, 0x%lx görünümüyle , %d derinliðiyle\n
+$ #FontLoadFail
+# BScreen::LoadStyle() : '%s' yazý tipi yüklenemedi.\n
+$ #DefaultFontLoadFail
+# BScreen::LoadStyle(): önayarlý yazý tipi yüklenemedi.\n
+$ #EmptyMenuFile
+# %s : boþ mönü dosyasý\n
+$ #xterm
+# X komutasý
+$ #Restart
+# Yeniden baþla
+$ #Exit
+# Çýk
+$ #EXECError
+# BScreen::parseMenuFile : [exec] hatasý, mönü yaftasý ve/yada komuta belirlenmedi\n
+$ #EXITError
+# BScreen::parseMenuFile : [exit] hatasý, mönü yaftasý belirlenmedi\n
+$ #STYLEError
+# BScreen::parseMenuFile : [style] hatasý, mönü yaftasý ve/yada dosya adý belirlenmedi\n
+$ #CONFIGError
+# BScreen::parseMenuFile: [config] hatasý, mönü yaftasý belirlenmedi\n
+$ #INCLUDEError
+# BScreen::parseMenuFile: [include] hatasý, dosya adý belirlenmedi\n
+$ #INCLUDEErrorReg
+# BScreen::parseMenuFile: [include] hatasý, '%s' vasat bir dosya deðil\n
+$ #SUBMENUError
+# BScreen::parseMenuFile: [submenu] hatasý, mönü yaftasý belirlenmedi\n
+$ #RESTARTError
+# BScreen::parseMenuFile: [restart] hatasý, mönü yaftasý belirlenmedi\n
+$ #RECONFIGError
+# BScreen::parseMenuFile: [reconfig] hatasý, mönü yaftasý belirlenmedi\n
+$ #STYLESDIRError
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] hatasý, dizin adý belirlenmedi\n
+$ #STYLESDIRErrorNotDir
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] hatasý, '%s' bir dizin \
+deðildir\n
+$ #STYLESDIRErrorNoExist
+# BScreen::parseMenuFile: [stylesdir/stylesmenu] hatasý, '%s' var deðil\n
+$ #WORKSPACESError
+# BScreen::parseMenuFile: [workspaces] hatasý, mönü yaftasý belirlenmedi\n
+$ #PositionLength
+# 0: 0000 x 0: 0000
+$ #PositionFormat
+# X: %4d x Y: %4d
+$ #GeometryFormat
+# Y: %4d x E: %4d
diff --git a/nls/tr_TR/Slit.m b/nls/tr_TR/Slit.m
new file mode 100644
index 00000000..454086aa
--- /dev/null
+++ b/nls/tr_TR/Slit.m
@@ -0,0 +1,8 @@
+$set 7 #Slit
+
+$ #SlitTitle
+# Slit
+$ #SlitDirection
+# Slit yönü
+$ #SlitPlacement
+# Slit yerleþimi
diff --git a/nls/tr_TR/Toolbar.m b/nls/tr_TR/Toolbar.m
new file mode 100644
index 00000000..41bd6e7c
--- /dev/null
+++ b/nls/tr_TR/Toolbar.m
@@ -0,0 +1,22 @@
+$set 8 #Toolbar
+
+$ #NoStrftimeLength
+# 00:00000
+$ #NoStrftimeDateFormat
+# %02d/%02d/%02d
+$ #NoStrftimeDateFormatEu
+# %02d.%02d.%02d
+$ #NoStrftimeTimeFormat24
+#  %02d:%02d 
+$ #NoStrftimeTimeFormat12
+# %02d:%02d %sm
+$ #NoStrftimeTimeFormatP
+# p
+$ #NoStrftimeTimeFormatA
+# a
+$ #ToolbarTitle
+# Blackbox çubuðu
+$ #EditWkspcName
+# Geçerli masaüstü ismini deðiþtir
+$ #ToolbarPlacement
+# Blackbox çubuðunun yerleþimi
diff --git a/nls/tr_TR/Window.m b/nls/tr_TR/Window.m
new file mode 100644
index 00000000..e2e7acdb
--- /dev/null
+++ b/nls/tr_TR/Window.m
@@ -0,0 +1,17 @@
+$set 9 #Window
+
+
+$ #Creating
+# BlackboxWindow::BlackboxWindow : 0x%lx'i yarat#_yorum\n
+$ #XGetWindowAttributesFail
+# BlackboxWindow::BlackboxWindow : XGetWindowAttributres baþarýsýz oldu\n
+$ #CannotFindScreen
+# BlackboxWindow::BlackboxWindow : 0x%lx ana penceresi için ekraný belirleyemedim\n
+$ #Unnamed
+# Isimsiz
+$ #MapRequest
+# 0x%lx için BlackboxWindow::mapRequestEvent()\n
+$ #UnmapNotify
+# 0x%lx için BlackboxWindow::unmapNotifyEvent()\n
+$ #UnmapNotifyReparent
+# BlackboxWindow::unmapnotifyEvent: 0x%lx'i ana pencereyi boya\n
diff --git a/nls/tr_TR/Windowmenu.m b/nls/tr_TR/Windowmenu.m
new file mode 100644
index 00000000..c8b384c3
--- /dev/null
+++ b/nls/tr_TR/Windowmenu.m
@@ -0,0 +1,20 @@
+$set 10 #Windowmenu
+
+$ #SendTo
+# Gönder ...
+$ #Shade
+# Topla
+$ #Iconify
+# Ikonalaþtýr
+$ #Maximize
+# Azamileþtir
+$ #Raise
+# Alçalt
+$ #Lower
+# Yükselt
+$ #Stick
+# Yapýþýk
+$ #KillClient
+# Öldür
+$ #Close
+# Kapat
diff --git a/nls/tr_TR/Workspace.m b/nls/tr_TR/Workspace.m
new file mode 100644
index 00000000..3025f1bb
--- /dev/null
+++ b/nls/tr_TR/Workspace.m
@@ -0,0 +1,4 @@
+$set 11 #Workspace
+
+$ #DefaultNameFormat
+# Masaüstü %d
diff --git a/nls/tr_TR/Workspacemenu.m b/nls/tr_TR/Workspacemenu.m
new file mode 100644
index 00000000..93c98454
--- /dev/null
+++ b/nls/tr_TR/Workspacemenu.m
@@ -0,0 +1,8 @@
+$set 12 #Workspacemenu
+
+$ #WorkspacesTitle
+# Masaüstleri
+$ #NewWorkspace
+# Yeni bir masaüstü
+$ #RemoveLast
+# Son masaüstünü sil
diff --git a/nls/tr_TR/blackbox.m b/nls/tr_TR/blackbox.m
new file mode 100644
index 00000000..d8dc1043
--- /dev/null
+++ b/nls/tr_TR/blackbox.m
@@ -0,0 +1,6 @@
+$set 13 #blackbox
+
+$ #NoManagableScreens
+# Blackbox::Blackbox: yönetebilinen ekran bulunamadý, bitiriliyorum\n
+$ #MapRequest
+# Blackbox::process_event: 0x%lx için MapRequest\n
diff --git a/nls/tr_TR/bsetroot.m b/nls/tr_TR/bsetroot.m
new file mode 100644
index 00000000..bdfe020d
--- /dev/null
+++ b/nls/tr_TR/bsetroot.m
@@ -0,0 +1,16 @@
+$set 16 #bsetroot
+
+$ #MustSpecify
+# %s : hata : -solid, -mod yada -gradient'den birisini belirlemek zorundasýn\n
+$ #Usage
+# %s 2.0 : Tel'if hakký (c) 1997-2000 Brad Hughes\n\n\
+  -display          ekran belirlemesi\n\
+  -mod               bölüþüm iþlemi\n\
+  -foreground, -fg   bölüþüm önalaný\n\
+  -background, -bg   bölüþüm ardalaný\n\n\
+  -gradient        geçiþim kaplamý\n\
+  -from              geçiþim baþlama rengi\n\
+  -to                geçiþim bitiþ rengi\n\n\
+  -solid             tek renk\n\n\
+  -help                    bu yardým iletisini göster ve çýk\n
+
diff --git a/nls/tr_TR/common.m b/nls/tr_TR/common.m
new file mode 100644
index 00000000..799e6581
--- /dev/null
+++ b/nls/tr_TR/common.m
@@ -0,0 +1,58 @@
+$set 15 #Common
+
+$ #Yes
+# Evet
+$ #No
+# Hayýr
+
+$ #DirectionTitle
+# Yön
+$ #DirectionHoriz
+# Ufki
+$ #DirectionVert
+# Dikey
+
+$ #AlwaysOnTop
+# Her zaman üstte
+
+$ #PlacementTitle
+# Yerleþim
+$ #PlacementTopLeft
+# Sol üst
+$ #PlacementCenterLeft
+# Sol orta 
+$ #PlacementBottomLeft
+# Sol alt
+$ #PlacementTopCenter
+# Üst orta
+$ #PlacementBottomCenter
+# Alt orta
+$ #PlacementTopRight
+# Sað üst
+$ #PlacementCenterRight
+# Sað orta
+$ #PlacementBottomRight
+# Sað üst
+$ #PlacementLeftTop
+# Left Top
+$ #PlacementLeftCenter
+# Left Center
+$ #PlacementLeftBottom
+# Left Bottom
+$ #PlacementRightTop
+# Right Top
+$ #PlacementRightCenter
+# Right Center
+$ #PlacementRightBottom
+# Right Bottom
+$ #PlacementTopRelative
+# Top Relative
+$ #PlacementBottomRelative
+# Bottom Relative
+$ #PlacementLeftRelative
+# Left Relative
+$ #PlacementRightRelative
+# Right Relative
+
+$ #AutoHide
+# Auto hide
diff --git a/nls/tr_TR/main.m b/nls/tr_TR/main.m
new file mode 100644
index 00000000..8172c47b
--- /dev/null
+++ b/nls/tr_TR/main.m
@@ -0,0 +1,21 @@
+$set 14 #main
+
+$ #RCRequiresArg
+# hata : '-rc' bir argüman bekler\n
+$ #DISPLAYRequiresArg
+# hata : '-display' bir argüman bekler\n
+$ #WarnDisplaySet
+# ikaz : 'DISPLAY' verisini oturtamadým\n
+$ #Usage
+# Fluxbox %s: (c) 2001 Henrik Kinnunen\n\n\
+  -display \t\tekraný kullan.\n\
+  -rc \t\t\tbaþka bir ayarlama dosyasýný kullan.\n\
+  -version\t\t\tnesil bilgisini gösterir ve çýkar.\n\
+  -help\t\t\t\tbu yardým iletisini gösterir ve çýkar.\n\n
+$ #CompileOptions
+# Denetleme seçenekleri :\n\
+  Bilgilendirme\t\t\t%s\n\
+  Týzlama:\t\t\t%s\n\
+  Gölgeleme:\t\t\t%s\n\
+  Slit:\t\t\t\t%s\n\
+  R8b'e göre týzla:\t%s\n\n
diff --git a/src/BaseDisplay.cc b/src/BaseDisplay.cc
new file mode 100644
index 00000000..c91bb01e
--- /dev/null
+++ b/src/BaseDisplay.cc
@@ -0,0 +1,612 @@
+// BaseDisplay.cc for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+//
+// Changes for Fluxbox made by Henrik Kinnunen (fluxgen@linuxmail.org)
+//
+
+// stupid macros needed to access some functions in version 2 of the GNU C
+// library
+#ifndef   _GNU_SOURCE
+#define   _GNU_SOURCE
+#endif // _GNU_SOURCE
+
+#ifdef    HAVE_CONFIG_H
+#  include "../config.h"
+#endif // HAVE_CONFIG_H
+
+#include 
+#include 
+#include 
+#include 
+
+#ifdef    SHAPE
+#  include 
+#endif // SHAPE
+
+#include "i18n.hh"
+#include "BaseDisplay.hh"
+#include "LinkedList.hh"
+#include "Timer.hh"
+
+#ifdef    HAVE_FCNTL_H
+#  include 
+#endif // HAVE_FCNTL_H
+
+#ifdef    HAVE_STDIO_H
+#  include 
+#endif // HAVE_STDIO_H
+
+#ifdef    STDC_HEADERS
+#  include 
+#  include 
+#endif // STDC_HEADERS
+
+#ifdef    HAVE_UNISTD_H
+#  include 
+#  include 
+#endif // HAVE_UNISTD_H
+
+#ifdef    HAVE_SYS_SELECT_H
+#  include 
+#endif // HAVE_SYS_SELECT_H
+
+#ifdef    HAVE_SIGNAL_H
+#  include 
+#endif // HAVE_SIGNAL_H
+
+#ifndef   SA_NODEFER
+#  ifdef   SA_INTERRUPT
+#    define SA_NODEFER SA_INTERRUPT
+#  else // !SA_INTERRUPT
+#    define SA_NODEFER (0)
+#  endif // SA_INTERRUPT
+#endif // SA_NODEFER
+
+#ifdef    HAVE_SYS_WAIT_H
+#  include 
+#  include 
+#endif // HAVE_SYS_WAIT_H
+
+#if defined(HAVE_PROCESS_H) && defined(__EMX__)
+#  include 
+#endif //   HAVE_PROCESS_H             __EMX__
+
+
+// X error handler to handle any and all X errors while the application is
+// running
+static Bool internal_error = False;
+static Window last_bad_window = None;
+
+BaseDisplay *base_display;
+
+#ifdef    DEBUG
+static int handleXErrors(Display *d, XErrorEvent *e) {
+  char errtxt[128];
+	
+  XGetErrorText(d, e->error_code, errtxt, 128);
+  fprintf(stderr,
+	  I18n::instance()->
+	  getMessage(
+#ifdef    NLS
+		     BaseDisplaySet, BaseDisplayXError,
+#else // !NLS
+		     0, 0,
+#endif // NLS
+		     "%s:  X error: %s(%d) opcodes %d/%d\n  resource 0x%lx\n"),
+          base_display->getApplicationName(), errtxt, e->error_code,
+          e->request_code, e->minor_code, e->resourceid);
+#else // !DEBUG
+static int handleXErrors(Display *, XErrorEvent *e) {
+#endif // DEBUG
+
+  if (e->error_code == BadWindow)
+		last_bad_window = e->resourceid;
+
+	if (internal_error)
+		abort();
+
+  return(False);
+}
+
+
+// signal handler to allow for proper and gentle shutdown
+
+#ifndef   HAVE_SIGACTION
+static RETSIGTYPE signalhandler(int sig) {
+#else //  HAVE_SIGACTION
+static void signalhandler(int sig) {
+#endif // HAVE_SIGACTION
+	I18n *i18n = I18n::instance();
+  static int re_enter = 0;
+
+  switch (sig) {
+  case SIGCHLD:
+    int status;
+    waitpid(-1, &status, WNOHANG | WUNTRACED);
+
+#ifndef   HAVE_SIGACTION
+    // assume broken, braindead sysv signal semantics
+    signal(SIGCHLD, (RETSIGTYPE (*)(int)) signalhandler);
+#endif // HAVE_SIGACTION
+
+    break;
+
+  default:
+    if (base_display->handleSignal(sig)) {
+
+#ifndef   HAVE_SIGACTION
+      // assume broken, braindead sysv signal semantics
+      signal(sig, (RETSIGTYPE (*)(int)) signalhandler);
+#endif // HAVE_SIGACTION
+
+      return;
+    }
+
+    fprintf(stderr,
+	    i18n->getMessage(
+#ifdef    NLS
+			     BaseDisplaySet, BaseDisplaySignalCaught,
+#else // !NLS
+			     0, 0,
+#endif // NLS
+			     "%s:  signal %d caught\n"),
+	    base_display->getApplicationName(), sig);
+
+    if (! base_display->isStartup() && ! re_enter) {
+      internal_error = True;
+
+      re_enter = 1;
+      fprintf(stderr,
+	      i18n->getMessage(
+#ifdef    NLS
+			       BaseDisplaySet, BaseDisplayShuttingDown,
+#else // !NLS
+			       0, 0,
+#endif // NLS
+			       "shutting down\n"));
+      base_display->shutdown();
+    }
+
+    if (sig != SIGTERM && sig != SIGINT) {
+      fprintf(stderr,
+	      i18n->getMessage(
+#ifdef    NLS
+			       BaseDisplaySet, BaseDisplayAborting,
+#else // !NLS
+			       0, 0,
+#endif // NLS
+			       "aborting... dumping core\n"));
+      abort();
+    }
+
+    exit(0);
+
+    break;
+  }
+}
+
+
+// convenience functions
+#ifndef    __EMX__
+void bexec(const char *command, char* displaystring) {
+  if (! fork()) {
+    setsid();
+    putenv(displaystring);
+    execl("/bin/sh", "/bin/sh", "-c", command, NULL);
+    exit(0);
+  }
+}
+#endif // !__EMX__
+
+
+char *bstrdup(const char *s) {
+  int l = strlen(s) + 1;
+  char *n = new char[l];
+  strncpy(n, s, l);
+  return n;
+}
+
+
+BaseDisplay::BaseDisplay(char *app_name, char *dpy_name) {
+	application_name = app_name;
+
+	_startup = True;
+	_shutdown = False;
+	server_grabs = 0;
+	last_bad_window = None;
+	I18n *i18n = I18n::instance();
+	::base_display = this;
+
+#ifdef    HAVE_SIGACTION
+	struct sigaction action;
+
+	action.sa_handler = signalhandler;
+	action.sa_mask = sigset_t();
+	action.sa_flags = SA_NOCLDSTOP | SA_NODEFER;
+
+	sigaction(SIGSEGV, &action, NULL);
+	sigaction(SIGFPE, &action, NULL);
+	sigaction(SIGTERM, &action, NULL);
+	sigaction(SIGINT, &action, NULL);
+	sigaction(SIGCHLD, &action, NULL);
+	sigaction(SIGHUP, &action, NULL);
+	sigaction(SIGUSR1, &action, NULL);
+	sigaction(SIGUSR2, &action, NULL);
+#else // !HAVE_SIGACTION
+	signal(SIGSEGV, (RETSIGTYPE (*)(int)) signalhandler);
+	signal(SIGFPE, (RETSIGTYPE (*)(int)) signalhandler);
+	signal(SIGTERM, (RETSIGTYPE (*)(int)) signalhandler);
+	signal(SIGINT, (RETSIGTYPE (*)(int)) signalhandler);
+	signal(SIGUSR1, (RETSIGTYPE (*)(int)) signalhandler);
+	signal(SIGUSR2, (RETSIGTYPE (*)(int)) signalhandler);
+	signal(SIGHUP, (RETSIGTYPE (*)(int)) signalhandler);
+	signal(SIGCHLD, (RETSIGTYPE (*)(int)) signalhandler);
+#endif // HAVE_SIGACTION
+
+	if (! (display = XOpenDisplay(dpy_name))) {
+		fprintf(stderr,
+				i18n->
+			getMessage(
+#ifdef    NLS
+				BaseDisplaySet, BaseDisplayXConnectFail,
+#else // !NLS
+					0, 0,
+#endif // NLS
+					"BaseDisplay::BaseDisplay: connection to X server failed.\n"));
+		throw static_cast(2); //throw error 2
+  } else if (fcntl(ConnectionNumber(display), F_SETFD, 1) == -1) {
+		fprintf(stderr,
+			i18n->
+				getMessage(
+#ifdef    NLS
+					BaseDisplaySet, BaseDisplayCloseOnExecFail,
+#else // !NLS
+					0, 0,
+#endif // NLS
+					"BaseDisplay::BaseDisplay: couldn't mark display connection "
+					"as close-on-exec\n"));
+    throw static_cast(2); //throw error 2
+  }
+
+	number_of_screens = ScreenCount(display);
+	display_name = XDisplayName(dpy_name);
+
+#ifdef    SHAPE
+	shape.extensions = XShapeQueryExtension(display, &shape.event_basep,
+                                          &shape.error_basep);
+#else // !SHAPE
+	shape.extensions = False;
+#endif // SHAPE
+//---------- setup atoms
+
+	xa_wm_colormap_windows =
+		XInternAtom(display, "WM_COLORMAP_WINDOWS", False);
+	xa_wm_protocols = XInternAtom(display, "WM_PROTOCOLS", False);
+	xa_wm_state = XInternAtom(display, "WM_STATE", False);
+	xa_wm_change_state = XInternAtom(display, "WM_CHANGE_STATE", False);
+	xa_wm_delete_window = XInternAtom(display, "WM_DELETE_WINDOW", False);
+	xa_wm_take_focus = XInternAtom(display, "WM_TAKE_FOCUS", False);
+	motif_wm_hints = XInternAtom(display, "_MOTIF_WM_HINTS", False);
+
+	blackbox_hints = XInternAtom(display, "_BLACKBOX_HINTS", False);
+	blackbox_attributes = XInternAtom(display, "_BLACKBOX_ATTRIBUTES", False);
+	blackbox_change_attributes =
+		XInternAtom(display, "_BLACKBOX_CHANGE_ATTRIBUTES", False);
+
+	blackbox_structure_messages =
+		XInternAtom(display, "_BLACKBOX_STRUCTURE_MESSAGES", False);
+	blackbox_notify_startup =
+		XInternAtom(display, "_BLACKBOX_NOTIFY_STARTUP", False);
+	blackbox_notify_window_add =
+		XInternAtom(display, "_BLACKBOX_NOTIFY_WINDOW_ADD", False);
+	blackbox_notify_window_del =
+		XInternAtom(display, "_BLACKBOX_NOTIFY_WINDOW_DEL", False);
+	blackbox_notify_current_workspace =
+		XInternAtom(display, "_BLACKBOX_NOTIFY_CURRENT_WORKSPACE", False);
+	blackbox_notify_workspace_count =
+		XInternAtom(display, "_BLACKBOX_NOTIFY_WORKSPACE_COUNT", False);
+	blackbox_notify_window_focus =
+		XInternAtom(display, "_BLACKBOX_NOTIFY_WINDOW_FOCUS", False);
+	blackbox_notify_window_raise =
+		XInternAtom(display, "_BLACKBOX_NOTIFY_WINDOW_RAISE", False);
+	blackbox_notify_window_lower =
+		XInternAtom(display, "_BLACKBOX_NOTIFY_WINDOW_LOWER", False);
+
+	blackbox_change_workspace =
+		XInternAtom(display, "_BLACKBOX_CHANGE_WORKSPACE", False);
+	blackbox_change_window_focus =
+		XInternAtom(display, "_BLACKBOX_CHANGE_WINDOW_FOCUS", False);
+	blackbox_cycle_window_focus =
+		XInternAtom(display, "_BLACKBOX_CYCLE_WINDOW_FOCUS", False);
+
+#ifdef    NEWWMSPEC
+
+	net_supported = XInternAtom(display, "_NET_SUPPORTED", False);
+	net_client_list = XInternAtom(display, "_NET_CLIENT_LIST", False);
+	net_client_list_stacking = XInternAtom(display, "_NET_CLIENT_LIST_STACKING", False);
+	net_number_of_desktops = XInternAtom(display, "_NET_NUMBER_OF_DESKTOPS", False);
+	net_desktop_geometry = XInternAtom(display, "_NET_DESKTOP_GEOMETRY", False);
+	net_desktop_viewport = XInternAtom(display, "_NET_DESKTOP_VIEWPORT", False);
+	net_current_desktop = XInternAtom(display, "_NET_CURRENT_DESKTOP", False);
+	net_desktop_names = XInternAtom(display, "_NET_DESKTOP_NAMES", False);
+	net_active_window = XInternAtom(display, "_NET_ACTIVE_WINDOW", False);
+	net_workarea = XInternAtom(display, "_NET_WORKAREA", False);
+	net_supporting_wm_check = XInternAtom(display, "_NET_SUPPORTING_WM_CHECK", False);
+	net_virtual_roots = XInternAtom(display, "_NET_VIRTUAL_ROOTS", False);
+
+	net_close_window = XInternAtom(display, "_NET_CLOSE_WINDOW", False);
+	net_wm_moveresize = XInternAtom(display, "_NET_WM_MOVERESIZE", False);
+
+	net_properties = XInternAtom(display, "_NET_PROPERTIES", False);
+	net_wm_name = XInternAtom(display, "_NET_WM_NAME", False);
+	net_wm_desktop = XInternAtom(display, "_NET_WM_DESKTOP", False);
+	net_wm_window_type = XInternAtom(display, "_NET_WM_WINDOW_TYPE", False);
+	net_wm_state = XInternAtom(display, "_NET_WM_STATE", False);
+	net_wm_strut = XInternAtom(display, "_NET_WM_STRUT", False);
+	net_wm_icon_geometry = XInternAtom(display, "_NET_WM_ICON_GEOMETRY", False);
+	net_wm_icon = XInternAtom(display, "_NET_WM_ICON", False);
+	net_wm_pid = XInternAtom(display, "_NET_WM_PID", False);
+	net_wm_handled_icons = XInternAtom(display, "_NET_WM_HANDLED_ICONS", False);
+
+	net_wm_ping = XInternAtom(display, "_NET_WM_PING", False);
+	
+#endif // NEWWMSPEC
+
+#ifdef GNOME
+	/*
+	gnome_wm_win_layer = XInternAtom(display, "_WIN_LAYER", False);
+	gnome_wm_win_state = XInternAtom(display, "_WIN_STATE", False);
+	gnome_wm_win_hints = XInternAtom(display, "_WIN_HINTS", False);
+  gnome_wm_win_app_state = XInternAtom(display, "_WIN_APP_STATE", False);
+	gnome_wm_win_expanded_size = XInternAtom(display, "_WIN_EXPANDED_SIZE", False);
+	gnome_wm_win_icons = XInternAtom(display, "_WIN_ICONS", False);
+	gnome_wm_win_workspace = XInternAtom(display, "_WIN_WORKSPACE", False);
+	gnome_wm_win_workspace_count = XInternAtom(display, "_WIN_WORKSPACE_COUNT", False);
+	gnome_wm_win_workspace_names = XInternAtom(display, "_WIN_WORKSPACE_NAMES", False);
+	gnome_wm_win_client_list = XInternAtom(display, "_WIN_CLIENT_LIST", False);
+	gnome_wm_prot = XInternAtom(display, "_WIN_PROTOCOLS", False);
+	gnome_wm_supporting_wm_check = XInternAtom(display, "_WIN_SUPPORTING_WM_CHECK", False);
+	*/
+#endif // GNOME
+
+	cursor.session = XCreateFontCursor(display, XC_left_ptr);
+	cursor.move = XCreateFontCursor(display, XC_fleur);
+	cursor.ll_angle = XCreateFontCursor(display, XC_ll_angle);
+	cursor.lr_angle = XCreateFontCursor(display, XC_lr_angle);
+
+	XSetErrorHandler((XErrorHandler) handleXErrors);
+
+	timerList = new LinkedList;
+
+	screenInfoList = new LinkedList;
+	int i;
+	for (i = 0; i < number_of_screens; i++) {
+		ScreenInfo *screeninfo = new ScreenInfo(this, i);
+		screenInfoList->insert(screeninfo);
+	}
+}
+
+
+BaseDisplay::~BaseDisplay(void) {
+  
+	while (screenInfoList->count()) {
+    ScreenInfo *si = screenInfoList->first();
+
+	   screenInfoList->remove(si);
+   	delete si;
+  }
+	
+
+  delete screenInfoList;
+
+  // we don't create the BTimers, we don't delete them
+  while (timerList->count())
+    timerList->remove(0);
+
+  delete timerList;
+
+  XCloseDisplay(display);
+}
+
+void BaseDisplay::eventLoop(void) {
+	run();
+
+	int xfd = ConnectionNumber(display);
+
+	while ((! _shutdown) && (! internal_error)) {
+		if (XPending(display)) {
+			XEvent e;
+			XNextEvent(display, &e);
+
+			if (last_bad_window != None && e.xany.window == last_bad_window) {
+#ifdef    DEBUG
+			fprintf(stderr,
+				I18n::instance()->
+					getMessage(
+#ifdef    NLS
+						BaseDisplaySet, BaseDisplayBadWindowRemove,
+#else // !NLS
+						0, 0,
+#endif // NLS
+						"BaseDisplay::eventLoop(): removing bad window "
+						"from event queue\n"));
+#endif // DEBUG
+			} else {
+				last_bad_window = None;
+				process_event(&e);
+			}
+		} else {
+			fd_set rfds;
+			timeval now, tm, *timeout = (timeval *) 0;
+
+			FD_ZERO(&rfds);
+			FD_SET(xfd, &rfds);
+
+			if (timerList->count()) {
+				gettimeofday(&now, 0);
+
+				tm.tv_sec = tm.tv_usec = 0l;
+
+				BTimer *timer = timerList->first();
+
+				tm.tv_sec = timer->getStartTime().tv_sec +
+					timer->getTimeout().tv_sec - now.tv_sec;
+				tm.tv_usec = timer->getStartTime().tv_usec +
+					timer->getTimeout().tv_usec - now.tv_usec;
+
+				while (tm.tv_usec >= 1000000) {
+					tm.tv_sec++;
+					tm.tv_usec -= 1000000;
+				}
+
+				while (tm.tv_usec < 0) {
+					if (tm.tv_sec > 0) {
+						tm.tv_sec--;
+						tm.tv_usec += 1000000;
+					} else {
+						tm.tv_usec = 0;
+						break;
+					}
+				}
+
+				timeout = &tm;
+			}
+
+			select(xfd + 1, &rfds, 0, 0, timeout);
+
+			// check for timer timeout
+			gettimeofday(&now, 0);
+
+			LinkedListIterator it(timerList);
+			for(; it.current(); it++) {
+				tm.tv_sec = it.current()->getStartTime().tv_sec +
+					it.current()->getTimeout().tv_sec;
+				tm.tv_usec = it.current()->getStartTime().tv_usec +
+					it.current()->getTimeout().tv_usec;
+
+				if ((now.tv_sec < tm.tv_sec) ||
+						(now.tv_sec == tm.tv_sec && now.tv_usec < tm.tv_usec))
+					break;
+
+				it.current()->fireTimeout();
+
+				// restart the current timer so that the start time is updated
+				if (! it.current()->doOnce())
+					it.current()->start();
+				else 
+					it.current()->stop();
+			}
+		}
+	}
+}
+
+
+const Bool BaseDisplay::validateWindow(Window window) {
+  XEvent event;
+  if (XCheckTypedWindowEvent(display, window, DestroyNotify, &event)) {
+    XPutBackEvent(display, &event);
+
+    return False;
+  }
+
+  return True;
+}
+
+
+void BaseDisplay::grab(void) {
+  if (! server_grabs++)
+    XGrabServer(display);
+}
+
+
+void BaseDisplay::ungrab(void) {
+  if (! --server_grabs)
+    XUngrabServer(display);
+
+  if (server_grabs < 0) server_grabs = 0;
+}
+
+
+void BaseDisplay::addTimer(BTimer *timer) {
+  if (! timer) return;
+
+  LinkedListIterator it(timerList);
+  int index = 0;
+  for (; it.current(); it++, index++)
+    if ((it.current()->getTimeout().tv_sec > timer->getTimeout().tv_sec) ||
+        ((it.current()->getTimeout().tv_sec == timer->getTimeout().tv_sec) &&
+         (it.current()->getTimeout().tv_usec >= timer->getTimeout().tv_usec)))
+      break;
+
+  timerList->insert(timer, index);
+}
+
+
+void BaseDisplay::removeTimer(BTimer *timer) {
+  timerList->remove(timer);
+}
+
+
+ScreenInfo::ScreenInfo(BaseDisplay *d, int num) {
+  basedisplay = d;
+  screen_number = num;
+
+  root_window = RootWindow(basedisplay->getXDisplay(), screen_number);
+  depth = DefaultDepth(basedisplay->getXDisplay(), screen_number);
+
+  width =
+    WidthOfScreen(ScreenOfDisplay(basedisplay->getXDisplay(), screen_number));
+  height =
+    HeightOfScreen(ScreenOfDisplay(basedisplay->getXDisplay(), screen_number));
+
+  // search for a TrueColor Visual... if we can't find one... we will use the
+  // default visual for the screen
+  XVisualInfo vinfo_template, *vinfo_return;
+  int vinfo_nitems;
+
+  vinfo_template.screen = screen_number;
+  vinfo_template.c_class = TrueColor;
+
+  visual = (Visual *) 0;
+
+  if ((vinfo_return = XGetVisualInfo(basedisplay->getXDisplay(),
+                                     VisualScreenMask | VisualClassMask,
+                                     &vinfo_template, &vinfo_nitems)) &&
+      vinfo_nitems > 0) {
+    for (int i = 0; i < vinfo_nitems; i++) {
+      if (depth < (vinfo_return + i)->depth) {
+        depth = (vinfo_return + i)->depth;
+        visual = (vinfo_return + i)->visual;
+      }
+    }
+
+    XFree(vinfo_return);
+  }
+
+  if (visual)
+    colormap = XCreateColormap(basedisplay->getXDisplay(), root_window,
+			       visual, AllocNone);
+  else {
+    visual = DefaultVisual(basedisplay->getXDisplay(), screen_number);
+    colormap = DefaultColormap(basedisplay->getXDisplay(), screen_number);
+  }
+}
diff --git a/src/BaseDisplay.hh b/src/BaseDisplay.hh
new file mode 100644
index 00000000..c25860e8
--- /dev/null
+++ b/src/BaseDisplay.hh
@@ -0,0 +1,368 @@
+// BaseDisplay.hh for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef   _BASEDISPLAY_HH_
+#define   _BASEDISPLAY_HH_
+
+#include 
+#include 
+
+// forward declaration
+class BaseDisplay;
+class ScreenInfo;
+
+#include "LinkedList.hh"
+#include "Timer.hh"
+
+#define AttribShaded      (1l << 0)
+#define AttribMaxHoriz    (1l << 1)
+#define AttribMaxVert     (1l << 2)
+#define AttribOmnipresent (1l << 3)
+#define AttribWorkspace   (1l << 4)
+#define AttribStack       (1l << 5)
+#define AttribDecoration  (1l << 6)
+
+#define StackTop          (0)
+#define StackNormal       (1)
+#define StackBottom       (2)
+
+#define DecorNone         (0)
+#define DecorNormal       (1)
+#define DecorTiny         (2)
+#define DecorTool         (3)
+
+typedef struct _blackbox_hints {
+  unsigned long flags, attrib, workspace, stack, decoration;
+} BlackboxHints;
+
+typedef struct _blackbox_attributes {
+  unsigned long flags, attrib, workspace, stack;
+  int premax_x, premax_y;
+  unsigned int premax_w, premax_h;
+} BlackboxAttributes;
+
+#define PropBlackboxHintsElements      (5)
+#define PropBlackboxAttributesElements (8)
+
+#ifndef    __EMX__
+void bexec(const char *, char *);
+#endif // !__EMX__
+
+char *bstrdup(const char *);
+template  inline Z min(Z a, Z b) { return ((a < b) ? a : b); }
+template  inline Z max(Z a, Z b) { return ((a > b) ? a : b); }
+
+class BaseDisplay {
+
+public:
+  BaseDisplay(char *, char * = 0);
+  virtual ~BaseDisplay(void);
+
+#ifdef GNOME
+	inline Atom *getGnomeListAtoms() { return gnome_atom_list; }
+	inline Atom &getGnomeProtAtom() { return gnome_wm_prot; }
+	inline Atom &getGnomeClientListAtom() { return gnome_wm_win_client_list; }
+	inline Atom &getGnomeSupportingWMCheckAtom() { return gnome_wm_supporting_wm_check; }
+	inline Atom &getGnomeWorkspaceAtom() { return gnome_wm_win_workspace; }
+	inline Atom &getGnomeWorkspaceCountAtom() { return gnome_wm_win_workspace_count; }
+	inline Atom &getGnomeWorkspaceNamesAtom() { return gnome_wm_win_workspace_names; }
+#endif //GNOME
+
+  inline const Atom &getWMChangeStateAtom(void) const
+    { return xa_wm_change_state; }
+  inline const Atom &getWMStateAtom(void) const
+    { return xa_wm_state; }
+  inline const Atom &getWMDeleteAtom(void) const
+    { return xa_wm_delete_window; }
+  inline const Atom &getWMProtocolsAtom(void) const
+    { return xa_wm_protocols; }
+  inline const Atom &getWMTakeFocusAtom(void) const
+    { return xa_wm_take_focus; }
+  inline const Atom &getWMColormapAtom(void) const
+    { return xa_wm_colormap_windows; }
+  inline const Atom &getMotifWMHintsAtom(void) const
+    { return motif_wm_hints; }
+
+  // this atom is for normal app->WM hints about decorations, stacking,
+  // starting workspace etc...
+  inline const Atom &getFluxboxHintsAtom(void) const
+    { return blackbox_hints;}
+
+  // these atoms are for normal app->WM interaction beyond the scope of the
+  // ICCCM...
+  inline const Atom &getFluxboxAttributesAtom(void) const
+    { return blackbox_attributes; }
+  inline const Atom &getFluxboxChangeAttributesAtom(void) const
+    { return blackbox_change_attributes; }
+
+  // these atoms are for window->WM interaction, with more control and
+  // information on window "structure"... common examples are
+  // notifying apps when windows are raised/lowered... when the user changes
+  // workspaces... i.e. "pager talk"
+  inline const Atom &getFluxboxStructureMessagesAtom(void) const
+    { return blackbox_structure_messages; }
+
+  // *Notify* portions of the NETStructureMessages protocol
+  inline const Atom &getFluxboxNotifyStartupAtom(void) const
+    { return blackbox_notify_startup; }
+  inline const Atom &getFluxboxNotifyWindowAddAtom(void) const
+    { return blackbox_notify_window_add; }
+  inline const Atom &getFluxboxNotifyWindowDelAtom(void) const
+    { return blackbox_notify_window_del; }
+  inline const Atom &getFluxboxNotifyWindowFocusAtom(void) const
+    { return blackbox_notify_window_focus; }
+  inline const Atom &getFluxboxNotifyCurrentWorkspaceAtom(void) const
+    { return blackbox_notify_current_workspace; }
+  inline const Atom &getFluxboxNotifyWorkspaceCountAtom(void) const
+    { return blackbox_notify_workspace_count; }
+  inline const Atom &getFluxboxNotifyWindowRaiseAtom(void) const
+    { return blackbox_notify_window_raise; }
+  inline const Atom &getFluxboxNotifyWindowLowerAtom(void) const
+    { return blackbox_notify_window_lower; }
+
+  // atoms to change that request changes to the desktop environment during
+  // runtime... these messages can be sent by any client... as the sending
+  // client window id is not included in the ClientMessage event...
+  inline const Atom &getFluxboxChangeWorkspaceAtom(void) const
+    { return blackbox_change_workspace; }
+  inline const Atom &getFluxboxChangeWindowFocusAtom(void) const
+    { return blackbox_change_window_focus; }
+  inline const Atom &getFluxboxCycleWindowFocusAtom(void) const
+    { return blackbox_cycle_window_focus; }
+
+#ifdef    NEWWMSPEC
+
+  // root window properties
+  inline const Atom &getNETSupportedAtom(void) const
+    { return net_supported; }
+  inline const Atom &getNETClientListAtom(void) const
+    { return net_client_list; }
+  inline const Atom &getNETClientListStackingAtom(void) const
+    { return net_client_list_stacking; }
+  inline const Atom &getNETNumberOfDesktopsAtom(void) const
+    { return net_number_of_desktops; }
+  inline const Atom &getNETDesktopGeometryAtom(void) const
+    { return net_desktop_geometry; }
+  inline const Atom &getNETDesktopViewportAtom(void) const
+    { return net_desktop_viewport; }
+  inline const Atom &getNETCurrentDesktopAtom(void) const
+    { return net_current_desktop; }
+  inline const Atom &getNETDesktopNamesAtom(void) const
+    { return net_desktop_names; }
+  inline const Atom &getNETActiveWindowAtom(void) const
+    { return net_active_window; }
+  inline const Atom &getNETWorkareaAtom(void) const
+    { return net_workarea; }
+  inline const Atom &getNETSupportingWMCheckAtom(void) const
+    { return net_supporting_wm_check; }
+  inline const Atom &getNETVirtualRootsAtom(void) const
+    { return net_virtual_roots; }
+
+  // root window messages
+  inline const Atom &getNETCloseWindowAtom(void) const
+    { return net_close_window; }
+  inline const Atom &getNETWMMoveResizeAtom(void) const
+    { return net_wm_moveresize; }
+
+  // application window properties
+  inline const Atom &getNETPropertiesAtom(void) const
+    { return net_properties; }
+  inline const Atom &getNETWMNameAtom(void) const
+    { return net_wm_name; }
+  inline const Atom &getNETWMDesktopAtom(void) const
+    { return net_wm_desktop; }
+  inline const Atom &getNETWMWindowTypeAtom(void) const
+    { return net_wm_window_type; }
+  inline const Atom &getNETWMStateAtom(void) const
+    { return net_wm_state; }
+  inline const Atom &getNETWMStrutAtom(void) const
+    { return net_wm_strut; }
+  inline const Atom &getNETWMIconGeometryAtom(void) const
+    { return net_wm_icon_geometry; }
+  inline const Atom &getNETWMIconAtom(void) const
+    { return net_wm_icon; }
+  inline const Atom &getNETWMPidAtom(void) const
+    { return net_wm_pid; }
+  inline const Atom &getNETWMHandledIconsAtom(void) const
+    { return net_wm_handled_icons; }
+
+  // application protocols
+  inline const Atom &getNETWMPingAtom(void) const
+    { return net_wm_ping; }
+
+#endif // NEWWMSPEC
+
+  inline ScreenInfo *getScreenInfo(int s)
+    { return (ScreenInfo *) screenInfoList->find(s); }
+
+  inline const Bool &hasShapeExtensions(void) const
+    { return shape.extensions; }
+  inline const Bool &doShutdown(void) const
+    { return _shutdown; }
+  inline const Bool &isStartup(void) const
+    { return _startup; }
+
+  inline const Cursor &getSessionCursor(void) const
+    { return cursor.session; }
+  inline const Cursor &getMoveCursor(void) const
+    { return cursor.move; }
+  inline const Cursor &getLowerLeftAngleCursor(void) const
+    { return cursor.ll_angle; }
+  inline const Cursor &getLowerRightAngleCursor(void) const
+    { return cursor.lr_angle; }
+
+  inline Display *getXDisplay(void) { return display; }
+
+  inline const char *getXDisplayName(void) const
+    { return (const char *) display_name; }
+  inline const char *getApplicationName(void) const
+    { return (const char *) application_name; }
+
+  inline const int &getNumberOfScreens(void) const
+    { return number_of_screens; }
+  inline const int &getShapeEventBase(void) const
+    { return shape.event_basep; }
+
+  inline void shutdown(void) { _shutdown = True; }
+  inline void run(void) { _startup = _shutdown = False; }
+
+  const Bool validateWindow(Window);
+
+  void grab(void);
+  void ungrab(void);
+  void eventLoop(void);
+  void addTimer(BTimer *);
+  void removeTimer(BTimer *);
+
+  // another pure virtual... this is used to handle signals that BaseDisplay
+  // doesn't understand itself
+  virtual Bool handleSignal(int) = 0;
+	
+private:
+  struct cursor {
+    Cursor session, move, ll_angle, lr_angle;
+  } cursor;
+
+  struct shape {
+    Bool extensions;
+    int event_basep, error_basep;
+  } shape;
+
+  Atom xa_wm_colormap_windows, xa_wm_protocols, xa_wm_state,
+    xa_wm_delete_window, xa_wm_take_focus, xa_wm_change_state,
+    motif_wm_hints;
+
+  // NETAttributes
+  Atom blackbox_attributes, blackbox_change_attributes, blackbox_hints;
+
+  // NETStructureMessages
+  Atom blackbox_structure_messages, blackbox_notify_startup,
+    blackbox_notify_window_add, blackbox_notify_window_del,
+    blackbox_notify_window_focus, blackbox_notify_current_workspace,
+    blackbox_notify_workspace_count, blackbox_notify_window_raise,
+    blackbox_notify_window_lower;
+
+  // message_types for client -> wm messages
+  Atom blackbox_change_workspace, blackbox_change_window_focus,
+    blackbox_cycle_window_focus;
+
+#ifdef    NEWWMSPEC
+
+  // root window properties
+  Atom net_supported, net_client_list, net_client_list_stacking,
+    net_number_of_desktops, net_desktop_geometry, net_desktop_viewport,
+    net_current_desktop, net_desktop_names, net_active_window, net_workarea,
+    net_supporting_wm_check, net_virtual_roots;
+
+  // root window messages
+  Atom net_close_window, net_wm_moveresize;
+
+  // application window properties
+  Atom net_properties, net_wm_name, net_wm_desktop, net_wm_window_type,
+    net_wm_state, net_wm_strut, net_wm_icon_geometry, net_wm_icon, net_wm_pid,
+    net_wm_handled_icons;
+	
+			
+  // application protocols
+  Atom net_wm_ping;
+
+#endif // NEWWMSPEC
+
+#ifdef GNOME
+	union {
+		Atom gnome_wm_win_layer, gnome_wm_win_state, gnome_wm_win_hints,
+			gnome_wm_win_app_state, gnome_wm_win_expanded_size,
+			gnome_wm_win_icons, gnome_wm_win_workspace,
+			gnome_wm_win_workspace_count,	gnome_wm_win_workspace_names,
+			gnome_wm_win_client_list;
+		Atom gnome_atom_list[10];	
+	};	
+	Atom gnome_wm_prot;
+	Atom gnome_wm_supporting_wm_check;	
+#endif // GNOME
+
+
+  Bool _startup, _shutdown;
+  Display *display;
+  LinkedList *screenInfoList;
+  LinkedList *timerList;
+
+  char *display_name, *application_name;
+  int number_of_screens, server_grabs, colors_per_channel;
+
+protected:
+  
+  virtual void process_event(XEvent *) = 0;
+
+
+};
+
+
+class ScreenInfo {
+public:
+  ScreenInfo(BaseDisplay *, int);
+
+  inline BaseDisplay *getBaseDisplay(void) { return basedisplay; }
+
+  inline Visual *getVisual(void) { return visual; }
+  inline const Window &getRootWindow(void) const { return root_window; }
+  inline const Colormap &getColormap(void) const { return colormap; }
+
+  inline const int &getDepth(void) const { return depth; }
+  inline const int &getScreenNumber(void) const { return screen_number; }
+
+  inline const unsigned int &getWidth(void) const { return width; }
+  inline const unsigned int &getHeight(void) const { return height; }
+
+private:
+  BaseDisplay *basedisplay;
+  Visual *visual;
+  Window root_window;
+  Colormap colormap;
+
+  int depth, screen_number;
+  unsigned int width, height;
+
+
+};
+
+
+#endif // __BaseDisplay_hh
diff --git a/src/Basemenu.cc b/src/Basemenu.cc
new file mode 100644
index 00000000..170c3c03
--- /dev/null
+++ b/src/Basemenu.cc
@@ -0,0 +1,1067 @@
+// Basemenu.cc for fluxbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.	IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// stupid macros needed to access some functions in version 2 of the GNU C
+// library
+#ifndef	 _GNU_SOURCE
+#define	 _GNU_SOURCE
+#endif // _GNU_SOURCE
+
+#ifdef		HAVE_CONFIG_H
+#	include "../config.h"
+#endif // HAVE_CONFIG_H
+
+#include "i18n.hh"
+#include "fluxbox.hh"
+#include "Basemenu.hh"
+#include "Screen.hh"
+
+#ifdef		HAVE_STDIO_H
+#	include 
+#endif // HAVE_STDIO_H
+
+#ifdef		STDC_HEADERS
+#	include 
+#	include 
+#endif // STDC_HEADERS
+
+
+static Basemenu *shown = (Basemenu *) 0;
+
+Basemenu::Basemenu(BScreen *scrn) {
+	screen = scrn;
+	fluxbox = Fluxbox::instance();
+	image_ctrl = screen->getImageControl();
+	display = fluxbox->getXDisplay();
+	parent = (Basemenu *) 0;
+	alignment = AlignDontCare;
+
+	title_vis =
+		movable =
+		hide_tree = True;
+
+	shifted =
+		internal_menu =
+		moving =
+		torn =
+		visible = False;
+
+	menu.x =
+		menu.y =
+		menu.x_shift =
+		menu.y_shift =
+		menu.x_move =
+		menu.y_move = 0;
+
+	which_sub =
+		which_press =
+		which_sbl = -1;
+
+	menu.frame_pixmap =
+		menu.title_pixmap =
+		menu.hilite_pixmap =
+		menu.sel_pixmap = None;
+
+	menu.bevel_w = screen->getBevelWidth();
+
+	I18n *i18n = I18n::instance();
+	
+	if (i18n->multibyte()) {
+		menu.width = menu.title_h = menu.item_w = menu.frame_h =
+			screen->getMenuStyle()->titlefont.set_extents->max_ink_extent.height +
+			(menu.bevel_w	* 2);
+	} else {
+		menu.width = menu.title_h = menu.item_w = menu.frame_h =
+			screen->getMenuStyle()->titlefont.fontstruct->ascent +
+			screen->getMenuStyle()->titlefont.fontstruct->descent +
+			(menu.bevel_w * 2);
+	}
+	menu.label = 0;
+	
+	menu.sublevels =
+		menu.persub =
+		menu.minsub = 0;
+	
+	if (i18n->multibyte()) {
+		menu.item_h = screen->getMenuStyle()->framefont.set_extents->max_ink_extent.height +
+			(menu.bevel_w);
+	} else {
+		menu.item_h = screen->getMenuStyle()->framefont.fontstruct->ascent +
+			screen->getMenuStyle()->framefont.fontstruct->descent +
+			(menu.bevel_w);
+	}
+	menu.height = menu.title_h + screen->getBorderWidth() + menu.frame_h;
+	
+	//set attributes for menu window
+	unsigned long attrib_mask = CWBackPixmap | CWBackPixel | CWBorderPixel |
+					CWColormap | CWOverrideRedirect | CWEventMask;
+	XSetWindowAttributes attrib;
+	attrib.background_pixmap = None;
+	attrib.background_pixel = attrib.border_pixel =
+			screen->getBorderColor()->getPixel();
+	attrib.colormap = screen->getColormap();
+	attrib.override_redirect = True;
+	attrib.event_mask = ButtonPressMask | ButtonReleaseMask |
+			ButtonMotionMask | ExposureMask;
+
+	//create menu window
+	menu.window =
+		XCreateWindow(display, screen->getRootWindow(), menu.x, menu.y, menu.width,
+			menu.height, screen->getBorderWidth(), screen->getDepth(),
+			InputOutput, screen->getVisual(), attrib_mask, &attrib);
+	
+	fluxbox->saveMenuSearch(menu.window, this);
+	
+	//attibutes for title to menuwindow
+	attrib_mask = CWBackPixmap | CWBackPixel | CWBorderPixel | CWEventMask;
+	attrib.background_pixel = screen->getBorderColor()->getPixel();
+	attrib.event_mask |= EnterWindowMask | LeaveWindowMask;
+	//create menu title
+	menu.title =
+		XCreateWindow(display, menu.window, 0, 0, menu.width, menu.height, 0,
+			screen->getDepth(), InputOutput, screen->getVisual(),
+			attrib_mask, &attrib);
+	fluxbox->saveMenuSearch(menu.title, this);
+
+	attrib.event_mask |= PointerMotionMask;
+	menu.frame = XCreateWindow(display, menu.window, 0,
+				menu.title_h + screen->getBorderWidth(),
+				menu.width, menu.frame_h, 0,
+				screen->getDepth(), InputOutput,
+				screen->getVisual(), attrib_mask, &attrib);
+	fluxbox->saveMenuSearch(menu.frame, this);
+
+	menuitems = new LinkedList;
+
+	// even though this is the end of the constructor the menu is still not
+	// completely created.	items must be inserted and it must be update()'d
+}
+
+
+Basemenu::~Basemenu(void) {
+	XUnmapWindow(display, menu.window);
+
+	if (shown && shown->getWindowID() == getWindowID())
+		shown = (Basemenu *) 0;
+
+	int n = menuitems->count();
+	for (int i = 0; i < n; ++i)
+		remove(0);
+
+	delete menuitems;
+
+	if (menu.label)
+		delete [] menu.label;
+
+	if (menu.title_pixmap)
+		image_ctrl->removeImage(menu.title_pixmap);
+
+	if (menu.frame_pixmap)
+		image_ctrl->removeImage(menu.frame_pixmap);
+
+	if (menu.hilite_pixmap)
+		image_ctrl->removeImage(menu.hilite_pixmap);
+
+	if (menu.sel_pixmap)
+		image_ctrl->removeImage(menu.sel_pixmap);
+
+	fluxbox->removeMenuSearch(menu.title);
+	XDestroyWindow(display, menu.title);
+
+	fluxbox->removeMenuSearch(menu.frame);
+	XDestroyWindow(display, menu.frame);
+
+	fluxbox->removeMenuSearch(menu.window);
+	XDestroyWindow(display, menu.window);
+}
+
+
+int Basemenu::insert(const char *l, int function, const char *e, int pos) {
+	char *label = 0, *exec = 0;
+
+	if (l) label = bstrdup(l);
+	if (e) exec = bstrdup(e);
+
+	BasemenuItem *item = new BasemenuItem(label, function, exec);
+	menuitems->insert(item, pos);
+
+	return menuitems->count();
+}
+
+
+int Basemenu::insert(const char *l, Basemenu *submenu, int pos) {
+	char *label = 0;
+
+	if (l) label = bstrdup(l);
+
+	BasemenuItem *item = new BasemenuItem(label, submenu);
+	menuitems->insert(item, pos);
+
+	submenu->parent = this;
+
+	return menuitems->count();
+}
+
+
+int Basemenu::insert(const char **ulabel, int pos, int function) {
+	BasemenuItem *item = new BasemenuItem(ulabel, function);
+	menuitems->insert(item, pos);
+
+	return menuitems->count();
+}
+
+
+int Basemenu::remove(int index) {
+	if (index < 0 || index > menuitems->count()) return -1;
+
+	BasemenuItem *item = menuitems->remove(index);
+
+	if (item) {
+		if ((! internal_menu) && (item->submenu())) {
+			Basemenu *tmp = (Basemenu *) item->submenu();
+
+			if (! tmp->internal_menu) {
+	delete tmp;
+			} else
+	tmp->internal_hide();
+		}
+
+		if (item->label())
+			delete [] item->label();
+		
+		if (item->exec())
+			delete [] item->exec();
+
+		delete item;
+	}
+
+	if (which_sub == index)
+		which_sub = -1;
+	else if (which_sub > index)
+		which_sub--;
+
+	return menuitems->count();
+}
+
+
+void Basemenu::update(void) {
+	I18n *i18n = I18n::instance();
+	
+	if (i18n->multibyte()) {
+		menu.item_h = screen->getMenuStyle()->framefont.set_extents->max_ink_extent.height +
+			menu.bevel_w;
+		menu.title_h =	screen->getMenuStyle()->titlefont.set_extents->max_ink_extent.height +
+				(menu.bevel_w * 2);
+	} else {
+		menu.item_h = screen->getMenuStyle()->framefont.fontstruct->ascent +
+			screen->getMenuStyle()->framefont.fontstruct->descent +
+			menu.bevel_w;
+		menu.title_h =	screen->getMenuStyle()->titlefont.fontstruct->ascent +
+				screen->getMenuStyle()->titlefont.fontstruct->descent +
+				(menu.bevel_w * 2);
+	}
+		
+	if (title_vis) {
+		const char *s = (menu.label) ? menu.label :
+				i18n->getMessage(
+#ifdef		NLS
+						 BasemenuSet, BasemenuBlackboxMenu,
+#else // !NLS
+						 0, 0,
+#endif // NLS
+						 "fluxbox Menu");
+		int l = strlen(s);
+		
+
+		if (i18n->multibyte()) {
+			XRectangle ink, logical;
+			XmbTextExtents(screen->getMenuStyle()->titlefont.set, s, l, &ink, &logical);
+			menu.item_w = logical.width;
+		} else
+			menu.item_w = XTextWidth(screen->getMenuStyle()->titlefont.fontstruct, s, l);
+		
+		menu.item_w += (menu.bevel_w * 2);
+	}	else
+		menu.item_w = 1;
+
+	int ii = 0;
+	LinkedListIterator it(menuitems);
+	for (; it.current(); it++) {
+		BasemenuItem *itmp = it.current();
+
+		const char *s = ((itmp->u && *itmp->u) ? *itmp->u :
+				 ((itmp->l) ? itmp->l : (const char *) 0));
+		int l = strlen(s);
+
+		if (i18n->multibyte()) {
+			XRectangle ink, logical;
+			XmbTextExtents(screen->getMenuStyle()->framefont.set, s, l, &ink, &logical);
+			ii = logical.width;
+		} else
+			ii = XTextWidth(screen->getMenuStyle()->framefont.fontstruct, s, l);
+
+		ii += (menu.bevel_w * 2) + (menu.item_h * 2);
+
+		menu.item_w = ((menu.item_w < (unsigned int) ii) ? ii : menu.item_w);
+	}
+
+	if (menuitems->count()) {
+		menu.sublevels = 1;
+
+		while (((menu.item_h * (menuitems->count() + 1) / menu.sublevels)
+			+ menu.title_h + screen->getBorderWidth()) >
+		 screen->getHeight())
+			menu.sublevels++;
+
+		if (menu.sublevels < menu.minsub) menu.sublevels = menu.minsub;
+
+		menu.persub = menuitems->count() / menu.sublevels;
+		if (menuitems->count() % menu.sublevels) menu.persub++;
+	} else {
+		menu.sublevels = 0;
+		menu.persub = 0;
+	}
+
+	menu.width = (menu.sublevels * (menu.item_w));
+	if (! menu.width) menu.width = menu.item_w;
+
+	menu.frame_h = (menu.item_h * menu.persub);
+	menu.height = ((title_vis) ? menu.title_h + screen->getBorderWidth() : 0) +
+		menu.frame_h;
+	if (! menu.frame_h) menu.frame_h = 1;
+	if (menu.height < 1) menu.height = 1;
+
+	Pixmap tmp;
+	BTexture *texture;
+	if (title_vis) {
+		tmp = menu.title_pixmap;
+		texture = &(screen->getMenuStyle()->title);
+		if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+			menu.title_pixmap = None;
+			XSetWindowBackground(display, menu.title,
+				 texture->getColor()->getPixel());
+		} else {
+			menu.title_pixmap =
+				image_ctrl->renderImage(menu.width, menu.title_h, texture);
+			XSetWindowBackgroundPixmap(display, menu.title, menu.title_pixmap);
+		}
+		if (tmp) image_ctrl->removeImage(tmp);
+		XClearWindow(display, menu.title);
+	}
+
+	tmp = menu.frame_pixmap;
+	texture = &(screen->getMenuStyle()->frame);
+	if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+		menu.frame_pixmap = None;
+		XSetWindowBackground(display, menu.frame,
+			 texture->getColor()->getPixel());
+	} else {
+		menu.frame_pixmap =
+			image_ctrl->renderImage(menu.width, menu.frame_h, texture);
+		XSetWindowBackgroundPixmap(display, menu.frame, menu.frame_pixmap);
+	}
+	if (tmp) image_ctrl->removeImage(tmp);
+
+	tmp = menu.hilite_pixmap;
+	texture = &(screen->getMenuStyle()->hilite);
+	if (texture->getTexture() == (BImage_Flat | BImage_Solid))
+		menu.hilite_pixmap = None;
+	else
+		menu.hilite_pixmap =
+			image_ctrl->renderImage(menu.item_w, menu.item_h, texture);
+	if (tmp) image_ctrl->removeImage(tmp);
+
+	tmp = menu.sel_pixmap;
+	if (texture->getTexture() == (BImage_Flat | BImage_Solid))
+		menu.sel_pixmap = None;
+	else {
+		int hw = menu.item_h / 2;
+		menu.sel_pixmap =
+			image_ctrl->renderImage(hw, hw, texture);
+	}
+	if (tmp) image_ctrl->removeImage(tmp);
+
+	XResizeWindow(display, menu.window, menu.width, menu.height);
+
+	if (title_vis)
+		XResizeWindow(display, menu.title, menu.width, menu.title_h);
+
+	XMoveResizeWindow(display, menu.frame, 0,
+				((title_vis) ? menu.title_h +
+				 screen->getBorderWidth() : 0), menu.width,
+				menu.frame_h);
+
+	XClearWindow(display, menu.window);
+	XClearWindow(display, menu.title);
+	XClearWindow(display, menu.frame);
+
+	if (title_vis && visible) redrawTitle();
+
+	int i = 0;
+	for (i = 0; visible && i < menuitems->count(); i++)
+		if (i == which_sub) {
+			drawItem(i, True, 0);
+			drawSubmenu(i);
+		} else
+			drawItem(i, False, 0);
+
+	if (parent && visible)
+		parent->drawSubmenu(parent->which_sub);
+
+	XMapSubwindows(display, menu.window);
+}
+
+
+void Basemenu::show(void) {
+	XMapSubwindows(display, menu.window);
+	XMapWindow(display, menu.window);
+	visible = True;
+
+	if (! parent) {
+		if (shown && (! shown->torn))
+			 shown->hide();
+
+		shown = this;
+	}
+}
+
+
+void Basemenu::hide(void) {
+	if ((! torn) && hide_tree && parent && parent->isVisible()) {
+		Basemenu *p = parent;
+
+		while (p->isVisible() && (! p->torn) && p->parent) p = p->parent;
+		p->internal_hide();
+	} else
+		internal_hide();
+}
+
+
+void Basemenu::internal_hide(void) {
+	if (which_sub != -1) {
+		BasemenuItem *tmp = menuitems->find(which_sub);
+		tmp->submenu()->internal_hide();
+	}
+
+	if (parent && (! torn)) {
+		parent->drawItem(parent->which_sub, False, True);
+
+		parent->which_sub = -1;
+	} else if (shown && shown->menu.window == menu.window)
+		shown = (Basemenu *) 0;
+
+	torn = visible = False;
+	which_sub = which_press = which_sub = -1;
+
+	XUnmapWindow(display, menu.window);
+}
+
+
+void Basemenu::move(int x, int y) {
+	menu.x = x;
+	menu.y = y;
+	XMoveWindow(display, menu.window, x, y);
+	if (which_sub != -1)
+		drawSubmenu(which_sub);
+}
+
+
+void Basemenu::redrawTitle(void) {
+	I18n *i18n = I18n::instance();
+	char *text = (char *) ((menu.label) ? menu.label :
+			i18n->getMessage(
+#ifdef		NLS
+					BasemenuSet, BasemenuBlackboxMenu,
+#else // !NLS
+					0, 0,
+#endif // NLS
+					"fluxbox Menu"));
+	int dx = menu.bevel_w, len = strlen(text);
+	unsigned int l;
+
+	if (i18n->multibyte()) {
+		XRectangle ink, logical;
+		XmbTextExtents(screen->getMenuStyle()->titlefont.set, text, len, &ink, &logical);
+		l = logical.width;
+	} else
+		l = XTextWidth(screen->getMenuStyle()->titlefont.fontstruct, text, len);
+
+	l +=	(menu.bevel_w * 2);
+
+	switch (screen->getMenuStyle()->titlefont.justify) {
+	case FFont::Right:
+		dx += menu.width - l;
+		break;
+
+	case FFont::Center:
+		dx += (menu.width - l) / 2;
+		break;
+	default:
+		break;
+	}
+
+	if (i18n->multibyte())
+		XmbDrawString(display, menu.title, screen->getMenuStyle()->titlefont.set,
+			screen->getMenuStyle()->t_text_gc, dx, menu.bevel_w -
+			screen->getMenuStyle()->titlefont.set_extents->max_ink_extent.y,
+			text, len);
+	else
+		XDrawString(display, menu.title, screen->getMenuStyle()->t_text_gc, dx,
+		screen->getMenuStyle()->titlefont.fontstruct->ascent + menu.bevel_w,
+		text, len);
+}
+
+
+void Basemenu::drawSubmenu(int index) {
+	if (which_sub != -1 && which_sub != index) {
+		BasemenuItem *itmp = menuitems->find(which_sub);
+
+		if (! itmp->submenu()->isTorn())
+			itmp->submenu()->internal_hide();
+	}
+
+	if (index >= 0 && index < menuitems->count()) {
+		BasemenuItem *item = menuitems->find(index);
+		if (item->submenu() && visible && (! item->submenu()->isTorn()) &&
+				item->isEnabled()) {
+			
+			if (item->submenu()->parent != this)
+				item->submenu()->parent = this;
+			
+			int sbl = index / menu.persub, i = index - (sbl * menu.persub),
+			x = menu.x +
+				((menu.item_w * (sbl + 1)) + screen->getBorderWidth()), y;
+		
+			if (alignment == AlignTop) {
+				y = (((shifted) ? menu.y_shift : menu.y) +
+				 ((title_vis) ? menu.title_h + screen->getBorderWidth() : 0) -
+				 ((item->submenu()->title_vis) ?
+					item->submenu()->menu.title_h + screen->getBorderWidth() : 0));
+			} else {
+				y = (((shifted) ? menu.y_shift : menu.y) +
+				 (menu.item_h * i) +
+				 ((title_vis) ? menu.title_h + screen->getBorderWidth() : 0) -
+				 ((item->submenu()->title_vis) ?
+					item->submenu()->menu.title_h + screen->getBorderWidth() : 0));
+			}
+			
+			if (alignment == AlignBottom &&
+					(y + item->submenu()->menu.height) > ((shifted) ? menu.y_shift :
+					menu.y) + menu.height) {
+				y = (((shifted) ? menu.y_shift : menu.y) +
+					 menu.height - item->submenu()->menu.height);
+			}
+			
+			if ((x + item->submenu()->getWidth()) > screen->getWidth()) {
+				x = ((shifted) ? menu.x_shift : menu.x) -
+					item->submenu()->getWidth() - screen->getBorderWidth();
+			}
+			
+			if (x < 0) x = 0;
+
+			if ((y + item->submenu()->getHeight()) > screen->getHeight()) {
+				y = screen->getHeight() - item->submenu()->getHeight() -
+					screen->getBorderWidth2x();
+			}
+			
+			if (y < 0) y = 0;
+			
+			item->submenu()->move(x, y);
+			if (! moving)
+				drawItem(index, True);
+		
+			if (! item->submenu()->isVisible())
+				item->submenu()->show();
+			
+			item->submenu()->moving = moving;
+			which_sub = index;
+		} else
+			which_sub = -1;
+	}
+}
+
+
+Bool Basemenu::hasSubmenu(int index) {
+	if ((index >= 0) && (index < menuitems->count()))
+		if (menuitems->find(index)->submenu())
+			return True;
+		else
+			return False;
+	else
+		return False;
+}
+
+
+void Basemenu::drawItem(int index, Bool highlight, Bool clear,
+			 int x, int y, unsigned int w, unsigned int h)
+{
+	if (index < 0 || index > menuitems->count()) return;
+
+	BasemenuItem *item = menuitems->find(index);
+	if (! item) return;
+	
+	Bool dotext = True, dohilite = True, dosel = True;
+	const char *text = (item->ulabel()) ? *item->ulabel() : item->label();
+	int sbl = index / menu.persub, i = index - (sbl * menu.persub);
+	int item_x = (sbl * menu.item_w), item_y = (i * menu.item_h);
+	int hilite_x = item_x, hilite_y = item_y, hoff_x = 0, hoff_y = 0;
+	int text_x = 0, text_y = 0, len = strlen(text), sel_x = 0, sel_y = 0;
+	unsigned int hilite_w = menu.item_w, hilite_h = menu.item_h, text_w = 0, text_h = 0;
+	unsigned int half_w = menu.item_h / 2, quarter_w = menu.item_h / 4;
+
+	I18n *i18n = I18n::instance();
+	
+	if (text) {		
+		if (i18n->multibyte()) {
+			XRectangle ink, logical;
+			XmbTextExtents(screen->getMenuStyle()->framefont.set, text, len, &ink, &logical);
+			text_w = logical.width;
+			text_y = item_y + (menu.bevel_w / 2) -
+				screen->getMenuStyle()->framefont.set_extents->max_ink_extent.y;
+		} else {
+			text_w = XTextWidth(screen->getMenuStyle()->framefont.fontstruct, text, len);
+			text_y =	item_y +
+				screen->getMenuStyle()->framefont.fontstruct->ascent +
+				(menu.bevel_w / 2);
+		}
+		
+		switch(screen->getMenuStyle()->framefont.justify) {
+		case FFont::Left:
+			text_x = item_x + menu.bevel_w + menu.item_h + 1;
+			break;
+			
+		case FFont::Right:
+			text_x = item_x + menu.item_w - (menu.item_h + menu.bevel_w + text_w);
+			break;			
+		default: //center
+			text_x = item_x + ((menu.item_w + 1 - text_w) / 2);
+			break;
+		}
+		
+		text_h = menu.item_h - menu.bevel_w;
+	}
+	
+	GC gc =
+		((highlight || item->isSelected()) ? screen->getMenuStyle()->h_text_gc :
+		screen->getMenuStyle()->f_text_gc),
+		tgc =
+			((highlight) ? screen->getMenuStyle()->h_text_gc :
+			((item->isEnabled()) ? screen->getMenuStyle()->f_text_gc :
+			screen->getMenuStyle()->d_text_gc));
+	
+	sel_x = item_x;
+	
+	if (screen->getMenuStyle()->bullet_pos == Right)
+		sel_x += (menu.item_w - menu.item_h - menu.bevel_w);
+	
+	sel_x += quarter_w;
+	sel_y = item_y + quarter_w;
+	
+	if (clear) {
+		XClearArea(display, menu.frame, item_x, item_y, menu.item_w, menu.item_h,
+			False);
+	} else if (! (x == y && y == -1 && w == h && h == 0)) {
+		// calculate the which part of the hilite to redraw
+		if (! (max(item_x, x) <= (signed) min(item_x + menu.item_w, x + w) &&
+				max(item_y, y) <= (signed) min(item_y + menu.item_h, y + h))) {
+			dohilite = False;
+		} else {
+			hilite_x = max(item_x, x);
+			hilite_y = max(item_y, y);
+			hilite_w = min(item_x + menu.item_w, x + w) - hilite_x;
+			hilite_h = min(item_y + menu.item_h, y + h) - hilite_y;
+			hoff_x = hilite_x % menu.item_w;
+			hoff_y = hilite_y % menu.item_h;
+		}
+		
+		// check if we need to redraw the text		
+		int text_ry = item_y + (menu.bevel_w / 2);
+		if (! (max(text_x, x) <= (signed) min(text_x + text_w, x + w) &&
+				max(text_ry, y) <= (signed) min(text_ry + text_h, y + h)))
+			dotext = False;
+		
+		// check if we need to redraw the select pixmap/menu bullet
+		if (! (max(sel_x, x) <= (signed) min(sel_x + half_w, x + w) &&
+				max(sel_y, y) <= (signed) min(sel_y + half_w, y + h)))
+			dosel = False;
+	
+	}
+	
+	if (dohilite && highlight && (menu.hilite_pixmap != ParentRelative)) {
+		if (menu.hilite_pixmap) {
+			XCopyArea(display, menu.hilite_pixmap, menu.frame,		
+				screen->getMenuStyle()->hilite_gc, hoff_x, hoff_y,
+				hilite_w, hilite_h, hilite_x, hilite_y);
+		} else {
+			XFillRectangle(display, menu.frame,
+				screen->getMenuStyle()->hilite_gc,
+				hilite_x, hilite_y, hilite_w, hilite_h);
+		}
+	} else if (dosel && item->isSelected() &&
+					(menu.sel_pixmap != ParentRelative)) {
+		if (menu.sel_pixmap) {
+			XCopyArea(display, menu.sel_pixmap, menu.frame,		
+				screen->getMenuStyle()->hilite_gc, 0, 0,
+				half_w, half_w, sel_x, sel_y);
+		} else {
+			XFillRectangle(display, menu.frame,
+				screen->getMenuStyle()->hilite_gc,
+				sel_x, sel_y, half_w, half_w);
+		}
+	}
+	
+	if (dotext && text) {
+		if (i18n->multibyte()) {
+			XmbDrawString(display, menu.frame, screen->getMenuStyle()->framefont.set,
+				tgc, text_x, text_y, text, len);
+		} else
+			XDrawString(display, menu.frame, tgc, text_x, text_y, text, len);
+	}
+
+	if (dosel && item->submenu()) {
+		switch (screen->getMenuStyle()->bullet) {
+		case Square:
+			XDrawRectangle(display, menu.frame, gc, sel_x, sel_y, half_w, half_w);
+			break;
+
+		case Triangle:
+			XPoint tri[3];
+
+			if (screen->getMenuStyle()->bullet_pos == Right) {
+				tri[0].x = sel_x + quarter_w - 2;
+				tri[0].y = sel_y + quarter_w - 2;
+				tri[1].x = 4;
+				tri[1].y = 2;
+				tri[2].x = -4;
+				tri[2].y = 2;
+			} else {
+				tri[0].x = sel_x + quarter_w - 2;
+				tri[0].y = item_y + half_w;
+				tri[1].x = 4;
+				tri[1].y = 2;
+				tri[2].x = 0;
+				tri[2].y = -4;
+			}
+			
+			XFillPolygon(display, menu.frame, gc, tri, 3, Convex,
+						CoordModePrevious);
+			break;
+			
+		case Diamond:
+			XPoint dia[4];
+
+			dia[0].x = sel_x + quarter_w - 3;
+			dia[0].y = item_y + half_w;
+			dia[1].x = 3;
+			dia[1].y = -3;
+			dia[2].x = 3;
+			dia[2].y = 3;
+			dia[3].x = -3;
+			dia[3].y = 3;
+
+			XFillPolygon(display, menu.frame, gc, dia, 4, Convex,
+					CoordModePrevious);
+			break;
+		}
+	}
+}
+
+
+void Basemenu::setLabel(const char *l) {
+	if (menu.label)
+		delete [] menu.label;
+
+	if (l) menu.label = bstrdup(l);
+	else menu.label = 0;
+}
+
+
+void Basemenu::setItemSelected(int index, Bool sel) {
+	if (index < 0 || index >= menuitems->count()) return;
+
+	BasemenuItem *item = find(index);
+	if (! item) return;
+
+	item->setSelected(sel);
+	if (visible) drawItem(index, (index == which_sub), True);
+}
+
+
+Bool Basemenu::isItemSelected(int index) {
+	if (index < 0 || index >= menuitems->count()) return False;
+
+	BasemenuItem *item = find(index);
+	if (! item) return False;
+
+	return item->isSelected();
+}
+
+
+void Basemenu::setItemEnabled(int index, Bool enable) {
+	if (index < 0 || index >= menuitems->count()) return;
+
+	BasemenuItem *item = find(index);
+	if (! item) return;
+
+	item->setEnabled(enable);
+	if (visible) drawItem(index, (index == which_sub), True);
+}
+
+
+Bool Basemenu::isItemEnabled(int index) {
+	if (index < 0 || index >= menuitems->count()) return False;
+
+	BasemenuItem *item = find(index);
+	if (! item) return False;
+
+	return item->isEnabled();
+}
+
+
+void Basemenu::buttonPressEvent(XButtonEvent *be) {
+	if (be->window == menu.frame) {
+		int sbl = (be->x / menu.item_w), i = (be->y / menu.item_h);
+		int w = (sbl * menu.persub) + i;
+
+		if (w < menuitems->count() && w >= 0) {
+			which_press = i;
+			which_sbl = sbl;
+
+			BasemenuItem *item = menuitems->find(w);
+
+			if (item->submenu())
+				drawSubmenu(w);
+			else
+				drawItem(w, (item->isEnabled()), True);
+		}
+	} else {
+		menu.x_move = be->x_root - menu.x;
+		menu.y_move = be->y_root - menu.y;
+	}
+}
+
+
+void Basemenu::buttonReleaseEvent(XButtonEvent *re) {
+	if (re->window == menu.title) {
+		if (moving) {
+			moving = False;
+			
+			if (which_sub != -1)
+				drawSubmenu(which_sub);
+		}
+		
+		if (re->x >= 0 && re->x <= (signed) menu.width &&
+				re->y >= 0 && re->y <= (signed) menu.title_h)
+			if (re->button == 3)
+				hide();
+			} else if (re->window == menu.frame &&
+				re->x >= 0 && re->x < (signed) menu.width &&
+				re->y >= 0 && re->y < (signed) menu.frame_h) {
+			
+			if (re->button == 3) {
+				hide();
+			} else {
+				int sbl = (re->x / menu.item_w), i = (re->y / menu.item_h),
+					ix = sbl * menu.item_w, iy = i * menu.item_h,
+					w = (sbl * menu.persub) + i,
+					p = (which_sbl * menu.persub) + which_press;
+
+			if (w < menuitems->count() && w >= 0) {
+				drawItem(p, (p == which_sub), True);
+
+				if	(p == w && isItemEnabled(w)) {
+					if (re->x > ix && re->x < (signed) (ix + menu.item_w) &&
+							re->y > iy && re->y < (signed) (iy + menu.item_h)) {
+						itemSelected(re->button, w);
+					}
+				}
+			} else
+				drawItem(p, False, True);
+		}
+	}
+}
+
+
+void Basemenu::motionNotifyEvent(XMotionEvent *me) {
+	if (me->window == menu.title && (me->state & Button1Mask)) {
+		if (movable) {
+			if (! moving) {
+				if (parent && (! torn)) {
+					parent->drawItem(parent->which_sub, False, True);
+					parent->which_sub = -1;
+				}
+
+				moving = torn = True;
+
+				if (which_sub != -1)
+					drawSubmenu(which_sub);
+			} else {
+				menu.x = me->x_root - menu.x_move,
+				menu.y = me->y_root - menu.y_move;
+	
+				XMoveWindow(display, menu.window, menu.x, menu.y);
+
+				if (which_sub != -1)
+					drawSubmenu(which_sub);
+			}
+		}
+	} else if ((! (me->state & Button1Mask)) && me->window == menu.frame &&
+			 me->x >= 0 && me->x < (signed) menu.width &&
+			 me->y >= 0 && me->y < (signed) menu.frame_h) {
+		int sbl = (me->x / menu.item_w), i = (me->y / menu.item_h),
+		w = (sbl * menu.persub) + i;
+
+		if ((i != which_press || sbl != which_sbl) &&
+				(w < menuitems->count() && w >= 0)) {
+			if (which_press != -1 && which_sbl != -1) {
+				int p = (which_sbl * menu.persub) + which_press;
+				BasemenuItem *item = menuitems->find(p);
+
+				drawItem(p, False, True);
+				if (item->submenu()) {
+					if (item->submenu()->isVisible() &&
+							(! item->submenu()->isTorn())) {
+						item->submenu()->internal_hide();
+						which_sub = -1;
+					}
+				}
+			}
+
+			which_press = i;
+			which_sbl = sbl;
+
+			BasemenuItem *itmp = menuitems->find(w);
+
+			if (itmp->submenu())
+				drawSubmenu(w);
+			else
+				drawItem(w, (itmp->isEnabled()), True);
+		}
+	}
+}
+
+
+void Basemenu::exposeEvent(XExposeEvent *ee) {
+	if (ee->window == menu.title) {
+		redrawTitle();
+	} else if (ee->window == menu.frame) {
+		LinkedListIterator it(menuitems);
+
+		// this is a compilicated algorithm... lets do it step by step...
+		// first... we see in which sub level the expose starts... and how many
+		// items down in that sublevel
+
+		int sbl = (ee->x / menu.item_w), id = (ee->y / menu.item_h),
+			// next... figure out how many sublevels over the redraw spans
+			sbl_d = ((ee->x + ee->width) / menu.item_w),
+			// then we see how many items down to redraw
+			id_d = ((ee->y + ee->height) / menu.item_h);
+
+		if (id_d > menu.persub) id_d = menu.persub;
+
+		// draw the sublevels and the number of items the exposure spans
+		int i, ii;
+		for (i = sbl; i <= sbl_d; i++) {
+			// set the iterator to the first item in the sublevel needing redrawing
+			it.set(id + (i * menu.persub));
+			for (ii = id; ii <= id_d && it.current(); it++, ii++) {
+				int index = ii + (i * menu.persub);
+				// redraw the item
+				drawItem(index, (which_sub == index), False,
+					 ee->x, ee->y, ee->width, ee->height);
+			}
+		}
+	}
+}
+
+
+void Basemenu::enterNotifyEvent(XCrossingEvent *ce) {
+	if (ce->window == menu.frame) {
+		menu.x_shift = menu.x, menu.y_shift = menu.y;
+		if (menu.x + menu.width > screen->getWidth()) {
+			menu.x_shift = screen->getWidth() - menu.width -
+				screen->getBorderWidth();
+			shifted = True;
+		} else if (menu.x < 0) {
+			menu.x_shift = -screen->getBorderWidth();
+			shifted = True;
+		}
+
+		if (menu.y + menu.height > screen->getHeight()) {
+			menu.y_shift = screen->getHeight() - menu.height -
+				screen->getBorderWidth();
+			shifted = True;
+		} else if (menu.y + (signed) menu.title_h < 0) {
+			menu.y_shift = -screen->getBorderWidth();
+			shifted = True;
+		}
+
+		if (shifted)
+			XMoveWindow(display, menu.window, menu.x_shift, menu.y_shift);
+
+		if (which_sub != -1) {
+			BasemenuItem *tmp = menuitems->find(which_sub);
+			if (tmp->submenu()->isVisible()) {
+				int sbl = (ce->x / menu.item_w), i = (ce->y / menu.item_h),
+				w = (sbl * menu.persub) + i;
+
+				if (w != which_sub && (! tmp->submenu()->isTorn())) {
+					tmp->submenu()->internal_hide();
+
+					drawItem(which_sub, False, True);
+					which_sub = -1;
+				}
+			}
+		}
+	}
+}
+
+
+void Basemenu::leaveNotifyEvent(XCrossingEvent *ce) {
+	if (ce->window == menu.frame) {
+		if (which_press != -1 && which_sbl != -1 && menuitems->count() > 0) {
+			int p = (which_sbl * menu.persub) + which_press;
+
+			drawItem(p, (p == which_sub), True);
+
+			which_sbl = which_press = -1;
+		}
+
+		if (shifted) {
+			XMoveWindow(display, menu.window, menu.x, menu.y);
+			shifted = False;
+
+			if (which_sub != -1) drawSubmenu(which_sub);
+		}
+	}
+}
+
+
+void Basemenu::reconfigure(void) {
+	XSetWindowBackground(display, menu.window,
+					 screen->getBorderColor()->getPixel());
+	XSetWindowBorder(display, menu.window,
+			 screen->getBorderColor()->getPixel());
+	XSetWindowBorderWidth(display, menu.window, screen->getBorderWidth());
+
+	menu.bevel_w = screen->getBevelWidth();
+	update();
+}
diff --git a/src/Basemenu.hh b/src/Basemenu.hh
new file mode 100644
index 00000000..27aed54b
--- /dev/null
+++ b/src/Basemenu.hh
@@ -0,0 +1,192 @@
+// Basemenu.hh for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef   __Basemenu_hh
+#define   __Basemenu_hh
+
+#include 
+
+// forward declarations
+class Basemenu;
+class BasemenuItem;
+
+class Fluxbox;
+class BImageControl;
+class BScreen;
+
+#include "LinkedList.hh"
+
+
+class Basemenu {
+private:
+  LinkedList *menuitems;
+  Fluxbox *fluxbox;
+  Basemenu *parent;
+  BImageControl *image_ctrl;
+  BScreen *screen;
+
+  Bool moving, visible, movable, torn, internal_menu, title_vis, shifted,
+    hide_tree;
+  Display *display;
+  int which_sub, which_press, which_sbl, alignment;
+
+  struct _menu {
+    Pixmap frame_pixmap, title_pixmap, hilite_pixmap, sel_pixmap;
+    Window window, frame, title;
+
+    char *label;
+    int x, y, x_move, y_move, x_shift, y_shift, sublevels, persub, minsub,
+      grab_x, grab_y;
+    unsigned int width, height, title_h, frame_h, item_w, item_h, bevel_w,
+      bevel_h;
+  } menu;
+
+
+protected:
+  inline BasemenuItem *find(int index) { return menuitems->find(index); }
+  inline void setTitleVisibility(Bool b) { title_vis = b; }
+  inline void setMovable(Bool b) { movable = b; }
+  inline void setHideTree(Bool h) { hide_tree = h; }
+  inline void setMinimumSublevels(int m) { menu.minsub = m; }
+
+  virtual void itemSelected(int, int) = 0;
+  virtual void drawItem(int, Bool = False, Bool = False,
+			int = -1, int = -1, unsigned int = 0, unsigned int = 0);
+  virtual void redrawTitle();
+  virtual void internal_hide(void);
+
+
+public:
+  Basemenu(BScreen *);
+  virtual ~Basemenu(void);
+
+  inline const Bool &isTorn(void) const { return torn; }
+  inline const Bool &isVisible(void) const { return visible; }
+
+  inline BScreen *getScreen(void) { return screen; }
+
+  inline const Window &getWindowID(void) const { return menu.window; }
+
+  inline const char *getLabel(void) const { return menu.label; }
+
+  int insert(const char *, int = 0, const char * = (const char *) 0, int = -1);
+  int insert(const char **, int = -1, int = 0);
+  int insert(const char *, Basemenu *, int = -1);
+  int remove(int);
+
+  inline const int &getX(void) const { return menu.x; }
+  inline const int &getY(void) const { return menu.y; }
+  inline int getCount(void) { return menuitems->count(); }
+  inline const int &getCurrentSubmenu(void) const { return which_sub; }
+
+  inline const unsigned int &getWidth(void) const { return menu.width; }
+  inline const unsigned int &getHeight(void) const { return menu.height; }
+  inline const unsigned int &getTitleHeight(void) const { return menu.title_h; }
+
+  inline void setInternalMenu(void) { internal_menu = True; }
+  inline void setAlignment(int a) { alignment = a; }
+  inline void setTorn(void) { torn = True; }
+  inline void removeParent(void)
+    { if (internal_menu) parent = (Basemenu *) 0; }
+
+  Bool hasSubmenu(int);
+  Bool isItemSelected(int);
+  Bool isItemEnabled(int);
+
+  void buttonPressEvent(XButtonEvent *);
+  void buttonReleaseEvent(XButtonEvent *);
+  void motionNotifyEvent(XMotionEvent *);
+  void enterNotifyEvent(XCrossingEvent *);
+  void leaveNotifyEvent(XCrossingEvent *);
+  void exposeEvent(XExposeEvent *);
+  void reconfigure(void);
+  void setLabel(const char *n);
+  void move(int, int);
+  void update(void);
+  void setItemSelected(int, Bool);
+  void setItemEnabled(int, Bool);
+
+  virtual void drawSubmenu(int);
+  virtual void show(void);
+  virtual void hide(void);
+
+  enum { AlignDontCare = 1, AlignTop, AlignBottom };
+  enum { Right = 1, Left };
+  enum { Empty = 0, Square, Triangle, Diamond };
+};
+
+
+class BasemenuItem {
+private:
+  Basemenu *s;
+  const char **u, *l, *e;
+  int f, enabled, selected;
+
+  friend class Basemenu;
+
+
+protected:
+
+
+public:
+  BasemenuItem(const char *lp, int fp, const char *ep = (const char *) 0) {
+    l = lp;
+    e = ep;
+    s = 0;
+    f = fp;
+    u = 0;
+    enabled = 1;
+    selected = 0;
+  }
+
+  BasemenuItem(const char *lp, Basemenu *mp) {
+    l = lp;
+    s = mp;
+    e = 0;
+    f = 0;
+    u = 0;
+    enabled = 1;
+    selected = 0;
+  }
+
+  BasemenuItem(const char **up, int fp) {
+    u = up;
+    l = e = 0;
+    f = fp;
+    s = 0;
+    enabled = 1;
+    selected = 0;
+  }
+
+  inline const char *exec(void) const { return e; }
+  inline const char *label(void) const { return l; }
+  inline const char **ulabel(void) const { return u; }
+  inline const int &function(void) const { return f; }
+  inline Basemenu *submenu(void) { return s; }
+
+  inline const int &isEnabled(void) const { return enabled; }
+  inline void setEnabled(int e) { enabled = e; }
+  inline const int &isSelected(void) const { return selected; }
+  inline void setSelected(int s) { selected = s; }
+};
+
+
+#endif // __Basemenu_hh
diff --git a/src/Clientmenu.cc b/src/Clientmenu.cc
new file mode 100644
index 00000000..e8731245
--- /dev/null
+++ b/src/Clientmenu.cc
@@ -0,0 +1,63 @@
+// Clientmenu.cc for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// stupid macros needed to access some functions in version 2 of the GNU C
+// library
+#ifndef   _GNU_SOURCE
+#define   _GNU_SOURCE
+#endif // _GNU_SOURCE
+
+#ifdef    HAVE_CONFIG_H
+#  include "../config.h"
+#endif // HAVE_CONFIG_H
+
+#include "fluxbox.hh"
+#include "Clientmenu.hh"
+#include "Screen.hh"
+#include "Window.hh"
+#include "Workspace.hh"
+#include "Workspacemenu.hh"
+
+
+Clientmenu::Clientmenu(Workspace *ws) : Basemenu(ws->getScreen()) {
+  wkspc = ws;
+  screen = wkspc->getScreen();
+
+  setInternalMenu();
+}
+
+
+void Clientmenu::itemSelected(int button, int index) {
+  if (button > 2) return;
+
+  FluxboxWindow *win = wkspc->getWindow(index);
+  if (win) {
+    if (button == 1) {
+      if (! wkspc->isCurrent()) wkspc->setCurrent();
+    } else if (button == 2) {
+      if (! wkspc->isCurrent()) win->deiconify(True, False);
+    }
+    wkspc->raiseWindow(win);
+    win->setInputFocus();
+  }
+
+  if (! (screen->getWorkspacemenu()->isTorn() || isTorn())) hide();
+}
diff --git a/src/Clientmenu.hh b/src/Clientmenu.hh
new file mode 100644
index 00000000..00a77f32
--- /dev/null
+++ b/src/Clientmenu.hh
@@ -0,0 +1,49 @@
+// Clientmenu.hh for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef   __Clientmenu_hh
+#define   __Clientmenu_hh
+
+// forward declarations
+class Clientmenu;
+
+#include "Basemenu.hh"
+#include "Workspace.hh"
+#include "fluxbox.hh"
+
+
+class Clientmenu : public Basemenu {
+private:
+  BScreen *screen;
+  Workspace *wkspc;
+
+
+protected:
+  virtual void itemSelected(int, int);
+
+
+public:
+  Clientmenu(Workspace *);
+};
+
+
+#endif // __Clientmenu_hh
+
diff --git a/src/Configmenu.cc b/src/Configmenu.cc
new file mode 100644
index 00000000..b7017542
--- /dev/null
+++ b/src/Configmenu.cc
@@ -0,0 +1,814 @@
+// Configmenu.cc for Blackbox - An X11 Window Manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.	IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// stupid macros needed to access some functions in version 2 of the GNU C
+// library
+#ifndef	 _GNU_SOURCE
+#	define _GNU_SOURCE
+#endif // _GNU_SOURCE
+
+#ifdef		HAVE_CONFIG_H
+# include "../config.h"
+#endif // HAVE_CONFIG_H
+
+#include "i18n.hh"
+#include "Configmenu.hh"
+#include "Toolbar.hh"
+#include "Window.hh"
+
+#define CMENU_USE_TABS	8
+#define CMENU_USE_ICONS	9
+#define CMENU_TAB_ROTATE 21
+
+Configmenu::Configmenu(BScreen *scr) : Basemenu(scr) {
+	screen = scr;
+	
+	I18n *i18n = I18n::instance();
+	
+	setLabel(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuConfigOptions,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Config options"));
+	
+	setInternalMenu();
+
+	focusmenu = new Focusmenu(this);
+	placementmenu = new Placementmenu(this);
+	tabmenu = new Tabmenu(this);
+
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuFocusModel,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Focus Model"), focusmenu);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuWindowPlacement,
+#else //! NLS
+				0, 0,
+#endif // NLS
+				"Window Placement"), placementmenu);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuTabPlacement,
+#else // !NLS
+				0, 0,
+#endif	// NLS
+				"Tab Placement"), tabmenu);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuImageDithering,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Image Dithering"), 1);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuOpaqueMove,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Opaque Window Moving"), 2);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuFullMax,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Full Maximization"), 3);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuFocusNew,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Focus New Windows"), 4);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuFocusLast,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Focus Last Window on Workspace"), 5);
+
+    insert(i18n->getMessage(
+#ifdef   NLS
+       ConfigmenuSet, ConfigmenuTabs,
+#else // !NLS
+       0, 0,
+#endif // NLS
+       "Use Tabs"), CMENU_USE_TABS);
+ insert(i18n->getMessage(
+#ifdef   NLS
+       ConfigmenuSet, ConfigmenuIcons,
+#else // !NLS
+       0, 0,
+#endif // NLS
+       "Use Icons"), CMENU_USE_ICONS);
+
+
+
+	update();
+
+	setItemSelected(3, screen->getImageControl()->doDither());
+	setItemSelected(4, screen->doOpaqueMove());
+	setItemSelected(5, screen->doFullMax());
+	setItemSelected(6, screen->doFocusNew());
+	setItemSelected(7, screen->doFocusLast());
+	setItemSelected(CMENU_USE_TABS, Fluxbox::instance()->useTabs());
+	setItemSelected(CMENU_USE_ICONS, Fluxbox::instance()->useIconBar());
+}
+
+
+Configmenu::~Configmenu(void) {
+	delete focusmenu;
+	delete placementmenu;
+	delete tabmenu;
+}
+
+
+void Configmenu::itemSelected(int button, int index) {
+	if (button == 1) {
+		BasemenuItem *item = find(index);
+
+		if (item->function())
+			switch(item->function()) {
+			case 1:  // dither
+				screen->getImageControl()->
+				setDither((! screen->getImageControl()->doDither()));
+
+				setItemSelected(index, screen->getImageControl()->doDither());
+
+				break;
+
+			case 2:  // opaque move
+				screen->saveOpaqueMove((! screen->doOpaqueMove()));
+
+				setItemSelected(index, screen->doOpaqueMove());
+
+				break;
+
+			case 3:  // full maximization
+				screen->saveFullMax((! screen->doFullMax()));
+
+				setItemSelected(index, screen->doFullMax());
+
+				break;
+			case 4:  // focus new windows
+				screen->saveFocusNew((! screen->doFocusNew()));
+
+				setItemSelected(index, screen->doFocusNew());
+				break;
+
+			case 5:  // focus last window on workspace
+				screen->saveFocusLast((! screen->doFocusLast()));
+				setItemSelected(index, screen->doFocusLast());
+				break;
+			case CMENU_USE_TABS: 
+				{
+					Fluxbox *fluxbox = Fluxbox::instance();
+					fluxbox->saveTabs(!fluxbox->useTabs());
+					setItemSelected(index, fluxbox->useTabs());
+					screen->reconfigure();
+				}
+				break;
+			case CMENU_USE_ICONS:
+				{
+					Fluxbox *fluxbox = Fluxbox::instance();
+					fluxbox->saveIconBar(!fluxbox->useIconBar());
+					setItemSelected(index, fluxbox->useIconBar());
+					screen->reconfigure();
+				}
+				break;
+			}
+		}
+}
+
+
+void Configmenu::reconfigure(void) {
+	focusmenu->reconfigure();
+	placementmenu->reconfigure();
+	tabmenu->reconfigure();
+
+	Basemenu::reconfigure();
+}
+
+
+Configmenu::Focusmenu::Focusmenu(Configmenu *cm) : Basemenu(cm->screen) {
+	configmenu = cm;
+	I18n *i18n = I18n::instance();
+	setLabel(i18n->getMessage(
+#ifdef		NLS
+					ConfigmenuSet, ConfigmenuFocusModel,
+#else // !NLS
+					0, 0,
+#endif // NLS
+					"Focus Model"));
+	setInternalMenu();
+
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuClickToFocus,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Click To Focus"), 1);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuSloppyFocus,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Sloppy Focus"), 2);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuSemiSloppyFocus,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Semi Sloppy Focus"), 3);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuAutoRaise,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Auto Raise"), 3);
+
+	update();
+
+	setItemSelected(0, !(configmenu->screen->isSloppyFocus() || 
+							configmenu->screen->isSemiSloppyFocus()));
+	setItemSelected(1, configmenu->screen->isSloppyFocus());
+	setItemSelected(2, configmenu->screen->isSemiSloppyFocus());
+	setItemEnabled(3, (configmenu->screen->isSloppyFocus() ||
+						configmenu->screen->isSemiSloppyFocus()));
+	setItemSelected(3, configmenu->screen->doAutoRaise());
+}
+
+
+void Configmenu::Focusmenu::itemSelected(int button, int index) {
+	if (button == 1) {
+		BasemenuItem *item = find(index);
+
+		if (item->function()) {
+			switch (item->function()) {
+			case 1: // click to focus
+				configmenu->screen->saveSloppyFocus(False);
+				configmenu->screen->saveSemiSloppyFocus(False);
+				configmenu->screen->saveAutoRaise(False);
+
+				if (! Fluxbox::instance()->getFocusedWindow()) {
+					XSetInputFocus(Fluxbox::instance()->getXDisplay(),
+						configmenu->screen->getToolbar()->getWindowID(),
+						RevertToParent, CurrentTime);
+				} else {
+					XSetInputFocus(Fluxbox::instance()->getXDisplay(),
+			 			Fluxbox::instance()->getFocusedWindow()->getClientWindow(),
+			 			RevertToParent, CurrentTime);
+				}
+
+				configmenu->screen->reconfigure();
+
+			break;
+
+			case 2: // sloppy focus
+				configmenu->screen->saveSemiSloppyFocus(False);
+				configmenu->screen->saveSloppyFocus(True);
+
+				configmenu->screen->reconfigure();
+
+			break;
+
+			case 3: // semi sloppy focus
+				configmenu->screen->saveSloppyFocus(False);
+				configmenu->screen->saveSemiSloppyFocus(True);
+
+				configmenu->screen->reconfigure();
+
+			break;
+
+			case 4: // auto raise with sloppy focus
+				Bool change = ((configmenu->screen->doAutoRaise()) ? False : True);
+				configmenu->screen->saveAutoRaise(change);
+
+			break;
+			}
+
+			setItemSelected(0, !(configmenu->screen->isSloppyFocus() || 
+							configmenu->screen->isSemiSloppyFocus()));
+			setItemSelected(1, configmenu->screen->isSloppyFocus());
+			setItemSelected(2, configmenu->screen->isSemiSloppyFocus());
+			setItemEnabled(3, (configmenu->screen->isSloppyFocus() ||
+						configmenu->screen->isSemiSloppyFocus()));
+			setItemSelected(3, configmenu->screen->doAutoRaise());
+		}
+	}
+}
+
+
+Configmenu::Placementmenu::Placementmenu(Configmenu *cm) : Basemenu(cm->screen) {
+	configmenu = cm;
+	I18n *i18n = I18n::instance();
+
+	setLabel(i18n->getMessage(
+#ifdef		NLS
+					ConfigmenuSet, ConfigmenuWindowPlacement,
+#else // !NLS
+					0, 0,
+#endif // NLS
+					"Window Placement"));
+	setInternalMenu();
+
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuSmartRows,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Smart Placement (Rows)"), BScreen::RowSmartPlacement);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuSmartCols,
+#else // !NLS
+				0, 0,
+#endif // NLS
+			"Smart Placement (Columns)"), BScreen::ColSmartPlacement);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuCascade,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Cascade Placement"), BScreen::CascadePlacement);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuLeftRight,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Left to Right"), BScreen::LeftRight);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuRightLeft,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Right to Left"), BScreen::RightLeft);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuTopBottom,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Top to Bottom"), BScreen::TopBottom);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuBottomTop,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Bottom to Top"), BScreen::BottomTop);
+
+	update();
+
+	switch (configmenu->screen->getPlacementPolicy()) {
+	case BScreen::RowSmartPlacement:
+		setItemSelected(0, True);
+		break;
+
+	case BScreen::ColSmartPlacement:
+		setItemSelected(1, True);
+		break;
+
+	case BScreen::CascadePlacement:
+		setItemSelected(2, True);
+		break;
+	}
+
+	Bool rl = (configmenu->screen->getRowPlacementDirection() ==
+				BScreen::LeftRight),
+				tb = (configmenu->screen->getColPlacementDirection() ==
+				BScreen::TopBottom);
+
+	setItemSelected(3, rl);
+	setItemSelected(4, ! rl);
+
+	setItemSelected(5, tb);
+	setItemSelected(6, ! tb);
+}
+
+
+void Configmenu::Placementmenu::itemSelected(int button, int index) {
+	if (button == 1) {
+		BasemenuItem *item = find(index);
+
+		if (item->function()) {
+			switch (item->function()) {
+			case BScreen::RowSmartPlacement:
+				configmenu->screen->savePlacementPolicy(item->function());
+
+				setItemSelected(0, True);
+				setItemSelected(1, False);
+				setItemSelected(2, False);
+				
+				break;
+
+			case BScreen::ColSmartPlacement:
+				configmenu->screen->savePlacementPolicy(item->function());
+
+				setItemSelected(0, False);
+				setItemSelected(1, True);
+				setItemSelected(2, False);
+
+				break;
+
+			case BScreen::CascadePlacement:
+				configmenu->screen->savePlacementPolicy(item->function());
+
+				setItemSelected(0, False);
+				setItemSelected(1, False);
+				setItemSelected(2, True);
+
+				break;
+
+			case BScreen::LeftRight:
+				configmenu->screen->saveRowPlacementDirection(BScreen::LeftRight);
+
+				setItemSelected(3, True);
+				setItemSelected(4, False);
+
+				break;
+
+			case BScreen::RightLeft:
+				configmenu->screen->saveRowPlacementDirection(BScreen::RightLeft);
+
+				setItemSelected(3, False);
+				setItemSelected(4, True);
+
+	break;
+
+			case BScreen::TopBottom:
+	configmenu->screen->saveColPlacementDirection(BScreen::TopBottom);
+
+	setItemSelected(5, True);
+	setItemSelected(6, False);
+
+	break;
+
+			case BScreen::BottomTop:
+	configmenu->screen->saveColPlacementDirection(BScreen::BottomTop);
+
+	setItemSelected(5, False);
+	setItemSelected(6, True);
+
+	break;
+			}
+		}
+	}
+}
+
+Configmenu::Tabmenu::Tabmenu(Configmenu *cm) : Basemenu(cm->screen) {
+	configmenu = cm;
+	I18n *i18n = I18n::instance();
+
+	setLabel(i18n->getMessage(
+#ifdef		NLS
+					ConfigmenuSet, ConfigmenuTabPlacement,
+#else // !NLS
+					0, 0,
+#endif // NLS
+					"Tab Placement"));
+	setInternalMenu();
+
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementTopLeft,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Top Left"), Tab::PTop + Tab::ALeft);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementTopCenter,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Top Center"), Tab::PTop + Tab::ACenter);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementTopRight,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Top Right"), Tab::PTop + Tab::ARight);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementTopRelative,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Top Relative"), Tab::PTop + Tab::ARelative);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementBottomLeft,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Bottom Left"), Tab::PBottom + Tab::ALeft);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementBottomCenter,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Bottom Center"), Tab::PBottom + Tab::ACenter);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementBottomRight,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Bottom Right"), Tab::PBottom + Tab::ARight);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementBottomRelative,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Bottom Relative"), Tab::PBottom + Tab::ARelative);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementLeftTop,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Left Top"), Tab::PLeft + Tab::ARight);
+	insert(i18n->getMessage(
+#ifdef	NLS
+				CommonSet, CommonPlacementLeftCenter,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Left Center"), Tab::PLeft + Tab::ACenter);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementLeftBottom,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Left Bottom"), Tab::PLeft + Tab::ALeft);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementLeftRelative,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Left Relative"), Tab::PLeft + Tab::ARelative);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementRightTop,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Right Top"), Tab::PRight + Tab::ARight);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementRightCenter,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Right Center"), Tab::PRight + Tab::ACenter);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementRightBottom,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Right Bottom"), Tab::PRight + Tab::ALeft);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementRightRelative,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Right Relative"), Tab::PRight + Tab::ARelative);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ConfigmenuSet, ConfigmenuTabRotateVertical,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Rotate Vertical Tabs"), CMENU_TAB_ROTATE);
+	update();
+	setSelected();
+}
+
+
+void Configmenu::Tabmenu::itemSelected(int button, int index) {
+	if (button == 1) {
+		fprintf(stderr, "Item(%d)\n", index);
+		BasemenuItem *item = find(index);
+		
+		switch (item->function()) {
+			case (Tab::PTop + Tab::ALeft):
+				configmenu->screen->saveTabPlacement(Tab::PTop);
+				configmenu->screen->saveTabAlignment(Tab::ALeft);
+
+				configmenu->screen->reconfigure();
+
+				break;
+
+			case (Tab::PTop + Tab::ACenter):
+				configmenu->screen->saveTabPlacement(Tab::PTop);
+				configmenu->screen->saveTabAlignment(Tab::ACenter);
+
+				configmenu->screen->reconfigure();
+
+				break;
+
+			case (Tab::PTop + Tab::ARight):
+				configmenu->screen->saveTabPlacement(Tab::PTop);
+				configmenu->screen->saveTabAlignment(Tab::ARight);
+
+				configmenu->screen->reconfigure();
+
+				break;
+
+			case (Tab::PTop + Tab::ARelative):
+				configmenu->screen->saveTabPlacement(Tab::PTop);
+				configmenu->screen->saveTabAlignment(Tab::ARelative);
+
+				configmenu->screen->reconfigure();
+
+				break;
+
+			case (Tab::PBottom + Tab::ALeft):
+				configmenu->screen->saveTabPlacement(Tab::PBottom);
+				configmenu->screen->saveTabAlignment(Tab::ALeft);
+
+				configmenu->screen->reconfigure();
+
+				break;
+			case (Tab::PBottom + Tab::ACenter):
+				configmenu->screen->saveTabPlacement(Tab::PBottom);
+				configmenu->screen->saveTabAlignment(Tab::ACenter);
+
+				configmenu->screen->reconfigure();
+
+				break;
+
+			case (Tab::PBottom + Tab::ARight):
+				configmenu->screen->saveTabPlacement(Tab::PBottom);
+				configmenu->screen->saveTabAlignment(Tab::ARight);
+
+				configmenu->screen->reconfigure();
+
+				break;
+
+			case (Tab::PBottom + Tab::ARelative):
+				configmenu->screen->saveTabPlacement(Tab::PBottom);
+				configmenu->screen->saveTabAlignment(Tab::ARelative);
+
+				configmenu->screen->reconfigure();
+
+				break;
+
+			case (Tab::PLeft + Tab::ARight):
+				configmenu->screen->saveTabPlacement(Tab::PLeft);
+				configmenu->screen->saveTabAlignment(Tab::ARight);
+
+				configmenu->screen->reconfigure();
+
+				break;
+
+			case (Tab::PLeft + Tab::ACenter):
+				configmenu->screen->saveTabPlacement(Tab::PLeft);
+				configmenu->screen->saveTabAlignment(Tab::ACenter);
+
+				configmenu->screen->reconfigure();
+
+				break;
+
+			case (Tab::PLeft + Tab::ALeft):
+				configmenu->screen->saveTabPlacement(Tab::PLeft);
+				configmenu->screen->saveTabAlignment(Tab::ALeft);
+
+				configmenu->screen->reconfigure();
+
+				break;
+
+			case (Tab::PLeft + Tab::ARelative):
+				configmenu->screen->saveTabPlacement(Tab::PLeft);
+				configmenu->screen->saveTabAlignment(Tab::ARelative);
+
+				configmenu->screen->reconfigure();
+
+				break;
+
+			case (Tab::PRight + Tab::ARight):
+				configmenu->screen->saveTabPlacement(Tab::PRight);
+				configmenu->screen->saveTabAlignment(Tab::ARight);
+
+				configmenu->screen->reconfigure();
+
+				break;
+			case (Tab::PRight + Tab::ACenter):
+				configmenu->screen->saveTabPlacement(Tab::PRight);
+				configmenu->screen->saveTabAlignment(Tab::ACenter);
+
+				configmenu->screen->reconfigure();
+
+				break;
+
+			case (Tab::PRight + Tab::ALeft):
+				configmenu->screen->saveTabPlacement(Tab::PRight);
+				configmenu->screen->saveTabAlignment(Tab::ALeft);
+
+				configmenu->screen->reconfigure();
+
+				break;
+
+			case (Tab::PRight + Tab::ARelative):
+				configmenu->screen->saveTabPlacement(Tab::PRight);
+				configmenu->screen->saveTabAlignment(Tab::ARelative);
+
+				configmenu->screen->reconfigure();
+
+				break;
+
+			case CMENU_TAB_ROTATE:
+				if (configmenu->screen->isTabRotateVertical())
+					configmenu->screen->saveTabRotateVertical(False);
+				else
+					configmenu->screen->saveTabRotateVertical(True);
+				break;
+			}
+
+			Fluxbox::instance()->reconfigureTabs(); //TODO
+			setSelected();			
+	}
+}
+
+void Configmenu::Tabmenu::setSelected(void) {
+	setItemSelected(0, (configmenu->screen->getTabPlacement() == Tab::PTop &&
+						configmenu->screen->getTabAlignment() == Tab::ALeft));
+	setItemSelected(1, (configmenu->screen->getTabPlacement() == Tab::PTop &&
+						configmenu->screen->getTabAlignment() == Tab::ACenter));
+	setItemSelected(2, (configmenu->screen->getTabPlacement() == Tab::PTop &&
+						configmenu->screen->getTabAlignment() == Tab::ARight));
+	setItemSelected(3, (configmenu->screen->getTabPlacement() == Tab::PTop &&
+						configmenu->screen->getTabAlignment() == Tab::ARelative));
+	setItemSelected(4, (configmenu->screen->getTabPlacement() == Tab::PBottom &&
+						configmenu->screen->getTabAlignment() == Tab::ALeft));
+	setItemSelected(5, (configmenu->screen->getTabPlacement() == Tab::PBottom &&
+						configmenu->screen->getTabAlignment() == Tab::ACenter));
+	setItemSelected(6, (configmenu->screen->getTabPlacement() == Tab::PBottom &&
+						configmenu->screen->getTabAlignment() == Tab::ARight));
+	setItemSelected(7, (configmenu->screen->getTabPlacement() == Tab::PBottom &&
+						configmenu->screen->getTabAlignment() == Tab::ARelative));
+	setItemSelected(8, (configmenu->screen->getTabPlacement() == Tab::PLeft &&
+						configmenu->screen->getTabAlignment() == Tab::ARight));
+	setItemSelected(9, (configmenu->screen->getTabPlacement() == Tab::PLeft &&
+						configmenu->screen->getTabAlignment() == Tab::ACenter));
+	setItemSelected(10, (configmenu->screen->getTabPlacement() == Tab::PLeft &&
+						configmenu->screen->getTabAlignment() == Tab::ALeft));
+	setItemSelected(11, (configmenu->screen->getTabPlacement() == Tab::PLeft &&
+						configmenu->screen->getTabAlignment() == Tab::ARelative));
+	setItemSelected(12, (configmenu->screen->getTabPlacement() == Tab::PRight &&
+						configmenu->screen->getTabAlignment() == Tab::ARight));
+	setItemSelected(13, (configmenu->screen->getTabPlacement() == Tab::PRight &&
+						configmenu->screen->getTabAlignment() == Tab::ACenter));
+	setItemSelected(14, (configmenu->screen->getTabPlacement() == Tab::PRight &&
+						configmenu->screen->getTabAlignment() == Tab::ALeft));
+	setItemSelected(15, (configmenu->screen->getTabPlacement() == Tab::PRight &&
+						configmenu->screen->getTabAlignment() == Tab::ARelative));
+	setItemEnabled(16, (configmenu->screen->getTabPlacement() == Tab::PLeft ||
+						configmenu->screen->getTabPlacement() == Tab::PRight));
+	setItemSelected(16, (configmenu->screen->isTabRotateVertical() &&
+						(configmenu->screen->getTabPlacement() == Tab::PLeft ||
+						configmenu->screen->getTabPlacement() == Tab::PRight))); 
+}
diff --git a/src/Configmenu.hh b/src/Configmenu.hh
new file mode 100644
index 00000000..47136349
--- /dev/null
+++ b/src/Configmenu.hh
@@ -0,0 +1,95 @@
+// Configmenu.hh for Blackbox - An X11 Window Manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef   _CONFIGMENU_HH_
+#define   _CONFIGMENU_HH_
+
+// forward declaration
+class Configmenu;
+
+#include "Basemenu.hh"
+#include "Screen.hh"
+#include "fluxbox.hh"
+
+
+class Configmenu : public Basemenu {
+private:
+  class Focusmenu : public Basemenu {
+  private:
+    Configmenu *configmenu;
+
+  protected:
+    virtual void itemSelected(int, int);
+
+  public:
+    Focusmenu(Configmenu *);
+  };
+
+  class Placementmenu : public Basemenu {
+  private:
+    Configmenu *configmenu;
+
+  protected:
+    virtual void itemSelected(int, int);
+
+  public:
+    Placementmenu(Configmenu *);
+  };
+
+  class Tabmenu : public Basemenu {
+  private:
+    Configmenu *configmenu;
+		void setSelected(void);
+  protected:
+    virtual void itemSelected(int, int);
+
+  public:
+    Tabmenu(Configmenu *);
+  };
+
+//  Fluxbox *fluxbox;
+  BScreen *screen;
+  Focusmenu *focusmenu;
+  Placementmenu *placementmenu;
+  Tabmenu *tabmenu;
+
+  friend class Focusmenu;
+  friend class Placementmenu;
+  friend class Tabmenu;
+
+
+protected:
+  virtual void itemSelected(int, int);
+
+
+public:
+  Configmenu(BScreen *);
+  virtual ~Configmenu(void);
+
+  inline Basemenu *getFocusmenu(void) { return focusmenu; }
+  inline Basemenu *getPlacementmenu(void) { return placementmenu; }
+  inline Basemenu *getTabmenu(void) { return tabmenu; }
+
+  void reconfigure(void);
+};
+
+
+#endif // _CONFIGMENU_HH_
diff --git a/src/Icon.cc b/src/Icon.cc
new file mode 100644
index 00000000..6578bc87
--- /dev/null
+++ b/src/Icon.cc
@@ -0,0 +1,67 @@
+// Icon.cc for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.	IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// stupid macros needed to access some functions in version 2 of the GNU C
+// library
+#ifndef	 _GNU_SOURCE
+#define	 _GNU_SOURCE
+#endif // _GNU_SOURCE
+
+#ifdef		HAVE_CONFIG_H
+#	include "../config.h"
+#endif // HAVE_CONFIG_H
+
+#include "i18n.hh"
+#include "Icon.hh"
+#include "Screen.hh"
+#include "Window.hh"
+
+
+Iconmenu::Iconmenu(BScreen *scrn) : Basemenu(scrn) {
+	setInternalMenu();
+
+	screen = scrn;	
+	setLabel(I18n::instance()->getMessage(
+#ifdef		NLS
+					IconSet, IconIcons,
+#else // !NLS
+					0, 0,
+#endif // NLS
+					"Icons"));
+	update();
+}
+
+
+void Iconmenu::itemSelected(int button, int index) {
+	if (button == 1) {
+		if (index >= 0 && index < screen->getIconCount()) {
+			FluxboxWindow *win = screen->getIcon(index);
+
+			if (win) {
+				win->deiconify();
+				win->setInputFocus();
+			}
+		}
+
+		if (! (screen->getWorkspacemenu()->isTorn() || isTorn()))
+			hide();
+	}
+}
diff --git a/src/Icon.hh b/src/Icon.hh
new file mode 100644
index 00000000..fa4945ab
--- /dev/null
+++ b/src/Icon.hh
@@ -0,0 +1,48 @@
+// Icon.hh for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef _ICON_HH_
+#define _ICON_HH_
+
+// forward declaration
+class Iconmenu;
+
+class BScreen;
+
+#include "Basemenu.hh"
+#include "LinkedList.hh"
+
+
+class Iconmenu : public Basemenu {
+private:
+  BScreen *screen;
+
+
+protected:
+  virtual void itemSelected(int, int);
+
+
+public:
+  Iconmenu(BScreen *);
+};
+
+
+#endif //_ICON_HH_
diff --git a/src/IconBar.cc b/src/IconBar.cc
new file mode 100644
index 00000000..db3eabc5
--- /dev/null
+++ b/src/IconBar.cc
@@ -0,0 +1,341 @@
+// IconBar.cc 
+// Copyright (c) 2001 Henrik Kinnunen (fluxgen@linuxmail.org)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.	IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#include "IconBar.hh"
+#include "i18n.hh"
+
+IconBarObj::IconBarObj(FluxboxWindow *fluxboxwin, Window iconwin) {
+	m_iconwin = iconwin;
+	m_fluxboxwin = fluxboxwin;	
+}
+
+IconBarObj::~IconBarObj() {
+	
+}
+
+IconBar::IconBar(BScreen *scrn, Window parent) {
+	m_parent = parent;
+	m_screen = scrn;
+	m_iconlist = new IconList;	
+	m_display = scrn->getBaseDisplay()->getXDisplay();
+}
+
+IconBar::~IconBar() {
+	delete m_iconlist;
+}
+
+//------------ addIcon -----------------------
+// Adds icon to iconbar and repostions the 
+// icons.
+// returns window to iconobj
+//--------------------------------------------
+Window IconBar::addIcon(FluxboxWindow *fluxboxwin) {
+	
+	Window iconwin = createIconWindow(fluxboxwin, m_parent);
+	decorate(iconwin);	
+	//add window object to list	
+	m_iconlist->insert(new IconBarObj(fluxboxwin, iconwin));
+	//reposition all icons to fit windowbar
+	repositionIcons();
+	
+	XMapSubwindows(m_display, iconwin);
+	XMapWindow(m_display, iconwin);	
+	
+	return iconwin;
+}
+
+//----------- delIcon -------------------
+// Removes icon from list and
+// repositions the rest of the icons
+// Return X Window of the removed iconobj
+// returns None if no window was found
+//---------------------------------------
+Window IconBar::delIcon(FluxboxWindow *fluxboxwin) {
+	Window retwin = None;
+	IconBarObj *obj = findIcon(fluxboxwin);
+	if (obj) {
+		m_iconlist->remove(obj);								
+		retwin = obj->getIconWin();		
+		delete obj;				
+		XDestroyWindow(m_display, retwin);
+		repositionIcons();		
+	}		
+	return retwin;
+}
+
+//------------ loadTheme ---------------
+// renders theme to m_focus_pm
+// with the size width * height
+//--------------------------------------
+void IconBar::loadTheme(unsigned int width, unsigned int height) {
+	BImageControl *image_ctrl = m_screen->getImageControl();
+	Pixmap tmp = m_focus_pm;
+  BTexture *texture = &(m_screen->getWindowStyle()->tab.l_focus);
+	
+  if (texture->getTexture() & BImage_ParentRelative ) {
+	
+		BTexture *pt = &(m_screen->getWindowStyle()->tab.t_focus);
+		if (pt->getTexture() == (BImage_Flat | BImage_Solid)) {
+  	  m_focus_pm = None;
+	    m_focus_pixel = pt->getColor()->getPixel();
+  	} else
+	    m_focus_pm =
+  	    image_ctrl->renderImage(width, height, pt);	 
+		
+	} else {
+	
+		if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+  	  m_focus_pm = None;
+	    m_focus_pixel = texture->getColor()->getPixel();
+  	} else
+	    m_focus_pm =
+  	    image_ctrl->renderImage(width, height, texture);
+	}
+	 if (tmp) image_ctrl->removeImage(tmp);
+}
+
+//------------ decorate ------------------
+// sets the background pixmap/color, 
+// border, border width of the window
+//----------------------------------------
+void IconBar::decorate(Window win) {
+
+	XSetWindowBorderWidth(m_display, win, m_screen->getWindowStyle()->tab.border_width);
+	XSetWindowBorder(m_display, win, m_screen->getWindowStyle()->tab.border_color.getPixel());
+	if (m_focus_pm)
+		XSetWindowBackgroundPixmap(m_display, win, m_focus_pm);
+	else
+		XSetWindowBackground(m_display, win, m_focus_pixel);
+}
+
+
+//------------ reconfigure ---------------
+// Reconfigures the icons 
+// theme, pos and width
+//----------------------------------------
+void IconBar::reconfigure() {	
+	repositionIcons();
+	
+}
+//---------- exposeEvent -----------------
+// Handles the expose event
+// just redraws all the icons
+//----------------------------------------
+void IconBar::exposeEvent(XExposeEvent *ee) {
+	IconBarObj *obj=0;	
+	IconListIterator it(m_iconlist);	
+	for (; it.current(); it++) {
+		if (it.current()->getIconWin() == ee->window) {
+			obj = it.current();
+			break;
+		}
+	}	
+
+	if (obj) {
+				
+		Window root;
+		unsigned int width, height;
+		unsigned int border_width, depth;	//not used
+		int x, y;
+		XGetGeometry(m_display, m_parent, &root, &x, &y, &width, &height,
+					&border_width, &depth);
+	
+		//max width on every icon
+		unsigned int icon_width = width / m_iconlist->count();
+	
+		//load right size of theme
+		loadTheme(icon_width, height);
+				
+		draw(obj, icon_width);
+		
+	}	
+}
+
+//------------ repositionIcons ------------
+// Calculates and moves/resizes the icons
+//-----------------------------------------
+void IconBar::repositionIcons(void) {
+	if (!m_iconlist->count())
+		return;
+		
+	Window root;
+	unsigned int width, height;
+	unsigned int border_width, depth;	//not used
+	int x, y;
+	XGetGeometry(m_display, m_parent, &root, &x, &y, &width, &height,
+				&border_width, &depth);
+	
+	//max width on every icon
+	unsigned int icon_width = width / m_iconlist->count();
+	
+	//load right size of theme
+	loadTheme(icon_width, height);
+	
+	IconListIterator it(m_iconlist);	
+
+	for (x = 0; it.current(); it++, x+=icon_width) {
+		Window iconwin = it.current()->getIconWin();
+		XMoveResizeWindow(m_display, iconwin,
+						 x, 0,
+						 icon_width, height);	
+		draw(it.current(), icon_width);
+		decorate(iconwin);
+	}
+		
+}
+
+//------------ createIconWindow ----------------
+// creates the X Window of icon
+// returns the created X Window
+//----------------------------------------------
+Window IconBar::createIconWindow(FluxboxWindow *fluxboxwin, Window parent) {
+	unsigned long attrib_mask = CWBackPixmap | CWBackPixel | CWBorderPixel |
+			      CWColormap | CWOverrideRedirect | CWEventMask;
+	XSetWindowAttributes attrib;
+  attrib.background_pixmap = None;
+  attrib.background_pixel = attrib.border_pixel =
+			   fluxboxwin->getScreen()->getWindowStyle()->tab.border_color.getPixel();
+  attrib.colormap = fluxboxwin->getScreen()->getColormap();
+  attrib.override_redirect = True;
+  attrib.event_mask = ButtonPressMask | ButtonReleaseMask |
+                      ButtonMotionMask | ExposureMask | EnterWindowMask;
+											
+	//create iconwindow
+	Window iconwin = XCreateWindow(m_display, parent, 0, 0, 1, 1, 0,
+		  fluxboxwin->getScreen()->getDepth(), InputOutput, fluxboxwin->getScreen()->getVisual(),
+		  attrib_mask, &attrib);
+		
+	return iconwin;
+}
+
+//------------ draw ------------------
+// Draws theme and string to Window w
+//------------------------------------
+void IconBar::draw(IconBarObj *obj, int width) {
+	if (!obj)
+		return;
+	
+	FluxboxWindow *fluxboxwin = obj->getFluxboxWin();
+	Window iconwin = obj->getIconWin();
+	char *title = *fluxboxwin->getIconTitle();
+	unsigned int title_len = strlen(title);
+	unsigned int title_text_w;
+
+	if (I18n::instance()->multibyte()) {
+		XRectangle ink, logical;
+		XmbTextExtents(m_screen->getWindowStyle()->font.set,
+				title, title_len, &ink, &logical);
+		title_text_w = logical.width;
+	} else {
+		title_text_w = XTextWidth(m_screen->getWindowStyle()->font.fontstruct,
+				title, title_len);
+	}
+	
+	int l = title_text_w;
+	int dlen=title_len;
+	unsigned int bevel_w = m_screen->getBevelWidth();
+	int dx=bevel_w*2;
+		
+	for (; dlen >= 0; dlen--) {
+		if (I18n::instance()->multibyte()) {
+		XRectangle ink, logical;
+			XmbTextExtents(m_screen->getWindowStyle()->tab.font.set, 
+										title, dlen,
+										&ink, &logical);
+			l = logical.width;
+		} else
+			l = XTextWidth(m_screen->getWindowStyle()->tab.font.fontstruct, 
+								title, dlen);
+			l += (bevel_w * 4);
+
+		if (l < width)
+			break;
+	}
+	
+	
+	switch (m_screen->getWindowStyle()->tab.font.justify) {
+	case FFont::Right:
+		dx += width - l;
+		break;
+	case FFont::Center:
+		dx += (width - l) / 2;
+		break;
+	default:
+		break;
+	}
+
+	//Draw title to m_tabwin
+
+	XClearWindow(m_display, iconwin);		
+	
+	if (I18n::instance()->multibyte()) {
+		XmbDrawString(m_display, iconwin,
+			m_screen->getWindowStyle()->tab.font.set,
+			m_screen->getWindowStyle()->tab.l_text_focus_gc, dx, 
+			 1 - m_screen->getWindowStyle()->tab.font.set_extents->max_ink_extent.y,
+			title, dlen);
+	} else {
+		XDrawString(m_display, iconwin,
+			m_screen->getWindowStyle()->tab.l_text_focus_gc, dx,
+			m_screen->getWindowStyle()->tab.font.fontstruct->ascent + 1, 
+			title, dlen);
+	}	
+
+}
+
+//------------ findWindow ----------
+// Tries to find the FluxboxWindow of the X Window
+// in iconbar
+// returns the fluxboxwindow on success else
+// 0 on failure
+//----------------------------------
+FluxboxWindow *IconBar::findWindow(Window w) {
+
+	IconListIterator it(m_iconlist);	
+	
+	for (; it.current(); it++) {
+		IconBarObj *tmp = it.current();
+		if (tmp)
+			if (tmp->getIconWin() == w)
+				return tmp->getFluxboxWin();			
+	}
+	
+	return 0;
+}
+
+//----------- findIcon ---------------
+// Tries to find a fluxboxwin icon in the iconlist
+// returns pointer to IconBarObj on success else 
+// 0 on failure
+//------------------------------------
+IconBarObj *IconBar::findIcon(FluxboxWindow *fluxboxwin) {
+
+	IconListIterator it(m_iconlist);	
+	
+	for (; it.current(); it++) {
+		IconBarObj *tmp = it.current();
+		if (tmp)
+			if (tmp->getFluxboxWin() == fluxboxwin)
+				return tmp;			
+	}
+	
+	return 0;
+}
diff --git a/src/IconBar.hh b/src/IconBar.hh
new file mode 100644
index 00000000..f6b75091
--- /dev/null
+++ b/src/IconBar.hh
@@ -0,0 +1,72 @@
+// IconBar.hh
+// Copyright (c) 2001 Henrik Kinnunen (fluxgen@linuxmail.org)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.	IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+#ifndef _ICONBAR_HH_
+#define _ICONBAR_HH_
+
+#include 
+#include "Window.hh"
+#include "LinkedList.hh"
+
+class Fluxbox;
+
+class IconBarObj
+{
+public:	
+	IconBarObj(FluxboxWindow *fluxboxwin, Window iconwin);
+	~IconBarObj();
+	inline Window getIconWin(void) { return m_iconwin; }
+	inline FluxboxWindow *getFluxboxWin(void)  { return m_fluxboxwin; }
+private:
+	Window m_iconwin;
+	FluxboxWindow *m_fluxboxwin;
+};
+
+typedef LinkedList IconList;
+typedef LinkedListIterator IconListIterator;
+
+class IconBar
+{
+public:
+	IconBar(BScreen *scrn, Window parent);
+	~IconBar();
+	void draw();
+	void reconfigure();
+	Window addIcon(FluxboxWindow *fluxboxwin);
+	Window delIcon(FluxboxWindow *fluxboxwin);
+	void buttonPressEvent(XButtonEvent *be);	
+	FluxboxWindow *findWindow(Window w);
+	void exposeEvent(XExposeEvent *ee);
+private:
+	void draw(IconBarObj *obj, int width);
+	void loadTheme(unsigned int width, unsigned int height);
+	void decorate(Window win);
+	IconBarObj *findIcon(FluxboxWindow *fluxboxwin);
+	void repositionIcons(void);
+	Window createIconWindow(FluxboxWindow *fluxboxwin, Window parent);
+	BScreen *m_screen;
+	Display *m_display;
+	Window m_parent;
+	IconList *m_iconlist;	
+	Pixmap m_focus_pm;
+	unsigned long m_focus_pixel;
+};
+
+#endif // _ICONBAR_HH_
diff --git a/src/Image.cc b/src/Image.cc
new file mode 100644
index 00000000..feebba89
--- /dev/null
+++ b/src/Image.cc
@@ -0,0 +1,2593 @@
+// Image.cc for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// stupid macros needed to access some functions in version 2 of the GNU C
+// library
+#ifndef   _GNU_SOURCE
+#define   _GNU_SOURCE
+#endif // _GNU_SOURCE
+
+#ifdef    HAVE_CONFIG_H
+#  include "../config.h"
+#endif // HAVE_CONFIG_H
+
+#include "i18n.hh"
+#include "BaseDisplay.hh"
+#include "Image.hh"
+
+#ifdef    HAVE_SYS_TYPES_H
+#  include 
+#endif // HAVE_SYS_TYPES_H
+
+#ifndef u_int32_t
+#  ifdef uint_32_t
+typedef uint32_t u_int32_t;
+#  else
+#    ifdef __uint32_t
+typedef __uint32_t u_int32_t;
+#    else
+typedef unsigned int u_int32_t;
+#    endif
+#  endif
+#endif
+
+#ifdef    STDC_HEADERS
+#  include 
+#  include 
+#endif // STDC_HEADERS
+
+#ifdef    HAVE_STDIO_H
+#  include 
+#endif // HAVE_STDIO_H
+
+#ifdef    HAVE_CTYPE_H
+#  include 
+#endif // HAVE_CTYPE_H
+
+static unsigned long bsqrt(unsigned long x) {
+  if (x <= 0) return 0;
+  if (x == 1) return 1;
+
+  unsigned long r = x >> 1;
+  unsigned long q;
+
+  while (1) {
+    q = x / r;
+    if (q >= r) return r;
+    r = (r + q) >> 1;
+  }
+}
+
+
+BImage::BImage(BImageControl *c, unsigned int w, unsigned int h) {
+  control = c;
+
+  width = ((signed) w > 0) ? w : 1;
+  height = ((signed) h > 0) ? h : 1;
+
+  red = new unsigned char[width * height];
+  green = new unsigned char[width * height];
+  blue = new unsigned char[width * height];
+
+  xtable = ytable = (unsigned int *) 0;
+
+  cpc = control->getColorsPerChannel();
+  cpccpc = cpc * cpc;
+
+  control->getColorTables(&red_table, &green_table, &blue_table,
+                          &red_offset, &green_offset, &blue_offset,
+                          &red_bits, &green_bits, &blue_bits);
+
+  if (control->getVisual()->c_class != TrueColor)
+    control->getXColorTable(&colors, &ncolors);
+}
+
+
+BImage::~BImage(void) {
+  if (red) delete [] red;
+  if (green) delete [] green;
+  if (blue) delete [] blue;
+}
+
+
+Pixmap BImage::render(BTexture *texture) {
+  if (texture->getTexture() & BImage_ParentRelative)
+    return ParentRelative;
+  else if (texture->getTexture() & BImage_Solid)
+    return render_solid(texture);
+  else if (texture->getTexture() & BImage_Gradient)
+    return render_gradient(texture);
+
+  return None;
+}
+
+
+Pixmap BImage::render_solid(BTexture *texture) {
+	Pixmap pixmap = XCreatePixmap(control->getBaseDisplay()->getXDisplay(),
+				control->getDrawable(), width,
+				height, control->getDepth());
+	if (pixmap == None) {
+		fprintf(stderr,
+			I18n::instance()->getMessage(
+#ifdef    NLS
+				ImageSet, ImageErrorCreatingSolidPixmap,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"BImage::render_solid: error creating pixmap\n"));
+		return None;
+	}
+
+	XGCValues gcv;
+	GC gc, hgc, lgc;
+
+	gcv.foreground = texture->getColor()->getPixel();
+	gcv.fill_style = FillSolid;
+	gc = XCreateGC(control->getBaseDisplay()->getXDisplay(), pixmap,
+			GCForeground | GCFillStyle, &gcv);
+
+	gcv.foreground = texture->getHiColor()->getPixel();
+	hgc = XCreateGC(control->getBaseDisplay()->getXDisplay(), pixmap,
+			GCForeground, &gcv);
+
+	gcv.foreground = texture->getLoColor()->getPixel();
+	lgc = XCreateGC(control->getBaseDisplay()->getXDisplay(), pixmap,
+			GCForeground, &gcv);
+
+	XFillRectangle(control->getBaseDisplay()->getXDisplay(), pixmap, gc, 0, 0,
+			width, height);
+
+#ifdef    INTERLACE
+	if (texture->getTexture() & BImage_Interlaced) {
+		gcv.foreground = texture->getColorTo()->getPixel();
+		GC igc = XCreateGC(control->getBaseDisplay()->getXDisplay(), pixmap,
+						GCForeground, &gcv);
+
+		register unsigned int i = 0;
+		for (; i < height; i += 2)
+			XDrawLine(control->getBaseDisplay()->getXDisplay(), pixmap, igc,
+				0, i, width, i);
+
+		XFreeGC(control->getBaseDisplay()->getXDisplay(), igc);
+	}
+#endif // INTERLACE
+
+
+	if (texture->getTexture() & BImage_Bevel1) {
+		if (texture->getTexture() & BImage_Raised) {
+			XDrawLine(control->getBaseDisplay()->getXDisplay(), pixmap, lgc,
+								0, height - 1, width - 1, height - 1);
+			XDrawLine(control->getBaseDisplay()->getXDisplay(), pixmap, lgc,
+							width - 1, height - 1, width - 1, 0);
+
+			XDrawLine(control->getBaseDisplay()->getXDisplay(), pixmap, hgc,
+								0, 0, width - 1, 0);
+			XDrawLine(control->getBaseDisplay()->getXDisplay(), pixmap, hgc,
+								0, height - 1, 0, 0);
+		} else if (texture->getTexture() & BImage_Sunken) {
+			XDrawLine(control->getBaseDisplay()->getXDisplay(), pixmap, hgc,
+								0, height - 1, width - 1, height - 1);
+			XDrawLine(control->getBaseDisplay()->getXDisplay(), pixmap, hgc,
+								width - 1, height - 1, width - 1, 0);
+
+			XDrawLine(control->getBaseDisplay()->getXDisplay(), pixmap, lgc,
+								0, 0, width - 1, 0);
+			XDrawLine(control->getBaseDisplay()->getXDisplay(), pixmap, lgc,
+								0, height - 1, 0, 0);
+		}
+	} else if (texture->getTexture() & BImage_Bevel2) {
+			if (texture->getTexture() & BImage_Raised) {
+				XDrawLine(control->getBaseDisplay()->getXDisplay(), pixmap, lgc,
+							1, height - 3, width - 3, height - 3);
+				XDrawLine(control->getBaseDisplay()->getXDisplay(), pixmap, lgc,
+							width - 3, height - 3, width - 3, 1);
+
+				XDrawLine(control->getBaseDisplay()->getXDisplay(), pixmap, hgc,
+							1, 1, width - 3, 1);
+				XDrawLine(control->getBaseDisplay()->getXDisplay(), pixmap, hgc,
+							1, height - 3, 1, 1);
+			} else if (texture->getTexture() & BImage_Sunken) {
+				XDrawLine(control->getBaseDisplay()->getXDisplay(), pixmap, hgc,
+							1, height - 3, width - 3, height - 3);
+				XDrawLine(control->getBaseDisplay()->getXDisplay(), pixmap, hgc,
+							width - 3, height - 3, width - 3, 1);
+
+				XDrawLine(control->getBaseDisplay()->getXDisplay(), pixmap, lgc,
+							1, 1, width - 3, 1);
+				XDrawLine(control->getBaseDisplay()->getXDisplay(), pixmap, lgc,
+							1, height - 3, 1, 1);
+		}
+	}
+
+	XFreeGC(control->getBaseDisplay()->getXDisplay(), gc);
+	XFreeGC(control->getBaseDisplay()->getXDisplay(), hgc);
+	XFreeGC(control->getBaseDisplay()->getXDisplay(), lgc);
+
+	return pixmap;
+}
+
+
+Pixmap BImage::render_gradient(BTexture *texture) {
+ int inverted = 0;
+
+#ifdef    INTERLACE
+  interlaced = texture->getTexture() & BImage_Interlaced;
+#endif // INTERLACE
+
+  if (texture->getTexture() & BImage_Sunken) {
+    from = texture->getColorTo();
+    to = texture->getColor();
+
+    if (! (texture->getTexture() & BImage_Invert)) inverted = 1;
+  } else {
+    from = texture->getColor();
+    to = texture->getColorTo();
+
+    if (texture->getTexture() & BImage_Invert) inverted = 1;
+  }
+
+  control->getGradientBuffers(width, height, &xtable, &ytable);
+
+  if (texture->getTexture() & BImage_Diagonal) dgradient();
+  else if (texture->getTexture() & BImage_Elliptic) egradient();
+  else if (texture->getTexture() & BImage_Horizontal) hgradient();
+  else if (texture->getTexture() & BImage_Pyramid) pgradient();
+  else if (texture->getTexture() & BImage_Rectangle) rgradient();
+  else if (texture->getTexture() & BImage_Vertical) vgradient();
+  else if (texture->getTexture() & BImage_CrossDiagonal) cdgradient();
+  else if (texture->getTexture() & BImage_PipeCross) pcgradient();
+
+  if (texture->getTexture() & BImage_Bevel1) bevel1();
+  else if (texture->getTexture() & BImage_Bevel2) bevel2();
+
+  if (inverted) invert();
+
+  Pixmap pixmap = renderPixmap();
+
+  return pixmap;
+
+}
+
+
+XImage *BImage::renderXImage(void) {
+	I18n *i18n = I18n::instance();
+	XImage *image =
+    XCreateImage(control->getBaseDisplay()->getXDisplay(),
+                 control->getVisual(), control->getDepth(), ZPixmap, 0, 0,
+                 width, height, 32, 0);
+
+  if (! image) {
+    fprintf(stderr,
+	    i18n->
+	    getMessage(
+#ifdef    NLS
+		       ImageSet, ImageErrorCreatingXImage,
+#else // !NLS
+		       0, 0,
+#endif // NLS
+		       "BImage::renderXImage: error creating XImage\n"));
+    return (XImage *) 0;
+  }
+
+  // insurance policy
+  image->data = (char *) 0;
+
+  unsigned char *d = new unsigned char[image->bytes_per_line * (height + 1)];
+  register unsigned int x, y, dithx, dithy, r, g, b, o, er, eg, eb, offset;
+
+  unsigned char *pixel_data = d, *ppixel_data = d;
+  unsigned long pixel;
+
+  o = image->bits_per_pixel + ((image->byte_order == MSBFirst) ? 1 : 0);
+
+  if (control->doDither() && width > 1 && height > 1) {
+    unsigned char dither4[4][4] = { {0, 4, 1, 5},
+                                    {6, 2, 7, 3},
+                                    {1, 5, 0, 4},
+                                    {7, 3, 6, 2} };
+
+#ifdef    ORDEREDPSEUDO
+    unsigned char dither8[8][8] = { { 0,  32, 8,  40, 2,  34, 10, 42 },
+                                    { 48, 16, 56, 24, 50, 18, 58, 26 },
+                                    { 12, 44, 4,  36, 14, 46, 6,  38 },
+                                    { 60, 28, 52, 20, 62, 30, 54, 22 },
+                                    { 3,  35, 11, 43, 1,  33, 9,  41 },
+                                    { 51, 19, 59, 27, 49, 17, 57, 25 },
+                                    { 15, 47, 7,  39, 13, 45, 5,  37 },
+                                    { 63, 31, 55, 23, 61, 29, 53, 21 } };
+#endif // ORDEREDPSEUDO
+
+    switch (control->getVisual()->c_class) {
+    case TrueColor:
+      // algorithm: ordered dithering... many many thanks to rasterman
+      // (raster@rasterman.com) for telling me about this... portions of this
+      // code is based off of his code in Imlib
+      for (y = 0, offset = 0; y < height; y++) {
+	dithy = y & 0x3;
+
+	for (x = 0; x < width; x++, offset++) {
+          dithx = x & 0x3;
+          r = red[offset];
+          g = green[offset];
+          b = blue[offset];
+
+          er = r & (red_bits - 1);
+          eg = g & (green_bits - 1);
+          eb = b & (blue_bits - 1);
+
+          r = red_table[r];
+          g = green_table[g];
+          b = blue_table[b];
+
+          if ((dither4[dithy][dithx] < er) && (r < red_table[255])) r++;
+          if ((dither4[dithy][dithx] < eg) && (g < green_table[255])) g++;
+          if ((dither4[dithy][dithx] < eb) && (b < blue_table[255])) b++;
+
+	  pixel = (r << red_offset) | (g << green_offset) | (b << blue_offset);
+
+          switch (o) {
+	  case  8: //  8bpp
+	    *pixel_data++ = pixel;
+	    break;
+
+          case 16: // 16bpp LSB
+            *pixel_data++ = pixel;
+	    *pixel_data++ = pixel >> 8;
+            break;
+
+          case 17: // 16bpp MSB
+	    *pixel_data++ = pixel >> 8;
+	    *pixel_data++ = pixel;
+            break;
+
+	  case 24: // 24bpp LSB
+	    *pixel_data++ = pixel;
+	    *pixel_data++ = pixel >> 8;
+	    *pixel_data++ = pixel >> 16;
+	    break;
+
+          case 25: // 24bpp MSB
+            *pixel_data++ = pixel >> 16;
+            *pixel_data++ = pixel >> 8;
+            *pixel_data++ = pixel;
+            break;
+
+          case 32: // 32bpp LSB
+            *pixel_data++ = pixel;
+            *pixel_data++ = pixel >> 8;
+            *pixel_data++ = pixel >> 16;
+            *pixel_data++ = pixel >> 24;
+            break;
+
+          case 33: // 32bpp MSB
+            *pixel_data++ = pixel >> 24;
+            *pixel_data++ = pixel >> 16;
+            *pixel_data++ = pixel >> 8;
+            *pixel_data++ = pixel;
+            break;
+          }
+	}
+
+	pixel_data = (ppixel_data += image->bytes_per_line);
+      }
+
+      break;
+
+    case StaticColor:
+    case PseudoColor: {
+#ifndef   ORDEREDPSEUDO
+      short *terr,
+	*rerr = new short[width + 2],
+	*gerr = new short[width + 2],
+	*berr = new short[width + 2],
+	*nrerr = new short[width + 2],
+	*ngerr = new short[width + 2],
+	*nberr = new short[width + 2];
+      int rr, gg, bb, rer, ger, ber;
+      int dd = 255 / control->getColorsPerChannel();
+
+      for (x = 0; x < width; x++) {
+	*(rerr + x) = *(red + x);
+	*(gerr + x) = *(green + x);
+	*(berr + x) = *(blue + x);
+      }
+
+      *(rerr + x) = *(gerr + x) = *(berr + x) = 0;
+#endif // ORDEREDPSEUDO
+
+      for (y = 0, offset = 0; y < height; y++) {
+#ifdef    ORDEREDPSEUDO
+        dithy = y & 7;
+
+        for (x = 0; x < width; x++, offset++) {
+          dithx = x & 7;
+
+          r = red[offset];
+          g = green[offset];
+          b = blue[offset];
+
+          er = r & (red_bits - 1);
+          eg = g & (green_bits - 1);
+          eb = b & (blue_bits - 1);
+
+          r = red_table[r];
+          g = green_table[g];
+          b = blue_table[b];
+
+          if ((dither8[dithy][dithx] < er) && (r < red_table[255])) r++;
+          if ((dither8[dithy][dithx] < eg) && (g < green_table[255])) g++;
+          if ((dither8[dithy][dithx] < eb) && (b < blue_table[255])) b++;
+
+          pixel = (r * cpccpc) + (g * cpc) + b;
+          *(pixel_data++) = colors[pixel].pixel;
+        }
+
+        pixel_data = (ppixel_data += image->bytes_per_line);
+      }
+#else // !ORDEREDPSEUDO
+      if (y < (height - 1)) {
+	int i = offset + width;
+	for (x = 0; x < width; x++, i++) {
+	  *(nrerr + x) = *(red + i);
+	  *(ngerr + x) = *(green + i);
+	  *(nberr + x) = *(blue + i);
+	}
+
+	*(nrerr + x) = *(red + (--i));
+	*(ngerr + x) = *(green + i);
+	*(nberr + x) = *(blue + i);
+      }
+
+      for (x = 0; x < width; x++) {
+	rr = rerr[x];
+	gg = gerr[x];
+	bb = berr[x];
+
+	if (rr > 255) rr = 255; else if (rr < 0) rr = 0;
+	if (gg > 255) gg = 255; else if (gg < 0) gg = 0;
+	if (bb > 255) bb = 255; else if (bb < 0) bb = 0;
+
+	r = red_table[rr];
+	g = green_table[gg];
+	b = blue_table[bb];
+
+	rer = rerr[x] - r*dd;
+	ger = gerr[x] - g*dd;
+	ber = berr[x] - b*dd;
+
+	pixel = (r * cpccpc) + (g * cpc) + b;
+	*pixel_data++ = colors[pixel].pixel;
+
+	r = rer >> 1;
+	g = ger >> 1;
+	b = ber >> 1;
+	rerr[x+1] += r;
+	gerr[x+1] += g;
+	berr[x+1] += b;
+	nrerr[x] += r;
+	ngerr[x] += g;
+	nberr[x] += b;
+      }
+
+      offset += width;
+
+      pixel_data = (ppixel_data += image->bytes_per_line);
+
+      terr = rerr;
+      rerr = nrerr;
+      nrerr = terr;
+
+      terr = gerr;
+      gerr = ngerr;
+      ngerr = terr;
+
+      terr = berr;
+      berr = nberr;
+      nberr = terr;
+    }
+
+    delete [] rerr;
+    delete [] gerr;
+    delete [] berr;
+    delete [] nrerr;
+    delete [] ngerr;
+    delete [] nberr;
+#endif // ORDEREDPSUEDO
+
+    break; }
+
+    /*
+       case StaticGray:
+       case GrayScale:
+       for (y = 0, offset = 0; y < height; y++) {
+       dithy = y & 0x3;
+
+       for (x = 0; x < width; x++, offset++) {
+       dithx = x & 0x3;
+
+       r = *(red + offset);
+       g = *(green + offset);
+       b = *(blue + offset);
+
+       er = r & 0x7;
+       eg = g & 0x7;
+       eb = b & 0x7;
+
+       if ((dither[dithy][dithx] < er) && (r < (256 - 8)))
+       r += 8;
+       if ((dither[dithy][dithx] < (eg << 1)) && (g < (256 - 4)))
+       g += 4;
+       if ((dither[dithy][dithx] < eb) && (b < (256 - 8)))
+       b += 8;
+
+       r = *(red_table + r);
+       g = *(green_table + g);
+       b = *(blue_table + b);
+
+       g = ((r * 30) + (g * 59) + (b * 11)) / 100;
+       *pixel_data++ = colors[g].pixel;
+       }
+
+       pixel_data = (ppixel_data += image->bytes_per_line);
+       }
+
+       break;
+    */
+
+    default:
+      fprintf(stderr,
+	      i18n->
+	      getMessage(
+#ifdef    NLS
+			 ImageSet, ImageUnsupVisual,
+#else // !NLS
+			 0, 0,
+#endif // NLS
+			 "BImage::renderXImage: unsupported visual\n"));
+      delete [] d;
+      XDestroyImage(image);
+      return (XImage *) 0;
+    }
+  } else {
+    switch (control->getVisual()->c_class) {
+    case StaticColor:
+    case PseudoColor:
+      for (y = 0, offset = 0; y < height; y++) {
+        for (x = 0; x < width; x++, offset++) {
+  	  r = red_table[red[offset]];
+          g = green_table[green[offset]];
+	  b = blue_table[blue[offset]];
+
+	  pixel = (r * cpccpc) + (g * cpc) + b;
+	  *pixel_data++ = colors[pixel].pixel;
+        }
+
+        pixel_data = (ppixel_data += image->bytes_per_line);
+      }
+
+      break;
+
+  case TrueColor:
+    for (y = 0, offset = 0; y < height; y++) {
+      for (x = 0; x < width; x++, offset++) {
+	r = red_table[red[offset]];
+	g = green_table[green[offset]];
+	b = blue_table[blue[offset]];
+
+	pixel = (r << red_offset) | (g << green_offset) | (b << blue_offset);
+
+        switch (o) {
+	case  8: //  8bpp
+	  *pixel_data++ = pixel;
+	  break;
+
+        case 16: // 16bpp LSB
+          *pixel_data++ = pixel;
+          *pixel_data++ = pixel >> 8;
+          break;
+
+        case 17: // 16bpp MSB
+          *pixel_data++ = pixel >> 8;
+          *pixel_data++ = pixel;
+          break;
+
+        case 24: // 24bpp LSB
+          *pixel_data++ = pixel;
+          *pixel_data++ = pixel >> 8;
+          *pixel_data++ = pixel >> 16;
+          break;
+
+        case 25: // 24bpp MSB
+          *pixel_data++ = pixel >> 16;
+          *pixel_data++ = pixel >> 8;
+          *pixel_data++ = pixel;
+          break;
+
+        case 32: // 32bpp LSB
+          *pixel_data++ = pixel;
+          *pixel_data++ = pixel >> 8;
+          *pixel_data++ = pixel >> 16;
+          *pixel_data++ = pixel >> 24;
+          break;
+
+        case 33: // 32bpp MSB
+          *pixel_data++ = pixel >> 24;
+          *pixel_data++ = pixel >> 16;
+          *pixel_data++ = pixel >> 8;
+          *pixel_data++ = pixel;
+          break;
+        }
+      }
+
+      pixel_data = (ppixel_data += image->bytes_per_line);
+    }
+
+    break;
+
+  case StaticGray:
+  case GrayScale:
+    for (y = 0, offset = 0; y < height; y++) {
+      for (x = 0; x < width; x++, offset++) {
+	r = *(red_table + *(red + offset));
+	g = *(green_table + *(green + offset));
+	b = *(blue_table + *(blue + offset));
+
+	g = ((r * 30) + (g * 59) + (b * 11)) / 100;
+	*pixel_data++ = colors[g].pixel;
+      }
+
+      pixel_data = (ppixel_data += image->bytes_per_line);
+    }
+
+    break;
+
+  default:
+    fprintf(stderr,
+	    i18n->
+	    getMessage(
+#ifdef    NLS
+		       ImageSet, ImageUnsupVisual,
+#else // !NLS
+		       0, 0,
+#endif // NLS
+		       "BImage::renderXImage: unsupported visual\n"));
+    delete [] d;
+    XDestroyImage(image);
+    return (XImage *) 0;
+  }
+}
+
+  image->data = (char *) d;
+  return image;
+}
+
+
+Pixmap BImage::renderPixmap(void) {
+	I18n *i18n = I18n::instance();
+	Pixmap pixmap =
+    XCreatePixmap(control->getBaseDisplay()->getXDisplay(),
+                  control->getDrawable(), width, height, control->getDepth());
+
+  if (pixmap == None) {
+    fprintf(stderr,
+            i18n->getMessage(
+#ifdef    NLS
+                             ImageSet, ImageErrorCreatingPixmap,
+#else // !NLS
+			     0, 0,
+#endif // NLS
+	                     "BImage::renderPixmap: error creating pixmap\n"));
+    return None;
+  }
+
+  XImage *image = renderXImage();
+
+  if (! image) {
+    XFreePixmap(control->getBaseDisplay()->getXDisplay(), pixmap);
+    return None;
+  } else if (! image->data) {
+    XDestroyImage(image);
+    XFreePixmap(control->getBaseDisplay()->getXDisplay(), pixmap);
+    return None;
+  }
+
+  XPutImage(control->getBaseDisplay()->getXDisplay(), pixmap,
+	    DefaultGC(control->getBaseDisplay()->getXDisplay(),
+		      control->getScreenInfo()->getScreenNumber()),
+            image, 0, 0, 0, 0, width, height);
+
+  if (image->data) {
+    delete [] image->data;
+    image->data = NULL;
+  }
+
+  XDestroyImage(image);
+
+  return pixmap;
+}
+
+
+void BImage::bevel1(void) {
+  if (width > 2 && height > 2) {
+    unsigned char *pr = red, *pg = green, *pb = blue;
+
+    register unsigned char r, g, b, rr ,gg ,bb;
+    register unsigned int w = width, h = height - 1, wh = w * h;
+
+    while (--w) {
+      r = *pr;
+      rr = r + (r >> 1);
+      if (rr < r) rr = ~0;
+      g = *pg;
+      gg = g + (g >> 1);
+      if (gg < g) gg = ~0;
+      b = *pb;
+      bb = b + (b >> 1);
+      if (bb < b) bb = ~0;
+
+      *pr = rr;
+      *pg = gg;
+      *pb = bb;
+
+      r = *(pr + wh);
+      rr = (r >> 2) + (r >> 1);
+      if (rr > r) rr = 0;
+      g = *(pg + wh);
+      gg = (g >> 2) + (g >> 1);
+      if (gg > g) gg = 0;
+      b = *(pb + wh);
+      bb = (b >> 2) + (b >> 1);
+      if (bb > b) bb = 0;
+
+      *((pr++) + wh) = rr;
+      *((pg++) + wh) = gg;
+      *((pb++) + wh) = bb;
+    }
+
+    r = *pr;
+    rr = r + (r >> 1);
+    if (rr < r) rr = ~0;
+    g = *pg;
+    gg = g + (g >> 1);
+    if (gg < g) gg = ~0;
+    b = *pb;
+    bb = b + (b >> 1);
+    if (bb < b) bb = ~0;
+
+    *pr = rr;
+    *pg = gg;
+    *pb = bb;
+
+    r = *(pr + wh);
+    rr = (r >> 2) + (r >> 1);
+    if (rr > r) rr = 0;
+    g = *(pg + wh);
+    gg = (g >> 2) + (g >> 1);
+    if (gg > g) gg = 0;
+    b = *(pb + wh);
+    bb = (b >> 2) + (b >> 1);
+    if (bb > b) bb = 0;
+
+    *(pr + wh) = rr;
+    *(pg + wh) = gg;
+    *(pb + wh) = bb;
+
+    pr = red + width;
+    pg = green + width;
+    pb = blue + width;
+
+    while (--h) {
+      r = *pr;
+      rr = r + (r >> 1);
+      if (rr < r) rr = ~0;
+      g = *pg;
+      gg = g + (g >> 1);
+      if (gg < g) gg = ~0;
+      b = *pb;
+      bb = b + (b >> 1);
+      if (bb < b) bb = ~0;
+
+      *pr = rr;
+      *pg = gg;
+      *pb = bb;
+
+      pr += width - 1;
+      pg += width - 1;
+      pb += width - 1;
+
+      r = *pr;
+      rr = (r >> 2) + (r >> 1);
+      if (rr > r) rr = 0;
+      g = *pg;
+      gg = (g >> 2) + (g >> 1);
+      if (gg > g) gg = 0;
+      b = *pb;
+      bb = (b >> 2) + (b >> 1);
+      if (bb > b) bb = 0;
+
+      *(pr++) = rr;
+      *(pg++) = gg;
+      *(pb++) = bb;
+    }
+
+    r = *pr;
+    rr = r + (r >> 1);
+    if (rr < r) rr = ~0;
+    g = *pg;
+    gg = g + (g >> 1);
+    if (gg < g) gg = ~0;
+    b = *pb;
+    bb = b + (b >> 1);
+    if (bb < b) bb = ~0;
+
+    *pr = rr;
+    *pg = gg;
+    *pb = bb;
+
+    pr += width - 1;
+    pg += width - 1;
+    pb += width - 1;
+
+    r = *pr;
+    rr = (r >> 2) + (r >> 1);
+    if (rr > r) rr = 0;
+    g = *pg;
+    gg = (g >> 2) + (g >> 1);
+    if (gg > g) gg = 0;
+    b = *pb;
+    bb = (b >> 2) + (b >> 1);
+    if (bb > b) bb = 0;
+
+    *pr = rr;
+    *pg = gg;
+    *pb = bb;
+  }
+}
+
+
+void BImage::bevel2(void) {
+  if (width > 4 && height > 4) {
+    unsigned char r, g, b, rr ,gg ,bb, *pr = red + width + 1,
+      *pg = green + width + 1, *pb = blue + width + 1;
+    unsigned int w = width - 2, h = height - 1, wh = width * (height - 3);
+
+    while (--w) {
+      r = *pr;
+      rr = r + (r >> 1);
+      if (rr < r) rr = ~0;
+      g = *pg;
+      gg = g + (g >> 1);
+      if (gg < g) gg = ~0;
+      b = *pb;
+      bb = b + (b >> 1);
+      if (bb < b) bb = ~0;
+
+      *pr = rr;
+      *pg = gg;
+      *pb = bb;
+
+      r = *(pr + wh);
+      rr = (r >> 2) + (r >> 1);
+      if (rr > r) rr = 0;
+      g = *(pg + wh);
+      gg = (g >> 2) + (g >> 1);
+      if (gg > g) gg = 0;
+      b = *(pb + wh);
+      bb = (b >> 2) + (b >> 1);
+      if (bb > b) bb = 0;
+
+      *((pr++) + wh) = rr;
+      *((pg++) + wh) = gg;
+      *((pb++) + wh) = bb;
+    }
+
+    pr = red + width;
+    pg = green + width;
+    pb = blue + width;
+
+    while (--h) {
+      r = *pr;
+      rr = r + (r >> 1);
+      if (rr < r) rr = ~0;
+      g = *pg;
+      gg = g + (g >> 1);
+      if (gg < g) gg = ~0;
+      b = *pb;
+      bb = b + (b >> 1);
+      if (bb < b) bb = ~0;
+
+      *(++pr) = rr;
+      *(++pg) = gg;
+      *(++pb) = bb;
+
+      pr += width - 3;
+      pg += width - 3;
+      pb += width - 3;
+
+      r = *pr;
+      rr = (r >> 2) + (r >> 1);
+      if (rr > r) rr = 0;
+      g = *pg;
+      gg = (g >> 2) + (g >> 1);
+      if (gg > g) gg = 0;
+      b = *pb;
+      bb = (b >> 2) + (b >> 1);
+      if (bb > b) bb = 0;
+
+      *(pr++) = rr;
+      *(pg++) = gg;
+      *(pb++) = bb;
+
+      pr++; pg++; pb++;
+    }
+  }
+}
+
+
+void BImage::invert(void) {
+  register unsigned int i, j, wh = (width * height) - 1;
+  unsigned char tmp;
+
+  for (i = 0, j = wh; j > i; j--, i++) {
+    tmp = *(red + j);
+    *(red + j) = *(red + i);
+    *(red + i) = tmp;
+
+    tmp = *(green + j);
+    *(green + j) = *(green + i);
+    *(green + i) = tmp;
+
+    tmp = *(blue + j);
+    *(blue + j) = *(blue + i);
+    *(blue + i) = tmp;
+  }
+}
+
+
+void BImage::dgradient(void) {
+  // diagonal gradient code was written by Mike Cole 
+  // modified for interlacing by Brad Hughes
+
+  float drx, dgx, dbx, dry, dgy, dby, yr = 0.0, yg = 0.0, yb = 0.0,
+    xr = (float) from->getRed(),
+    xg = (float) from->getGreen(),
+    xb = (float) from->getBlue();
+  unsigned char *pr = red, *pg = green, *pb = blue;
+  unsigned int w = width * 2, h = height * 2, *xt = xtable, *yt = ytable;
+
+  register unsigned int x, y;
+
+  dry = drx = (float) (to->getRed() - from->getRed());
+  dgy = dgx = (float) (to->getGreen() - from->getGreen());
+  dby = dbx = (float) (to->getBlue() - from->getBlue());
+
+  // Create X table
+  drx /= w;
+  dgx /= w;
+  dbx /= w;
+
+  for (x = 0; x < width; x++) {
+    *(xt++) = (unsigned char) (xr);
+    *(xt++) = (unsigned char) (xg);
+    *(xt++) = (unsigned char) (xb);
+
+    xr += drx;
+    xg += dgx;
+    xb += dbx;
+  }
+
+  // Create Y table
+  dry /= h;
+  dgy /= h;
+  dby /= h;
+
+  for (y = 0; y < height; y++) {
+    *(yt++) = ((unsigned char) yr);
+    *(yt++) = ((unsigned char) yg);
+    *(yt++) = ((unsigned char) yb);
+
+    yr += dry;
+    yg += dgy;
+    yb += dby;
+  }
+
+  // Combine tables to create gradient
+
+#ifdef    INTERLACE
+  if (! interlaced) {
+#endif // INTERLACE
+
+    // normal dgradient
+    for (yt = ytable, y = 0; y < height; y++, yt += 3) {
+      for (xt = xtable, x = 0; x < width; x++) {
+        *(pr++) = *(xt++) + *(yt);
+        *(pg++) = *(xt++) + *(yt + 1);
+        *(pb++) = *(xt++) + *(yt + 2);
+      }
+    }
+
+#ifdef    INTERLACE
+  } else {
+    // faked interlacing effect
+    unsigned char channel, channel2;
+
+    for (yt = ytable, y = 0; y < height; y++, yt += 3) {
+      for (xt = xtable, x = 0; x < width; x++) {
+        if (y & 1) {
+          channel = *(xt++) + *(yt);
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pr++) = channel2;
+
+          channel = *(xt++) + *(yt + 1);
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pg++) = channel2;
+
+          channel = *(xt++) + *(yt + 2);
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pb++) = channel2;
+        } else {
+          channel = *(xt++) + *(yt);
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pr++) = channel2;
+
+          channel = *(xt++) + *(yt + 1);
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pg++) = channel2;
+
+          channel = *(xt++) + *(yt + 2);
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pb++) = channel2;
+        }
+      }
+    }
+  }
+#endif // INTERLACE
+
+}
+
+
+void BImage::hgradient(void) {
+  float drx, dgx, dbx,
+    xr = (float) from->getRed(),
+    xg = (float) from->getGreen(),
+    xb = (float) from->getBlue();
+  unsigned char *pr = red, *pg = green, *pb = blue;
+
+  register unsigned int x, y;
+
+  drx = (float) (to->getRed() - from->getRed());
+  dgx = (float) (to->getGreen() - from->getGreen());
+  dbx = (float) (to->getBlue() - from->getBlue());
+
+  drx /= width;
+  dgx /= width;
+  dbx /= width;
+
+#ifdef    INTERLACE
+  if (interlaced && height > 2) {
+    // faked interlacing effect
+    unsigned char channel, channel2;
+
+    for (x = 0; x < width; x++, pr++, pg++, pb++) {
+      channel = (unsigned char) xr;
+      channel2 = (channel >> 1) + (channel >> 2);
+      if (channel2 > channel) channel2 = 0;
+      *pr = channel2;
+
+      channel = (unsigned char) xg;
+      channel2 = (channel >> 1) + (channel >> 2);
+      if (channel2 > channel) channel2 = 0;
+      *pg = channel2;
+
+      channel = (unsigned char) xb;
+      channel2 = (channel >> 1) + (channel >> 2);
+      if (channel2 > channel) channel2 = 0;
+      *pb = channel2;
+
+
+      channel = (unsigned char) xr;
+      channel2 = channel + (channel >> 3);
+      if (channel2 < channel) channel2 = ~0;
+      *(pr + width) = channel2;
+
+      channel = (unsigned char) xg;
+      channel2 = channel + (channel >> 3);
+      if (channel2 < channel) channel2 = ~0;
+      *(pg + width) = channel2;
+
+      channel = (unsigned char) xb;
+      channel2 = channel + (channel >> 3);
+      if (channel2 < channel) channel2 = ~0;
+      *(pb + width) = channel2;
+
+      xr += drx;
+      xg += dgx;
+      xb += dbx;
+    }
+
+    pr += width;
+    pg += width;
+    pb += width;
+
+    int offset;
+
+    for (y = 2; y < height; y++, pr += width, pg += width, pb += width) {
+      if (y & 1) offset = width; else offset = 0;
+
+      memcpy(pr, (red + offset), width);
+      memcpy(pg, (green + offset), width);
+      memcpy(pb, (blue + offset), width);
+    }
+  } else {
+#endif // INTERLACE
+
+    // normal hgradient
+    for (x = 0; x < width; x++) {
+      *(pr++) = (unsigned char) (xr);
+      *(pg++) = (unsigned char) (xg);
+      *(pb++) = (unsigned char) (xb);
+
+      xr += drx;
+      xg += dgx;
+      xb += dbx;
+    }
+
+    for (y = 1; y < height; y++, pr += width, pg += width, pb += width) {
+      memcpy(pr, red, width);
+      memcpy(pg, green, width);
+      memcpy(pb, blue, width);
+    }
+
+#ifdef    INTERLACE
+  }
+#endif // INTERLACE
+
+}
+
+
+void BImage::vgradient(void) {
+  float dry, dgy, dby,
+    yr = (float) from->getRed(),
+    yg = (float) from->getGreen(),
+    yb = (float) from->getBlue();
+  unsigned char *pr = red, *pg = green, *pb = blue;
+
+  register unsigned int y;
+
+  dry = (float) (to->getRed() - from->getRed());
+  dgy = (float) (to->getGreen() - from->getGreen());
+  dby = (float) (to->getBlue() - from->getBlue());
+
+  dry /= height;
+  dgy /= height;
+  dby /= height;
+
+#ifdef    INTERLACE
+  if (interlaced) {
+    // faked interlacing effect
+    unsigned char channel, channel2;
+
+    for (y = 0; y < height; y++, pr += width, pg += width, pb += width) {
+      if (y & 1) {
+        channel = (unsigned char) yr;
+        channel2 = (channel >> 1) + (channel >> 2);
+        if (channel2 > channel) channel2 = 0;
+        memset(pr, channel2, width);
+
+        channel = (unsigned char) yg;
+        channel2 = (channel >> 1) + (channel >> 2);
+        if (channel2 > channel) channel2 = 0;
+        memset(pg, channel2, width);
+
+        channel = (unsigned char) yb;
+        channel2 = (channel >> 1) + (channel >> 2);
+        if (channel2 > channel) channel2 = 0;
+        memset(pb, channel2, width);
+      } else {
+        channel = (unsigned char) yr;
+        channel2 = channel + (channel >> 3);
+        if (channel2 < channel) channel2 = ~0;
+        memset(pr, channel2, width);
+
+        channel = (unsigned char) yg;
+        channel2 = channel + (channel >> 3);
+        if (channel2 < channel) channel2 = ~0;
+        memset(pg, channel2, width);
+
+        channel = (unsigned char) yb;
+        channel2 = channel + (channel >> 3);
+        if (channel2 < channel) channel2 = ~0;
+        memset(pb, channel2, width);
+      }
+
+      yr += dry;
+      yg += dgy;
+      yb += dby;
+    }
+  } else {
+#endif // INTERLACE
+
+    // normal vgradient
+    for (y = 0; y < height; y++, pr += width, pg += width, pb += width) {
+      memset(pr, (unsigned char) yr, width);
+      memset(pg, (unsigned char) yg, width);
+      memset(pb, (unsigned char) yb, width);
+
+      yr += dry;
+      yg += dgy;
+      yb += dby;
+    }
+
+#ifdef    INTERLACE
+  }
+#endif // INTERLACE
+
+}
+
+
+void BImage::pgradient(void) {
+  // pyramid gradient -  based on original dgradient, written by
+  // Mosfet (mosfet@kde.org)
+  // adapted from kde sources for Blackbox by Brad Hughes
+
+  float yr, yg, yb, drx, dgx, dbx, dry, dgy, dby,
+    xr, xg, xb;
+  int rsign, gsign, bsign;
+  unsigned char *pr = red, *pg = green, *pb = blue;
+  unsigned int tr = to->getRed(), tg = to->getGreen(), tb = to->getBlue(),
+    *xt = xtable, *yt = ytable;
+
+  register unsigned int x, y;
+
+  dry = drx = (float) (to->getRed() - from->getRed());
+  dgy = dgx = (float) (to->getGreen() - from->getGreen());
+  dby = dbx = (float) (to->getBlue() - from->getBlue());
+
+  rsign = (drx < 0) ? -1 : 1;
+  gsign = (dgx < 0) ? -1 : 1;
+  bsign = (dbx < 0) ? -1 : 1;
+
+  xr = yr = (drx / 2);
+  xg = yg = (dgx / 2);
+  xb = yb = (dbx / 2);
+
+  // Create X table
+  drx /= width;
+  dgx /= width;
+  dbx /= width;
+
+  for (x = 0; x < width; x++) {
+    *(xt++) = (unsigned char) ((xr < 0) ? -xr : xr);
+    *(xt++) = (unsigned char) ((xg < 0) ? -xg : xg);
+    *(xt++) = (unsigned char) ((xb < 0) ? -xb : xb);
+
+    xr -= drx;
+    xg -= dgx;
+    xb -= dbx;
+  }
+
+  // Create Y table
+  dry /= height;
+  dgy /= height;
+  dby /= height;
+
+  for (y = 0; y < height; y++) {
+    *(yt++) = ((unsigned char) ((yr < 0) ? -yr : yr));
+    *(yt++) = ((unsigned char) ((yg < 0) ? -yg : yg));
+    *(yt++) = ((unsigned char) ((yb < 0) ? -yb : yb));
+
+    yr -= dry;
+    yg -= dgy;
+    yb -= dby;
+  }
+
+  // Combine tables to create gradient
+
+#ifdef    INTERLACE
+  if (! interlaced) {
+#endif // INTERLACE
+
+    // normal pgradient
+    for (yt = ytable, y = 0; y < height; y++, yt += 3) {
+      for (xt = xtable, x = 0; x < width; x++) {
+        *(pr++) = (unsigned char) (tr - (rsign * (*(xt++) + *(yt))));
+        *(pg++) = (unsigned char) (tg - (gsign * (*(xt++) + *(yt + 1))));
+        *(pb++) = (unsigned char) (tb - (bsign * (*(xt++) + *(yt + 2))));
+      }
+    }
+
+#ifdef    INTERLACE
+  } else {
+    // faked interlacing effect
+    unsigned char channel, channel2;
+
+    for (yt = ytable, y = 0; y < height; y++, yt += 3) {
+      for (xt = xtable, x = 0; x < width; x++) {
+        if (y & 1) {
+          channel = (unsigned char) (tr - (rsign * (*(xt++) + *(yt))));
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pr++) = channel2;
+
+          channel = (unsigned char) (tg - (gsign * (*(xt++) + *(yt + 1))));
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pg++) = channel2;
+
+          channel = (unsigned char) (tb - (bsign * (*(xt++) + *(yt + 2))));
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pb++) = channel2;
+        } else {
+          channel = (unsigned char) (tr - (rsign * (*(xt++) + *(yt))));
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pr++) = channel2;
+
+          channel = (unsigned char) (tg - (gsign * (*(xt++) + *(yt + 1))));
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pg++) = channel2;
+
+          channel = (unsigned char) (tb - (bsign * (*(xt++) + *(yt + 2))));
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pb++) = channel2;
+        }
+      }
+    }
+  }
+#endif // INTERLACE
+
+}
+
+
+void BImage::rgradient(void) {
+  // rectangle gradient -  based on original dgradient, written by
+  // Mosfet (mosfet@kde.org)
+  // adapted from kde sources for Blackbox by Brad Hughes
+
+  float drx, dgx, dbx, dry, dgy, dby, xr, xg, xb, yr, yg, yb;
+  int rsign, gsign, bsign;
+  unsigned char *pr = red, *pg = green, *pb = blue;
+  unsigned int tr = to->getRed(), tg = to->getGreen(), tb = to->getBlue(),
+    *xt = xtable, *yt = ytable;
+
+  register unsigned int x, y;
+
+  dry = drx = (float) (to->getRed() - from->getRed());
+  dgy = dgx = (float) (to->getGreen() - from->getGreen());
+  dby = dbx = (float) (to->getBlue() - from->getBlue());
+
+  rsign = (drx < 0) ? -2 : 2;
+  gsign = (dgx < 0) ? -2 : 2;
+  bsign = (dbx < 0) ? -2 : 2;
+
+  xr = yr = (drx / 2);
+  xg = yg = (dgx / 2);
+  xb = yb = (dbx / 2);
+
+  // Create X table
+  drx /= width;
+  dgx /= width;
+  dbx /= width;
+
+  for (x = 0; x < width; x++) {
+    *(xt++) = (unsigned char) ((xr < 0) ? -xr : xr);
+    *(xt++) = (unsigned char) ((xg < 0) ? -xg : xg);
+    *(xt++) = (unsigned char) ((xb < 0) ? -xb : xb);
+
+    xr -= drx;
+    xg -= dgx;
+    xb -= dbx;
+  }
+
+  // Create Y table
+  dry /= height;
+  dgy /= height;
+  dby /= height;
+
+  for (y = 0; y < height; y++) {
+    *(yt++) = ((unsigned char) ((yr < 0) ? -yr : yr));
+    *(yt++) = ((unsigned char) ((yg < 0) ? -yg : yg));
+    *(yt++) = ((unsigned char) ((yb < 0) ? -yb : yb));
+
+    yr -= dry;
+    yg -= dgy;
+    yb -= dby;
+  }
+
+  // Combine tables to create gradient
+
+#ifdef    INTERLACE
+  if (! interlaced) {
+#endif // INTERLACE
+
+    // normal rgradient
+    for (yt = ytable, y = 0; y < height; y++, yt += 3) {
+      for (xt = xtable, x = 0; x < width; x++) {
+        *(pr++) = (unsigned char) (tr - (rsign * max(*(xt++), *(yt))));
+        *(pg++) = (unsigned char) (tg - (gsign * max(*(xt++), *(yt + 1))));
+        *(pb++) = (unsigned char) (tb - (bsign * max(*(xt++), *(yt + 2))));
+      }
+    }
+
+#ifdef    INTERLACE
+  } else {
+    // faked interlacing effect
+    unsigned char channel, channel2;
+
+    for (yt = ytable, y = 0; y < height; y++, yt += 3) {
+      for (xt = xtable, x = 0; x < width; x++) {
+        if (y & 1) {
+          channel = (unsigned char) (tr - (rsign * max(*(xt++), *(yt))));
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pr++) = channel2;
+
+          channel = (unsigned char) (tg - (gsign * max(*(xt++), *(yt + 1))));
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pg++) = channel2;
+
+          channel = (unsigned char) (tb - (bsign * max(*(xt++), *(yt + 2))));
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pb++) = channel2;
+        } else {
+          channel = (unsigned char) (tr - (rsign * max(*(xt++), *(yt))));
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pr++) = channel2;
+
+          channel = (unsigned char) (tg - (gsign * max(*(xt++), *(yt + 1))));
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pg++) = channel2;
+
+          channel = (unsigned char) (tb - (bsign * max(*(xt++), *(yt + 2))));
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pb++) = channel2;
+        }
+      }
+    }
+  }
+#endif // INTERLACE
+
+}
+
+
+void BImage::egradient(void) {
+  // elliptic gradient -  based on original dgradient, written by
+  // Mosfet (mosfet@kde.org)
+  // adapted from kde sources for Blackbox by Brad Hughes
+
+  float drx, dgx, dbx, dry, dgy, dby, yr, yg, yb, xr, xg, xb;
+  int rsign, gsign, bsign;
+  unsigned char *pr = red, *pg = green, *pb = blue;
+  unsigned int *xt = xtable, *yt = ytable,
+    tr = (unsigned long) to->getRed(),
+    tg = (unsigned long) to->getGreen(),
+    tb = (unsigned long) to->getBlue();
+
+  register unsigned int x, y;
+
+  dry = drx = (float) (to->getRed() - from->getRed());
+  dgy = dgx = (float) (to->getGreen() - from->getGreen());
+  dby = dbx = (float) (to->getBlue() - from->getBlue());
+
+  rsign = (drx < 0) ? -1 : 1;
+  gsign = (dgx < 0) ? -1 : 1;
+  bsign = (dbx < 0) ? -1 : 1;
+
+  xr = yr = (drx / 2);
+  xg = yg = (dgx / 2);
+  xb = yb = (dbx / 2);
+
+  // Create X table
+  drx /= width;
+  dgx /= width;
+  dbx /= width;
+
+  for (x = 0; x < width; x++) {
+    *(xt++) = (unsigned long) (xr * xr);
+    *(xt++) = (unsigned long) (xg * xg);
+    *(xt++) = (unsigned long) (xb * xb);
+
+    xr -= drx;
+    xg -= dgx;
+    xb -= dbx;
+  }
+
+  // Create Y table
+  dry /= height;
+  dgy /= height;
+  dby /= height;
+
+  for (y = 0; y < height; y++) {
+    *(yt++) = (unsigned long) (yr * yr);
+    *(yt++) = (unsigned long) (yg * yg);
+    *(yt++) = (unsigned long) (yb * yb);
+
+    yr -= dry;
+    yg -= dgy;
+    yb -= dby;
+  }
+
+  // Combine tables to create gradient
+
+#ifdef    INTERLACE
+  if (! interlaced) {
+#endif // INTERLACE
+
+    // normal egradient
+    for (yt = ytable, y = 0; y < height; y++, yt += 3) {
+      for (xt = xtable, x = 0; x < width; x++) {
+        *(pr++) = (unsigned char)
+          (tr - (rsign * control->getSqrt(*(xt++) + *(yt))));
+        *(pg++) = (unsigned char)
+          (tg - (gsign * control->getSqrt(*(xt++) + *(yt + 1))));
+        *(pb++) = (unsigned char)
+          (tb - (bsign * control->getSqrt(*(xt++) + *(yt + 2))));
+      }
+    }
+
+#ifdef    INTERLACE
+  } else {
+    // faked interlacing effect
+    unsigned char channel, channel2;
+
+    for (yt = ytable, y = 0; y < height; y++, yt += 3) {
+      for (xt = xtable, x = 0; x < width; x++) {
+        if (y & 1) {
+          channel = (unsigned char)
+            (tr - (rsign * control->getSqrt(*(xt++) + *(yt))));
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pr++) = channel2;
+
+          channel = (unsigned char)
+            (tg - (gsign * control->getSqrt(*(xt++) + *(yt + 1))));
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pg++) = channel2;
+
+          channel = (unsigned char)
+            (tb - (bsign * control->getSqrt(*(xt++) + *(yt + 2))));
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pb++) = channel2;
+        } else {
+          channel = (unsigned char)
+            (tr - (rsign * control->getSqrt(*(xt++) + *(yt))));
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pr++) = channel2;
+
+          channel = (unsigned char)
+          (tg - (gsign * control->getSqrt(*(xt++) + *(yt + 1))));
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pg++) = channel2;
+
+          channel = (unsigned char)
+            (tb - (bsign * control->getSqrt(*(xt++) + *(yt + 2))));
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pb++) = channel2;
+        }
+      }
+    }
+  }
+#endif // INTERLACE
+
+}
+
+
+void BImage::pcgradient(void) {
+  // pipe cross gradient -  based on original dgradient, written by
+  // Mosfet (mosfet@kde.org)
+  // adapted from kde sources for Blackbox by Brad Hughes
+
+  float drx, dgx, dbx, dry, dgy, dby, xr, xg, xb, yr, yg, yb;
+  int rsign, gsign, bsign;
+  unsigned char *pr = red, *pg = green, *pb = blue;
+  unsigned int *xt = xtable, *yt = ytable,
+    tr = to->getRed(),
+    tg = to->getGreen(),
+    tb = to->getBlue();
+
+  register unsigned int x, y;
+
+  dry = drx = (float) (to->getRed() - from->getRed());
+  dgy = dgx = (float) (to->getGreen() - from->getGreen());
+  dby = dbx = (float) (to->getBlue() - from->getBlue());
+
+  rsign = (drx < 0) ? -2 : 2;
+  gsign = (dgx < 0) ? -2 : 2;
+  bsign = (dbx < 0) ? -2 : 2;
+
+  xr = yr = (drx / 2);
+  xg = yg = (dgx / 2);
+  xb = yb = (dbx / 2);
+
+  // Create X table
+  drx /= width;
+  dgx /= width;
+  dbx /= width;
+
+  for (x = 0; x < width; x++) {
+    *(xt++) = (unsigned char) ((xr < 0) ? -xr : xr);
+    *(xt++) = (unsigned char) ((xg < 0) ? -xg : xg);
+    *(xt++) = (unsigned char) ((xb < 0) ? -xb : xb);
+
+    xr -= drx;
+    xg -= dgx;
+    xb -= dbx;
+  }
+
+  // Create Y table
+  dry /= height;
+  dgy /= height;
+  dby /= height;
+
+  for (y = 0; y < height; y++) {
+    *(yt++) = ((unsigned char) ((yr < 0) ? -yr : yr));
+    *(yt++) = ((unsigned char) ((yg < 0) ? -yg : yg));
+    *(yt++) = ((unsigned char) ((yb < 0) ? -yb : yb));
+
+    yr -= dry;
+    yg -= dgy;
+    yb -= dby;
+  }
+
+  // Combine tables to create gradient
+
+#ifdef    INTERLACE
+  if (! interlaced) {
+#endif // INTERLACE
+
+    // normal pcgradient
+    for (yt = ytable, y = 0; y < height; y++, yt += 3) {
+      for (xt = xtable, x = 0; x < width; x++) {
+        *(pr++) = (unsigned char) (tr - (rsign * min(*(xt++), *(yt))));
+        *(pg++) = (unsigned char) (tg - (gsign * min(*(xt++), *(yt + 1))));
+        *(pb++) = (unsigned char) (tb - (bsign * min(*(xt++), *(yt + 2))));
+      }
+    }
+
+#ifdef    INTERLACE
+  } else {
+    // faked interlacing effect
+    unsigned char channel, channel2;
+
+    for (yt = ytable, y = 0; y < height; y++, yt += 3) {
+      for (xt = xtable, x = 0; x < width; x++) {
+        if (y & 1) {
+          channel = (unsigned char) (tr - (rsign * min(*(xt++), *(yt))));
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pr++) = channel2;
+
+          channel = (unsigned char) (tg - (bsign * min(*(xt++), *(yt + 1))));
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pg++) = channel2;
+
+          channel = (unsigned char) (tb - (gsign * min(*(xt++), *(yt + 2))));
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pb++) = channel2;
+        } else {
+          channel = (unsigned char) (tr - (rsign * min(*(xt++), *(yt))));
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pr++) = channel2;
+
+          channel = (unsigned char) (tg - (gsign * min(*(xt++), *(yt + 1))));
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pg++) = channel2;
+
+          channel = (unsigned char) (tb - (bsign * min(*(xt++), *(yt + 2))));
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pb++) = channel2;
+        }
+      }
+    }
+  }
+#endif // INTERLACE
+
+}
+
+
+void BImage::cdgradient(void) {
+  // cross diagonal gradient -  based on original dgradient, written by
+  // Mosfet (mosfet@kde.org)
+  // adapted from kde sources for Blackbox by Brad Hughes
+
+  float drx, dgx, dbx, dry, dgy, dby, yr = 0.0, yg = 0.0, yb = 0.0,
+    xr = (float) from->getRed(),
+    xg = (float) from->getGreen(),
+    xb = (float) from->getBlue();
+  unsigned char *pr = red, *pg = green, *pb = blue;
+  unsigned int w = width * 2, h = height * 2, *xt, *yt;
+
+  register unsigned int x, y;
+
+  dry = drx = (float) (to->getRed() - from->getRed());
+  dgy = dgx = (float) (to->getGreen() - from->getGreen());
+  dby = dbx = (float) (to->getBlue() - from->getBlue());
+
+  // Create X table
+  drx /= w;
+  dgx /= w;
+  dbx /= w;
+
+  for (xt = (xtable + (width * 3) - 1), x = 0; x < width; x++) {
+    *(xt--) = (unsigned char) xb;
+    *(xt--) = (unsigned char) xg;
+    *(xt--) = (unsigned char) xr;
+
+    xr += drx;
+    xg += dgx;
+    xb += dbx;
+  }
+
+  // Create Y table
+  dry /= h;
+  dgy /= h;
+  dby /= h;
+
+  for (yt = ytable, y = 0; y < height; y++) {
+    *(yt++) = (unsigned char) yr;
+    *(yt++) = (unsigned char) yg;
+    *(yt++) = (unsigned char) yb;
+
+    yr += dry;
+    yg += dgy;
+    yb += dby;
+  }
+
+  // Combine tables to create gradient
+
+#ifdef    INTERLACE
+  if (! interlaced) {
+#endif // INTERLACE
+
+    // normal cdgradient
+    for (yt = ytable, y = 0; y < height; y++, yt += 3) {
+      for (xt = xtable, x = 0; x < width; x++) {
+        *(pr++) = *(xt++) + *(yt);
+        *(pg++) = *(xt++) + *(yt + 1);
+        *(pb++) = *(xt++) + *(yt + 2);
+      }
+    }
+
+#ifdef    INTERLACE
+  } else {
+    // faked interlacing effect
+    unsigned char channel, channel2;
+
+    for (yt = ytable, y = 0; y < height; y++, yt += 3) {
+      for (xt = xtable, x = 0; x < width; x++) {
+        if (y & 1) {
+          channel = *(xt++) + *(yt);
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pr++) = channel2;
+
+          channel = *(xt++) + *(yt + 1);
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pg++) = channel2;
+
+          channel = *(xt++) + *(yt + 2);
+          channel2 = (channel >> 1) + (channel >> 2);
+          if (channel2 > channel) channel2 = 0;
+          *(pb++) = channel2;
+        } else {
+          channel = *(xt++) + *(yt);
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pr++) = channel2;
+
+          channel = *(xt++) + *(yt + 1);
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pg++) = channel2;
+
+          channel = *(xt++) + *(yt + 2);
+          channel2 = channel + (channel >> 3);
+          if (channel2 < channel) channel2 = ~0;
+          *(pb++) = channel2;
+        }
+      }
+    }
+  }
+#endif // INTERLACE
+
+}
+
+
+BImageControl::BImageControl(BaseDisplay *dpy, ScreenInfo *scrn, Bool _dither,
+                             int _cpc, unsigned long cache_timeout,
+                             unsigned long cmax)
+{
+	I18n *i18n = I18n::instance();
+	basedisplay = dpy;
+	screeninfo = scrn;
+	setDither(_dither);
+	setColorsPerChannel(_cpc);
+
+	cache_max = cmax;
+#ifdef    TIMEDCACHE
+	if (cache_timeout) {
+		timer = new BTimer(basedisplay, this);
+		timer->setTimeout(cache_timeout);
+		timer->start();
+	} else
+		timer = (BTimer *) 0;
+#endif // TIMEDCACHE
+
+	colors = (XColor *) 0;
+	ncolors = 0;
+
+	grad_xbuffer = grad_ybuffer = (unsigned int *) 0;
+	grad_buffer_width = grad_buffer_height = 0;
+
+	sqrt_table = (unsigned long *) 0;
+
+	screen_depth = screeninfo->getDepth();
+	window = screeninfo->getRootWindow();
+	screen_number = screeninfo->getScreenNumber();
+
+	int count;
+	XPixmapFormatValues *pmv = XListPixmapFormats(basedisplay->getXDisplay(),
+																&count);
+	colormap = screeninfo->getColormap();
+
+	if (pmv) {
+		bits_per_pixel = 0;
+		for (int i = 0; i < count; i++) {
+			if (pmv[i].depth == screen_depth) {
+				bits_per_pixel = pmv[i].bits_per_pixel;
+				break;
+      	}
+		}
+
+		XFree(pmv);
+	}
+
+	if (bits_per_pixel == 0)
+		bits_per_pixel = screen_depth;
+	if (bits_per_pixel >= 24)
+		setDither(False);
+
+	red_offset = green_offset = blue_offset = 0;
+
+	switch (getVisual()->c_class) {
+	case TrueColor:
+	{
+		int i;
+
+		// compute color tables
+		unsigned long red_mask = getVisual()->red_mask,
+			green_mask = getVisual()->green_mask,
+			blue_mask = getVisual()->blue_mask;
+
+		while (! (red_mask & 1)) { red_offset++; red_mask >>= 1; }
+		while (! (green_mask & 1)) { green_offset++; green_mask >>= 1; }
+		while (! (blue_mask & 1)) { blue_offset++; blue_mask >>= 1; }
+
+		red_bits = 255 / red_mask;
+		green_bits = 255 / green_mask;
+		blue_bits = 255 / blue_mask;
+
+		for (i = 0; i < 256; i++) {
+			red_color_table[i] = i / red_bits;
+			green_color_table[i] = i / green_bits;
+			blue_color_table[i] = i / blue_bits;
+		}
+	}
+
+	break;
+
+	case PseudoColor:
+	case StaticColor:
+	{
+		ncolors = colors_per_channel * colors_per_channel * colors_per_channel;
+
+		if (ncolors > (1 << screen_depth)) {
+			colors_per_channel = (1 << screen_depth) / 3;
+			ncolors = colors_per_channel * colors_per_channel * colors_per_channel;
+		}
+
+		if (colors_per_channel < 2 || ncolors > (1 << screen_depth)) {
+			fprintf(stderr,
+				i18n->
+				getMessage(
+#ifdef    NLS
+				ImageSet, ImageInvalidColormapSize,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"BImageControl::BImageControl: invalid colormap size %d "
+				"(%d/%d/%d) - reducing"),
+				ncolors, colors_per_channel, colors_per_channel,
+				colors_per_channel);
+
+			colors_per_channel = (1 << screen_depth) / 3;
+		}
+
+		colors = new XColor[ncolors];
+		if (! colors) {
+			fprintf(stderr,
+				i18n->
+				getMessage(
+#ifdef    NLS
+				ImageSet, ImageErrorAllocatingColormap,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"BImageControl::BImageControl: error allocating "
+				"colormap\n"));
+			throw static_cast(1); //throw exit code 1
+		}
+
+		int i = 0, ii, p, r, g, b,
+
+#ifdef    ORDEREDPSEUDO
+		bits = 256 / colors_per_channel;
+#else // !ORDEREDPSEUDO
+		bits = 255 / (colors_per_channel - 1);
+#endif // ORDEREDPSEUDO
+
+		red_bits = green_bits = blue_bits = bits;
+
+		for (i = 0; i < 256; i++)
+			red_color_table[i] = green_color_table[i] = blue_color_table[i] =
+					i / bits;
+
+		for (r = 0, i = 0; r < colors_per_channel; r++)
+			for (g = 0; g < colors_per_channel; g++)
+				for (b = 0; b < colors_per_channel; b++, i++) {
+					colors[i].red = (r * 0xffff) / (colors_per_channel - 1);
+					colors[i].green = (g * 0xffff) / (colors_per_channel - 1);
+					colors[i].blue = (b * 0xffff) / (colors_per_channel - 1);;
+					colors[i].flags = DoRed|DoGreen|DoBlue;
+				}
+
+		basedisplay->grab();
+
+		for (i = 0; i < ncolors; i++) {
+			if (! XAllocColor(basedisplay->getXDisplay(), colormap, &colors[i])) {
+				fprintf(stderr,
+				i18n->getMessage(
+#ifdef    NLS
+					ImageSet, ImageColorAllocFail,
+#else // !NLS
+					0, 0,
+#endif // NLS
+					"couldn't alloc color %i %i %i\n"),
+					colors[i].red, colors[i].green, colors[i].blue);
+					colors[i].flags = 0;
+			} else
+				colors[i].flags = DoRed|DoGreen|DoBlue;
+		}
+		
+		basedisplay->ungrab();
+
+		XColor icolors[256];
+		int incolors = (((1 << screen_depth) > 256) ? 256 : (1 << screen_depth));
+
+		for (i = 0; i < incolors; i++)
+			icolors[i].pixel = i;
+
+		XQueryColors(basedisplay->getXDisplay(), colormap, icolors, incolors);
+		for (i = 0; i < ncolors; i++) {
+			if (! colors[i].flags) {
+				unsigned long chk = 0xffffffff, pixel, close = 0;
+				p = 2;
+		
+				while (p--) {
+					for (ii = 0; ii < incolors; ii++) {
+						r = (colors[i].red - icolors[i].red) >> 8;
+						g = (colors[i].green - icolors[i].green) >> 8;
+						b = (colors[i].blue - icolors[i].blue) >> 8;
+						pixel = (r * r) + (g * g) + (b * b);
+
+						if (pixel < chk) {
+							chk = pixel;
+							close = ii;
+						}
+
+						colors[i].red = icolors[close].red;
+						colors[i].green = icolors[close].green;
+						colors[i].blue = icolors[close].blue;
+
+						if (XAllocColor(basedisplay->getXDisplay(), colormap,
+								&colors[i])) {
+							colors[i].flags = DoRed|DoGreen|DoBlue;
+							break;
+		      		}
+					}
+				}
+			}
+		}
+
+   break;
+	}
+
+	case GrayScale:
+	case StaticGray:
+	{
+
+		if (getVisual()->c_class == StaticGray) {
+			ncolors = 1 << screen_depth;
+		} else {
+			ncolors = colors_per_channel * colors_per_channel * colors_per_channel;
+
+			if (ncolors > (1 << screen_depth)) {
+				colors_per_channel = (1 << screen_depth) / 3;
+				ncolors =
+				colors_per_channel * colors_per_channel * colors_per_channel;
+			}
+		}
+
+		if (colors_per_channel < 2 || ncolors > (1 << screen_depth)) {
+			fprintf(stderr,
+				i18n->
+				getMessage(
+#ifdef    NLS
+					ImageSet, ImageInvalidColormapSize,
+#else // !NLS
+					0, 0,
+#endif // NLS
+					"BImageControl::BImageControl: invalid colormap size %d "
+					"(%d/%d/%d) - reducing"),
+			ncolors, colors_per_channel, colors_per_channel,
+			colors_per_channel);
+
+			colors_per_channel = (1 << screen_depth) / 3;
+		}
+
+		colors = new XColor[ncolors];
+		if (! colors) {
+			fprintf(stderr,
+				i18n->
+				getMessage(
+#ifdef    NLS
+					ImageSet, ImageErrorAllocatingColormap,
+#else // !NLS
+					0, 0,
+#endif // NLS
+					"BImageControl::BImageControl: error allocating "
+					"colormap\n"));
+			throw static_cast(1); // throw exit code 1
+		}
+
+		int i = 0, ii, p, bits = 255 / (colors_per_channel - 1);
+		red_bits = green_bits = blue_bits = bits;
+
+		for (i = 0; i < 256; i++)
+			red_color_table[i] = green_color_table[i] = blue_color_table[i] =
+	  		i / bits;
+
+		basedisplay->grab();
+		for (i = 0; i < ncolors; i++) {
+			colors[i].red = (i * 0xffff) / (colors_per_channel - 1);
+			colors[i].green = (i * 0xffff) / (colors_per_channel - 1);
+			colors[i].blue = (i * 0xffff) / (colors_per_channel - 1);;
+			colors[i].flags = DoRed|DoGreen|DoBlue;
+
+			if (! XAllocColor(basedisplay->getXDisplay(), colormap,
+					&colors[i])) {
+				fprintf(stderr,
+					i18n->
+					getMessage(
+#ifdef    NLS
+						ImageSet, ImageColorAllocFail,
+#else // !NLS
+						0, 0,
+#endif // NLS
+						"couldn't alloc color %i %i %i\n"),
+				colors[i].red, colors[i].green, colors[i].blue);
+				colors[i].flags = 0;
+			} else
+				colors[i].flags = DoRed|DoGreen|DoBlue;
+		}
+
+		basedisplay->ungrab();
+
+		XColor icolors[256];
+		int incolors = (((1 << screen_depth) > 256) ? 256 :
+				(1 << screen_depth));
+
+		for (i = 0; i < incolors; i++)
+			icolors[i].pixel = i;
+
+		XQueryColors(basedisplay->getXDisplay(), colormap, icolors, incolors);
+		for (i = 0; i < ncolors; i++) {
+			if (! colors[i].flags) {
+				unsigned long chk = 0xffffffff, pixel, close = 0;
+
+				p = 2;
+				while (p--) {
+					for (ii = 0; ii < incolors; ii++) {
+						int r = (colors[i].red - icolors[i].red) >> 8;
+						int g = (colors[i].green - icolors[i].green) >> 8;
+						int b = (colors[i].blue - icolors[i].blue) >> 8;
+						pixel = (r * r) + (g * g) + (b * b);
+
+						if (pixel < chk) {
+							chk = pixel;
+							close = ii;
+						}
+
+						colors[i].red = icolors[close].red;
+						colors[i].green = icolors[close].green;
+						colors[i].blue = icolors[close].blue;
+
+						if (XAllocColor(basedisplay->getXDisplay(), colormap,
+								&colors[i])) {
+							colors[i].flags = DoRed|DoGreen|DoBlue;
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		break;
+		}
+
+	default:
+		fprintf(stderr,
+			i18n->
+			getMessage(
+#ifdef    NLS
+					ImageSet, ImageUnsupVisual,
+#else // !NLS
+					0, 0,
+#endif // NLS
+					"BImageControl::BImageControl: unsupported visual %d\n"),
+				getVisual()->c_class);
+		throw static_cast(1); //throw error code 1
+	
+	}
+
+	cache = new LinkedList;
+}
+
+
+BImageControl::~BImageControl(void) {
+  if (sqrt_table) {
+    delete [] sqrt_table;
+  }
+
+  if (grad_xbuffer) {
+    delete [] grad_xbuffer;
+  }
+
+  if (grad_ybuffer) {
+    delete [] grad_ybuffer;
+  }
+
+  if (colors) {
+    unsigned long *pixels = new unsigned long [ncolors];
+
+    int i;
+    for (i = 0; i < ncolors; i++)
+      *(pixels + i) = (*(colors + i)).pixel;
+
+    XFreeColors(basedisplay->getXDisplay(), colormap, pixels, ncolors, 0);
+
+    delete [] colors;
+  }
+
+  if (cache->count()) {
+    int i, n = cache->count();
+    fprintf(stderr,
+	    I18n::instance()->
+            getMessage(
+#ifdef    NLS
+                       ImageSet, ImagePixmapRelease,
+#else // !NLS
+		       0, 0,
+#endif // NLS
+		       "BImageContol::~BImageControl: pixmap cache - "
+	               "releasing %d pixmaps\n"), n);
+
+    for (i = 0; i < n; i++) {
+      Cache *tmp = cache->first();
+      XFreePixmap(basedisplay->getXDisplay(), tmp->pixmap);
+      cache->remove(tmp);
+      delete tmp;
+    }
+
+#ifdef    TIMEDCACHE
+    if (timer) {
+      timer->stop();
+      delete timer;
+    }
+#endif // TIMEDCACHE
+  }
+
+  delete cache;
+}
+
+
+Pixmap BImageControl::searchCache(unsigned int width, unsigned int height,
+		  unsigned long texture,
+		  BColor *c1, BColor *c2) {
+  if (cache->count()) {
+    LinkedListIterator it(cache);
+
+    for (; it.current(); it++) {
+      if ((it.current()->width == width) &&
+          (it.current()->height == height) &&
+          (it.current()->texture == texture) &&
+          (it.current()->pixel1 == c1->getPixel()))
+          if (texture & BImage_Gradient) {
+            if (it.current()->pixel2 == c2->getPixel()) {
+              it.current()->count++;
+              return it.current()->pixmap;
+            }
+          } else {
+            it.current()->count++;
+            return it.current()->pixmap;
+          }
+        }
+  }
+
+  return None;
+}
+
+
+Pixmap BImageControl::renderImage(unsigned int width, unsigned int height,
+      BTexture *texture) {
+  if (texture->getTexture() & BImage_ParentRelative) return ParentRelative;
+
+  Pixmap pixmap = searchCache(width, height, texture->getTexture(),
+			      texture->getColor(), texture->getColorTo());
+  if (pixmap) return pixmap;
+
+  BImage image(this, width, height);
+  pixmap = image.render(texture);
+
+  if (pixmap) {
+    Cache *tmp = new Cache;
+
+    tmp->pixmap = pixmap;
+    tmp->width = width;
+    tmp->height = height;
+    tmp->count = 1;
+    tmp->texture = texture->getTexture();
+    tmp->pixel1 = texture->getColor()->getPixel();
+
+    if (texture->getTexture() & BImage_Gradient)
+      tmp->pixel2 = texture->getColorTo()->getPixel();
+    else
+      tmp->pixel2 = 0l;
+
+    cache->insert(tmp);
+
+    if ((unsigned) cache->count() > cache_max) {
+#ifdef    DEBUG
+      fprintf(stderr,
+              I18n::instance()->
+              getMessage(
+#ifdef    NLS
+                         ImageSet, ImagePixmapCacheLarge,
+#else // !NLS
+                         0, 0,
+#endif // NLS
+                         "BImageControl::renderImage: cache is large, "
+                         "forcing cleanout\n"));
+#endif // DEBUG
+
+      timeout();
+    }
+
+    return pixmap;
+  }
+
+  return None;
+}
+
+
+void BImageControl::removeImage(Pixmap pixmap) {
+  if (pixmap) {
+    LinkedListIterator it(cache);
+    for (; it.current(); it++) {
+      if (it.current()->pixmap == pixmap) {
+	Cache *tmp = it.current();
+
+        if (tmp->count) {
+	  tmp->count--;
+
+#ifdef    TIMEDCACHE
+	   if (! timer) timeout();
+#else // !TIMEDCACHE
+	   if (! tmp->count) timeout();
+#endif // TIMEDCACHE
+        }
+
+	return;
+      }
+    }
+  }
+}
+
+
+unsigned long BImageControl::getColor(const char *colorname,
+				      unsigned char *r, unsigned char *g,
+				      unsigned char *b)
+{
+  XColor color;
+  color.pixel = 0;
+
+  if (! XParseColor(basedisplay->getXDisplay(), colormap, colorname, &color))
+    fprintf(stderr, "BImageControl::getColor: color parse error: \"%s\"\n",
+	    colorname);
+  else if (! XAllocColor(basedisplay->getXDisplay(), colormap, &color))
+    fprintf(stderr, "BImageControl::getColor: color alloc error: \"%s\"\n",
+	    colorname);
+
+  if (color.red == 65535) *r = 0xff;
+  else *r = (unsigned char) (color.red / 0xff);
+  if (color.green == 65535) *g = 0xff;
+  else *g = (unsigned char) (color.green / 0xff);
+  if (color.blue == 65535) *b = 0xff;
+  else *b = (unsigned char) (color.blue / 0xff);
+
+  return color.pixel;
+}
+
+
+unsigned long BImageControl::getColor(const char *colorname) {
+  XColor color;
+  color.pixel = 0;
+
+  if (! XParseColor(basedisplay->getXDisplay(), colormap, colorname, &color))
+    fprintf(stderr, "BImageControl::getColor: color parse error: \"%s\"\n",
+	    colorname);
+  else  {
+		if (! XAllocColor(basedisplay->getXDisplay(), colormap, &color))
+	    fprintf(stderr, "BImageControl::getColor: color alloc error: \"%s\"\n",
+		    colorname);
+		else
+			fprintf(stderr, "%s(%d) Allocated color:%s", __FILE__, __LINE__, colorname);
+	}
+  return color.pixel;
+}
+
+
+void BImageControl::getColorTables(unsigned char **rmt, unsigned char **gmt,
+				   unsigned char **bmt,
+				   int *roff, int *goff, int *boff,
+                                   int *rbit, int *gbit, int *bbit) {
+  if (rmt) *rmt = red_color_table;
+  if (gmt) *gmt = green_color_table;
+  if (bmt) *bmt = blue_color_table;
+
+  if (roff) *roff = red_offset;
+  if (goff) *goff = green_offset;
+  if (boff) *boff = blue_offset;
+
+  if (rbit) *rbit = red_bits;
+  if (gbit) *gbit = green_bits;
+  if (bbit) *bbit = blue_bits;
+}
+
+
+void BImageControl::getXColorTable(XColor **c, int *n) {
+  if (c) *c = colors;
+  if (n) *n = ncolors;
+}
+
+
+void BImageControl::getGradientBuffers(unsigned int w,
+				       unsigned int h,
+				       unsigned int **xbuf,
+				       unsigned int **ybuf)
+{
+  if (w > grad_buffer_width) {
+    if (grad_xbuffer) {
+      delete [] grad_xbuffer;
+    }
+
+    grad_buffer_width = w;
+
+    grad_xbuffer = new unsigned int[grad_buffer_width * 3];
+  }
+
+  if (h > grad_buffer_height) {
+    if (grad_ybuffer) {
+      delete [] grad_ybuffer;
+    }
+
+    grad_buffer_height = h;
+
+    grad_ybuffer = new unsigned int[grad_buffer_height * 3];
+  }
+
+  *xbuf = grad_xbuffer;
+  *ybuf = grad_ybuffer;
+}
+
+
+void BImageControl::installRootColormap(void) {
+  basedisplay->grab();
+
+  Bool install = True;
+  int i = 0, ncmap = 0;
+  Colormap *cmaps =
+    XListInstalledColormaps(basedisplay->getXDisplay(), window, &ncmap);
+
+  if (cmaps) {
+    for (i = 0; i < ncmap; i++)
+      if (*(cmaps + i) == colormap)
+	install = False;
+
+    if (install)
+      XInstallColormap(basedisplay->getXDisplay(), colormap);
+
+    XFree(cmaps);
+  }
+
+  basedisplay->ungrab();
+}
+
+
+void BImageControl::setColorsPerChannel(int cpc) {
+  if (cpc < 2) cpc = 2;
+  if (cpc > 6) cpc = 6;
+
+  colors_per_channel = cpc;
+}
+
+
+unsigned long BImageControl::getSqrt(unsigned int x) {
+  if (! sqrt_table) {
+    // build sqrt table for use with elliptic gradient
+
+    sqrt_table = new unsigned long[(256 * 256 * 2) + 1];
+    int i = 0;
+
+    for (; i < (256 * 256 * 2); i++)
+      *(sqrt_table + i) = bsqrt(i);
+  }
+
+  return (*(sqrt_table + x));
+}
+
+
+void BImageControl::parseTexture(BTexture *texture, char *t) {
+  if ((! texture) || (! t)) return;
+
+  int t_len = strlen(t) + 1, i;
+  char *ts = new char[t_len];
+  if (! ts) return;
+
+  // convert to lower case
+  for (i = 0; i < t_len; i++)
+    *(ts + i) = tolower(*(t + i));
+
+  if (strstr(ts, "parentrelative")) {
+    texture->setTexture(BImage_ParentRelative);
+  } else {
+    texture->setTexture(0);
+
+    if (strstr(ts, "solid"))
+      texture->addTexture(BImage_Solid);
+    else if (strstr(ts, "gradient")) {
+      texture->addTexture(BImage_Gradient);
+      if (strstr(ts, "crossdiagonal"))
+	texture->addTexture(BImage_CrossDiagonal);
+      else if (strstr(ts, "rectangle"))
+	texture->addTexture(BImage_Rectangle);
+      else if (strstr(ts, "pyramid"))
+	texture->addTexture(BImage_Pyramid);
+      else if (strstr(ts, "pipecross"))
+	texture->addTexture(BImage_PipeCross);
+      else if (strstr(ts, "elliptic"))
+	texture->addTexture(BImage_Elliptic);
+      else if (strstr(ts, "diagonal"))
+	texture->addTexture(BImage_Diagonal);
+      else if (strstr(ts, "horizontal"))
+	texture->addTexture(BImage_Horizontal);
+      else if (strstr(ts, "vertical"))
+	texture->addTexture(BImage_Vertical);
+      else
+	texture->addTexture(BImage_Diagonal);
+    } else
+      texture->addTexture(BImage_Solid);
+
+    if (strstr(ts, "raised"))
+      texture->addTexture(BImage_Raised);
+    else if (strstr(ts, "sunken"))
+      texture->addTexture(BImage_Sunken);
+    else if (strstr(ts, "flat"))
+      texture->addTexture(BImage_Flat);
+    else
+      texture->addTexture(BImage_Raised);
+
+    if (! (texture->getTexture() & BImage_Flat))
+      if (strstr(ts, "bevel2"))
+	texture->addTexture(BImage_Bevel2);
+      else
+	texture->addTexture(BImage_Bevel1);
+
+#ifdef    INTERLACE
+    if (strstr(ts, "interlaced"))
+      texture->addTexture(BImage_Interlaced);
+#endif // INTERLACE
+  }
+
+  delete [] ts;
+}
+
+
+void BImageControl::parseColor(BColor *color, char *c) {
+  if (! color) return;
+
+  if (color->isAllocated()) {
+    unsigned long pixel = color->getPixel();
+
+    XFreeColors(basedisplay->getXDisplay(), colormap, &pixel, 1, 0);
+
+    color->setPixel(0l);
+    color->setRGB(0, 0, 0);
+    color->setAllocated(False);
+  }
+
+  if (c) {
+    unsigned char r, g, b;
+
+    color->setPixel(getColor(c, &r, &g, &b));
+    color->setRGB(r, g, b);
+    color->setAllocated(True);
+  }
+}
+
+
+void BImageControl::timeout(void) {
+  LinkedListIterator it(cache);
+  for (; it.current(); it++) {
+    Cache *tmp = it.current();
+
+    if (tmp->count <= 0) {
+      XFreePixmap(basedisplay->getXDisplay(), tmp->pixmap);
+      cache->remove(tmp);
+      delete tmp;
+    }
+  }
+}
diff --git a/src/Image.hh b/src/Image.hh
new file mode 100644
index 00000000..3811e69c
--- /dev/null
+++ b/src/Image.hh
@@ -0,0 +1,242 @@
+// Image.hh for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef   _IMAGE_HH_
+#define   _IMAGE_HH_
+
+#include 
+#include 
+
+#include "Timer.hh"
+
+class BImage;
+class BImageControl;
+
+
+class BColor {
+private:
+  int allocated;
+  unsigned char red, green, blue;
+  unsigned long pixel;
+
+public:
+  BColor(char r = 0, char g = 0, char b = 0)
+    { red = r; green = g; blue = b; pixel = 0; allocated = 0; }
+
+  inline const int &isAllocated(void) const { return allocated; }
+
+  inline const unsigned char &getRed(void) const { return red; }
+  inline const unsigned char &getGreen(void) const { return green; }
+  inline const unsigned char &getBlue(void) const { return blue; }
+
+  inline const unsigned long &getPixel(void) const { return pixel; }
+
+  inline void setAllocated(int a) { allocated = a; }
+  inline void setRGB(char r, char g, char b) { red = r; green = g; blue = b; }
+  inline void setPixel(unsigned long p) { pixel = p; }
+};
+
+
+class BTexture {
+private:
+  BColor color, colorTo, hiColor, loColor;
+  unsigned long texture;
+
+public:
+  BTexture(void) { texture = 0; }
+
+  inline BColor *getColor(void) { return &color; }
+  inline BColor *getColorTo(void) { return &colorTo; }
+  inline BColor *getHiColor(void) { return &hiColor; }
+  inline BColor *getLoColor(void) { return &loColor; }
+
+  inline const unsigned long &getTexture(void) const { return texture; }
+
+  inline void setTexture(unsigned long t) { texture = t; }
+  inline void addTexture(unsigned long t) { texture |= t; }
+};
+
+
+// bevel options
+#define BImage_Flat		(1l<<1)
+#define BImage_Sunken		(1l<<2)
+#define BImage_Raised		(1l<<3)
+
+// textures
+#define BImage_Solid		(1l<<4)
+#define BImage_Gradient		(1l<<5)
+
+// gradients
+#define BImage_Horizontal	(1l<<6)
+#define BImage_Vertical		(1l<<7)
+#define BImage_Diagonal		(1l<<8)
+#define BImage_CrossDiagonal	(1l<<9)
+#define BImage_Rectangle	(1l<<10)
+#define BImage_Pyramid		(1l<<11)
+#define BImage_PipeCross	(1l<<12)
+#define BImage_Elliptic		(1l<<13)
+
+// bevel types
+#define BImage_Bevel1		(1l<<14)
+#define BImage_Bevel2		(1l<<15)
+
+// inverted image
+#define BImage_Invert		(1l<<16)
+
+// parent relative image
+#define BImage_ParentRelative   (1l<<17)
+
+#ifdef    INTERLACE
+// fake interlaced image
+#  define BImage_Interlaced	(1l<<18)
+#endif // INTERLACE
+
+#include "BaseDisplay.hh"
+#include "LinkedList.hh"
+
+
+class BImage {
+private:
+  BImageControl *control;
+
+#ifdef    INTERLACE
+  Bool interlaced;
+#endif // INTERLACE
+
+  XColor *colors;
+
+  BColor *from, *to;
+  int red_offset, green_offset, blue_offset, red_bits, green_bits, blue_bits,
+    ncolors, cpc, cpccpc;
+  unsigned char *red, *green, *blue, *red_table, *green_table, *blue_table;
+  unsigned int width, height, *xtable, *ytable;
+
+
+protected:
+  Pixmap renderPixmap(void);
+
+  XImage *renderXImage(void);
+
+  void invert(void);
+  void bevel1(void);
+  void bevel2(void);
+  void dgradient(void);
+  void egradient(void);
+  void hgradient(void);
+  void pgradient(void);
+  void rgradient(void);
+  void vgradient(void);
+  void cdgradient(void);
+  void pcgradient(void);
+
+
+public:
+  BImage(BImageControl *, unsigned int, unsigned int);
+  ~BImage(void);
+
+  Pixmap render(BTexture *);
+  Pixmap render_solid(BTexture *);
+  Pixmap render_gradient(BTexture *);
+};
+
+
+class BImageControl : public TimeoutHandler {
+private:
+  Bool dither;
+  BaseDisplay *basedisplay;
+  ScreenInfo *screeninfo;
+#ifdef    TIMEDCACHE
+  BTimer *timer;
+#endif // TIMEDCACHE
+
+  Colormap colormap;
+
+  Window window;
+  XColor *colors;
+  int colors_per_channel, ncolors, screen_number, screen_depth,
+    bits_per_pixel, red_offset, green_offset, blue_offset,
+    red_bits, green_bits, blue_bits;
+  unsigned char red_color_table[256], green_color_table[256],
+    blue_color_table[256];
+  unsigned int *grad_xbuffer, *grad_ybuffer, grad_buffer_width,
+    grad_buffer_height;
+  unsigned long *sqrt_table, cache_max;
+
+  typedef struct Cache {
+    Pixmap pixmap;
+
+    unsigned int count, width, height;
+    unsigned long pixel1, pixel2, texture;
+  } Cache;
+
+  LinkedList *cache;
+
+
+protected:
+  Pixmap searchCache(unsigned int, unsigned int, unsigned long, BColor *,
+                     BColor *);
+
+
+public:
+  BImageControl(BaseDisplay *, ScreenInfo *, Bool = False, int = 4,
+                unsigned long = 300000l, unsigned long = 200l);
+  virtual ~BImageControl(void);
+
+  inline BaseDisplay *getBaseDisplay(void) { return basedisplay; }
+
+  inline const Bool &doDither(void) { return dither; }
+  inline const Colormap &getColormap(void) const { return colormap; }
+  inline ScreenInfo *getScreenInfo(void) { return screeninfo; }
+
+  inline const Window &getDrawable(void) const { return window; }
+
+  inline Visual *getVisual(void) { return screeninfo->getVisual(); }
+
+  inline const int &getBitsPerPixel(void) const { return bits_per_pixel; }
+  inline const int &getDepth(void) const { return screen_depth; }
+  inline const int &getColorsPerChannel(void) const
+    { return colors_per_channel; }
+
+  unsigned long getColor(const char *);
+  unsigned long getColor(const char *, unsigned char *, unsigned char *,
+                         unsigned char *);
+  unsigned long getSqrt(unsigned int);
+
+  Pixmap renderImage(unsigned int, unsigned int, BTexture *);
+
+  void installRootColormap(void);
+  void removeImage(Pixmap);
+  void getColorTables(unsigned char **, unsigned char **, unsigned char **,
+                      int *, int *, int *, int *, int *, int *);
+  void getXColorTable(XColor **, int *);
+  void getGradientBuffers(unsigned int, unsigned int,
+                          unsigned int **, unsigned int **);
+  void setDither(Bool d) { dither = d; }
+  void setColorsPerChannel(int);
+  void parseTexture(BTexture *, char *);
+  void parseColor(BColor *, char * = 0);
+
+  virtual void timeout(void);
+};
+
+
+#endif // __Image_hh
+
diff --git a/src/Keys.cc b/src/Keys.cc
new file mode 100644
index 00000000..fad11af7
--- /dev/null
+++ b/src/Keys.cc
@@ -0,0 +1,583 @@
+// Key2.cc for Fluxbox - an X11 Window manager
+// Copyright (c) 2001 Henrik Kinnunen (fluxgen@linuxmail.org)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+
+#ifdef		HAVE_CONFIG_H
+#	 include "config.h"
+#endif
+
+#ifdef		HAVE_STDIO_H
+#	 include 
+#endif									// HAVE_STDIO_H
+
+#ifdef		HAVE_CTYPE_H
+#	 include 
+#endif									// HAVE_CTYPE_H
+
+#ifdef		STDC_HEADERS
+#	 include 
+#	 include 
+#  include 
+#endif									// STDC_HEADERS
+
+#if HAVE_STRINGS_H
+# include 
+#endif
+
+#ifdef		HAVE_SYS_TYPES_H
+#	 include 
+#endif									// HAVE_SYS_TYPES_H
+
+#ifdef		HAVE_SYS_WAIT_H
+#	 include 
+#endif									// HAVE_SYS_WAIT_H
+
+#ifdef		HAVE_UNISTD_H
+#	 include 
+#endif									// HAVE_UNISTD_H
+
+#ifdef		HAVE_SYS_STAT_H
+#	 include 
+#endif									// HAVE_SYS_STAT_H
+
+#include 
+#include 
+#include 
+
+#include "Keys.hh"
+#include "fluxbox.hh"
+
+#include 
+#include 
+
+using namespace std;
+
+Keys::t_actionstr Keys::m_actionlist[] = {
+		{"Minimize", grabIconify},
+		{"Raise", grabRaise},
+		{"Lower", grabLower},
+		{"Close", grabClose},
+		{"AbortKeychain", grabAbortKeychain},
+		{"Workspace1", grabWorkspace1},
+		{"Workspace2", grabWorkspace2},
+		{"Workspace3", grabWorkspace3},
+		{"Workspace4", grabWorkspace4},
+		{"Workspace5", grabWorkspace5},
+		{"Workspace6", grabWorkspace6},
+		{"Workspace7", grabWorkspace7},
+		{"Workspace8", grabWorkspace8},
+		{"Workspace9", grabWorkspace9},
+		{"Workspace10", grabWorkspace10},
+		{"Workspace11", grabWorkspace11},
+		{"Workspace12",  grabWorkspace12},
+		{"NextWorkspace", grabNextWorkspace},
+		{"PrevWorkspace", grabPrevWorkspace},
+		{"LeftWorkspace", grabLeftWorkspace},
+		{"RightWorkspace", grabRightWorkspace},
+		{"KillWindow", grabKillWindow},
+		{"NextWindow", grabNextWindow},
+		{"PrevWindow", grabPrevWindow},
+		{"NextTab", grabNextTab},
+		{"PrevTab", grabPrevTab},
+		{"ShadeWindow", grabShade},
+		{"MaximizeWindow", grabMaximize},
+		{"StickWindow", grabStick},
+		{"ExecCommand", grabExecute},
+		{"MaximizeVertical", grabVertMax},
+		{"MaximizeHorizontal", grabHorizMax},
+		{"NudgeRight", grabNudgeRight},
+		{"NudgeLeft", grabNudgeLeft},
+		{"NudgeUp", grabNudgeUp},
+		{"NudgeDown", grabNudgeDown},
+		{"BigNudgeRight", grabBigNudgeRight},
+		{"BigNudgeLeft", grabBigNudgeLeft},
+		{"BigNudgeUp", grabBigNudgeUp},
+		{"BigNudgeDown", grabBigNudgeDown},
+		{"HorizontalIncrement", grabHorizInc},
+		{"VerticalIncrement", grabVertInc},
+		{"HorizontalDecrement", grabHorizDec},
+		{"VerticalDecrement", grabVertDec},
+		{"ToggleDecor", grabToggleDecor},	
+		{0, lastKeygrab}
+		};	
+
+Keys::Keys(char *filename) {
+	m_abortkey=0;	
+	load(filename);
+}
+
+Keys::~Keys() {
+	deleteTree();
+}
+//--------- deleteTree -----------
+// Destroys the keytree and m_abortkey
+//--------------------------------
+void Keys::deleteTree() {
+	while (!m_keylist.empty()) {
+		if (m_keylist.back())
+			delete m_keylist.back();		
+		m_keylist.pop_back();
+	}
+	if (m_abortkey) {
+		delete m_abortkey;
+		m_abortkey=0;
+	}	
+}
+//-------------- load ----------------
+// Load and grab keys
+// Returns true on success else false
+// TODO: error checking and nls on them?
+// and possible replacement of strtok
+//------------------------------------
+bool Keys::load(char *filename) {
+	if (!filename)
+		return false;
+	
+	Fluxbox *fluxbox = Fluxbox::instance();
+	Display *display = fluxbox->getXDisplay();
+	ScreenInfo *screeninfo=0;
+	//ungrab all keys
+	int screen=0;
+	while ((screeninfo = fluxbox->getScreenInfo(screen++)) ) {
+		XUngrabKey(display, AnyKey, AnyModifier,
+		screeninfo->getRootWindow());		
+	}
+	
+	XSync(display, False);
+						
+	//open the file
+	ifstream infile(filename);
+	if (!infile)
+		return false;
+	
+	
+	char *linebuffer = new char[1024];
+	int line=0;
+	int linepos=0; //position in the line
+
+	while (!infile.eof()) {
+		infile.getline(linebuffer, 1024);		
+
+		line++;
+		char *val = strtok(linebuffer, " ");
+		linepos = (val==0 ? 0 : strlen(val) + 1);	
+
+		int numarg = 1;
+		unsigned int key=0, mod=0;		
+		char keyarg=0;
+		t_key *current_key=0, *last_key=0;
+		
+		while (val) {			
+
+			if (val[0]!=':') {
+				keyarg++;
+				if (keyarg==1) //first arg is modifier
+					mod = getModifier(val);					
+				else if (keyarg>1) {
+					
+					//keyarg=0;
+					key = getKey(val);
+					if (!key){ //if no keycode was found try the modifier
+						int tmpmod = getModifier(val);
+						if (tmpmod)
+							mod |= tmpmod; //add it to modifier
+							
+					} else if (!current_key) {
+									
+						current_key = new t_key(key, mod);
+						last_key = current_key;
+						
+					} else { 
+						
+						t_key *temp_key = new t_key(key, mod);
+						last_key->keylist.push_back(temp_key);
+						last_key = temp_key;
+					}
+
+				}			
+
+			} else {
+				
+				val++; //ignore the ':'
+
+				unsigned int i=0;
+
+				for (i=0; i< lastKeygrab; i++) {
+					if (strcasecmp(m_actionlist[i].string, val) == 0)
+						break;	
+				}
+
+				if (i < lastKeygrab ) {
+					if (!current_key) {
+						cerr<<"Error on line: "<key, current_key->mod, grabAbortKeychain);
+
+						delete current_key;
+						current_key = 0;
+						last_key = 0;
+						break; //break out and read next line
+					}
+					
+					last_key->action = m_actionlist[i].action;
+					if (last_key->action == grabExecute)
+						last_key->execcommand = &linebuffer[linepos];
+
+					//add the keychain to list										
+					if (!mergeTree(current_key))
+						cerr<<"Keys: Faild to merge keytree!"<execcommand<getXDisplay();
+	
+	#ifdef DEBUG
+	cerr<<__FILE__<<"("<<__LINE__<<"): keycode "<getScreenInfo(i++)) ) {
+		Window root = screeninfo->getRootWindow();
+		XGrabKey(display, key, mod,
+							root, True,
+							GrabModeAsync, GrabModeAsync);
+						
+		// Grab with numlock, capslock and scrlock	
+
+		//numlock	
+		XGrabKey(display, key, mod|Mod2Mask,
+							root, True,
+							GrabModeAsync, GrabModeAsync);		
+		//scrolllock
+		XGrabKey(display, key, mod|Mod5Mask,
+						root, True,
+						GrabModeAsync, GrabModeAsync);	
+		//capslock
+		XGrabKey(display, key, mod|LockMask,
+							root, True,
+							GrabModeAsync, GrabModeAsync);
+	
+		//capslock+numlock
+		XGrabKey(display, key, mod|LockMask|Mod2Mask,
+							root, True,
+							GrabModeAsync, GrabModeAsync);
+
+		//capslock+scrolllock
+		XGrabKey(display, key, mod|LockMask|Mod5Mask,
+							root, True,
+							GrabModeAsync, GrabModeAsync);						
+	
+		//capslock+numlock+scrolllock
+		XGrabKey(display, key, mod|Mod2Mask|Mod5Mask|LockMask,
+							root, True,
+							GrabModeAsync, GrabModeAsync);						
+
+		//numlock+scrollLock
+		XGrabKey(display, key, mod|Mod2Mask|Mod5Mask,
+							root, True,
+							GrabModeAsync, GrabModeAsync);
+	
+	}
+			
+}
+
+//------------ getModifier ---------------
+// Returns the modifier for the modstr
+// else zero on failure.
+// TODO fix more masks
+//----------------------------------------
+unsigned int Keys::getModifier(char *modstr) {
+	if (!modstr)
+		return 0;
+	struct t_modlist{
+		char *string;
+		unsigned int mask;
+		bool operator == (char *modstr) {
+			return  (strcasecmp(string, modstr) == 0 && mask !=0);
+		}
+	} modlist[] = {
+			{"SHIFT", ShiftMask},
+			{"CONTROL", ControlMask},
+			{"MOD1", Mod1Mask},
+			{"MOD2", Mod2Mask},
+			{"MOD3", Mod3Mask},
+			{"MOD4", Mod4Mask},
+			{"MOD5", Mod5Mask},
+			{0, 0}
+		};
+		
+	for (unsigned int i=0; modlist[i].string!=0; i++) {
+		if (modlist[i]==modstr)		
+			return modlist[i].mask;		
+	}
+	
+	return 0;	
+}
+
+//----------- getKey ----------------
+// Returns keycode of keystr on success
+// else it returns zero
+//-----------------------------------
+unsigned int Keys::getKey(char *keystr) {
+	if (!keystr)
+		return 0;
+	return XKeysymToKeycode(Fluxbox::instance()->getXDisplay(),
+							 XStringToKeysym
+							 (keystr));
+}
+
+//--------- getAction -----------------
+// returns the KeyAction of the XKeyEvent
+//-------------------------------------
+Keys::KeyAction Keys::getAction(XKeyEvent *ke) {	
+	static t_key *next_key = 0;
+	//remove numlock, capslock and scrolllock
+	ke->state &= ~Mod2Mask & ~Mod5Mask & ~LockMask;
+	
+	if (m_abortkey && *m_abortkey==ke) { //abort current keychain
+		next_key = 0;		
+		return m_abortkey->action;
+	}
+	
+	if (!next_key) {
+	
+		for (unsigned int i=0; ikeylist.size()) {
+					next_key = m_keylist[i];
+					break; //end for-loop 
+				} else {
+					if (m_keylist[i]->action == grabExecute)
+						m_execcmdstring = m_keylist[i]->execcommand; //update execcmdstring if action is grabExecute
+					return m_keylist[i]->action;
+				}
+			}
+		}
+	
+	} else { //check the nextkey
+		t_key *temp_key = next_key->find(ke);
+		if (temp_key) {
+			if (temp_key->keylist.size()) {
+				next_key = temp_key;								
+			} else {
+				next_key = 0;
+				if (temp_key->action == grabExecute)
+					m_execcmdstring = temp_key->execcommand; //update execcmdstring if action is grabExecute
+				return temp_key->action;
+			}
+		}  else  {
+			temp_key = next_key;		
+			next_key = 0;
+			if (temp_key->action == grabExecute)
+				m_execcmdstring = temp_key->execcommand; //update execcmdstring if action is grabExecute
+			return temp_key->action;				
+		}
+		
+	}
+	
+	return lastKeygrab;
+}
+
+//--------- reconfigure -------------
+// deletes the tree and load configuration
+// returns true on success else false
+//-----------------------------------
+bool Keys::reconfigure(char *filename) {
+	deleteTree();
+	return load(filename);
+}
+
+//------------- getActionStr ------------------
+// Tries to find the action for the key
+// Returns actionstring on success else
+// 0 on failure
+//---------------------------------------------
+const char *Keys::getActionStr(KeyAction action) {
+	for (unsigned int i=0; m_actionlist[i].string!=0 ; i++) {
+		if (m_actionlist[i].action == action) 
+			return m_actionlist[i].string;
+	}
+	
+	return 0;
+}
+
+#ifdef DEBUG
+//--------- showTree -----------
+// Debug function that show the
+// keytree. Starts with the
+// rootlist
+//------------------------------
+void Keys::showTree() {
+	for (unsigned int i=0; ikeylist.empty()) {
+		for (unsigned int i=0; ikeylist.size(); i++) {
+			cerr<<"( "<<(int)key->key<<" "<<(int)key->mod<<" )";
+			showKeyTree(key->keylist[i], 4);		
+			cerr<key<<" "<<(int)key->mod<<" ) {"<action)<<"}"<mod == newtree->mod && 
+					m_keylist[baselist_i]->key == newtree->key) {
+				if (newtree->keylist.size() && m_keylist[baselist_i]->action == lastKeygrab) {
+					//assumes the newtree only have one branch
+					return mergeTree(newtree->keylist[0], m_keylist[baselist_i]);
+				} else
+					break;
+			}
+		}
+
+		if (baselist_i == m_keylist.size()) {
+			grabKey(newtree->key, newtree->mod);
+			m_keylist.push_back(new t_key(newtree));			
+			if (newtree->keylist.size())
+				return mergeTree(newtree->keylist[0], m_keylist.back());
+			return true;
+		}
+		
+	} else {
+		unsigned int baselist_i = 0;
+		for (; baselist_ikeylist.size(); baselist_i++) {
+			if (basetree->keylist[baselist_i]->mod == newtree->mod &&
+					basetree->keylist[baselist_i]->key == newtree->key) {
+				if (newtree->keylist.size()) {
+					//assumes the newtree only have on branch
+					return mergeTree(newtree->keylist[0], basetree->keylist[baselist_i]);
+				} else
+					return false;
+			}					
+		}
+		//if it wasn't in the list grab the key and add it to the list
+		if (baselist_i==basetree->keylist.size()) {			
+			grabKey(newtree->key, newtree->mod);
+			basetree->keylist.push_back(new t_key(newtree));
+			if (newtree->keylist.size())
+				return mergeTree(newtree->keylist[0], basetree->keylist.back());
+			return true;		
+		}		
+	}
+	
+	return false;
+}
+
+Keys::t_key::t_key(unsigned int key_, unsigned int mod_, KeyAction action_) {
+	action = action_;
+	key = key_;
+	mod = mod_;	
+}
+
+Keys::t_key::t_key(t_key *k) {
+	action = k->action;
+	key = k->key;
+	mod = k->mod;
+	execcommand = k->execcommand;
+}
+
+Keys::t_key::~t_key() {	
+	while (!keylist.empty()) {		
+		t_key *k = keylist.back();
+		delete k;
+		keylist.pop_back();				
+	}
+}
diff --git a/src/Keys.hh b/src/Keys.hh
new file mode 100644
index 00000000..3b19aaa7
--- /dev/null
+++ b/src/Keys.hh
@@ -0,0 +1,116 @@
+// Key2.hh for Fluxbox - an X11 Window manager
+// Copyright (c) 2001 Henrik Kinnunen (fluxgen@linuxmail.org)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+#ifndef _KEYS_HH_
+#define _KEYS_HH_
+
+#include 
+#include 
+	
+class Keys 
+{
+public:
+enum KeyAction{
+			grabIconify=0,
+			grabRaise,
+			grabLower,
+			grabClose,
+			grabAbortKeychain,
+			grabWorkspace1, grabWorkspace2, grabWorkspace3,	grabWorkspace4,	grabWorkspace5,
+			grabWorkspace6,	grabWorkspace7,	grabWorkspace8,	grabWorkspace9,	grabWorkspace10,
+			grabWorkspace11, grabWorkspace12,	grabNextWorkspace, grabPrevWorkspace,
+			grabLeftWorkspace, grabRightWorkspace,
+			grabKillWindow, grabNextWindow,	grabPrevWindow,
+			grabNextTab, grabPrevTab,
+			grabShade, grabMaximize, grabStick, grabExecute,	grabVertMax,
+			grabHorizMax,	grabNudgeRight,	grabNudgeLeft,grabNudgeUp,
+			grabNudgeDown,	grabBigNudgeRight, grabBigNudgeLeft,
+			grabBigNudgeUp,	grabBigNudgeDown,
+			grabHorizInc,	grabVertInc, grabHorizDec, grabVertDec,
+			grabToggleDecor,
+			lastKeygrab
+	};
+	
+	Keys(char *filename);
+	~Keys();
+	bool load(char *filename=0);
+	KeyAction getAction(XKeyEvent *ke);
+	bool reconfigure(char *filename);
+	const char *getActionStr(KeyAction action);
+	std::string getExecCommand() { return m_execcmdstring; }
+private:
+	void deleteTree();
+	
+	void bindKey(unsigned int key, unsigned int mod);
+	unsigned int getModifier(char *modstr);
+	unsigned int getKey(char *keystr);
+	void grabKey(unsigned int key, unsigned int mod);
+	std::string filename;	
+	
+	class t_key {	
+		public:
+		t_key(unsigned int key, unsigned int mod, KeyAction action_ = lastKeygrab);
+		t_key(t_key *k);
+		~t_key();
+		
+		inline t_key *find(unsigned int key_, unsigned int mod_) {
+			for (unsigned int i=0; ikey == key_ && keylist[i]->mod == mod_)
+					return keylist[i];				
+			}			
+			return 0;
+		}
+		inline t_key *find(XKeyEvent *ke) {
+			for (unsigned int i=0; ikey == ke->keycode && keylist[i]->mod == ke->state)
+					return keylist[i];				
+			}			
+			return 0;
+		}
+			
+		inline bool operator == (XKeyEvent *ke) {
+			return (mod == ke->state && key == ke->keycode);
+		}
+		
+		KeyAction action;
+		unsigned int key;
+		unsigned int mod;
+		std::vector keylist;
+		std::string execcommand;
+	};
+	
+	bool mergeTree(t_key *newtree, t_key *basetree=0);
+	#ifdef DEBUG
+	//debug functions
+	void showTree();
+	void showKeyTree(t_key *key, unsigned int w=0);
+	#endif //DEBUG
+	struct t_actionstr{
+		const char *string;
+		KeyAction action;
+	};	
+	static t_actionstr m_actionlist[];
+	
+	std::vector m_keylist;	
+	t_key *m_abortkey; //abortkey for keygrabbing chain
+	std::string m_execcmdstring; //copy of the execcommandstring
+};
+
+#endif // _KEYS_HH_
diff --git a/src/LinkedList.cc b/src/LinkedList.cc
new file mode 100644
index 00000000..bd958d75
--- /dev/null
+++ b/src/LinkedList.cc
@@ -0,0 +1,354 @@
+// LinkedList.cc for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the 
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in 
+// all copies or substantial portions of the Software. 
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL 
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+// DEALINGS IN THE SOFTWARE.
+  
+// stupid macros needed to access some functions in version 2 of the GNU C 
+// library
+#ifndef   _GNU_SOURCE
+#define   _GNU_SOURCE
+#endif // _GNU_SOURCE
+
+#include "LinkedList.hh"
+
+#ifdef    HAVE_CONFIG_H
+#  include "../config.h"
+#endif // HAVE_CONFIG_H
+
+#ifdef    HAVE_STDIO_H
+#  include 
+#endif // HAVE_STDIO_H
+
+
+__llist_iterator::__llist_iterator(__llist *l) {
+  // initialize the iterator...
+  list = l;
+
+  if (list) {
+    if (! list->iterators)
+      list->iterators = new __llist;
+
+    list->iterators->insert(this);
+  }
+
+  reset();
+}
+
+
+__llist_iterator::~__llist_iterator(void) {
+  if (list && list->iterators)
+    list->iterators->remove(this);
+}
+
+
+void *__llist_iterator::current(void) {
+  // return the current node data... if any
+  return ((node) ? node->getData() : 0);
+}
+
+
+void __llist_iterator::reset(void) {
+  // update the iterator's current node to the first node in the linked list
+  if (list)
+    node = list->_first;
+}
+
+
+const int __llist_iterator::set(const int index) {
+  // set the current node to index
+  if (list) {
+    if (index < list->elements && index >= 0 && list->_first) {
+      node = list->_first;
+      
+      for (register int i = 0; i < index; i++)
+	node = node->getNext();
+      
+      return 1;
+    }
+  }
+  
+  node = (__llist_node *) 0;
+  return 0;
+}
+
+
+void __llist_iterator::operator++(void) {
+  // iterate to the next node in the list...
+  node = ((node) ? node->getNext() : 0);
+}     
+
+
+void __llist_iterator::operator++(int) {
+  // iterate to the next node in the list...
+  node = ((node) ? node->getNext() : 0);
+}
+
+
+__llist::__llist(void *d) {
+  // initialize the linked list...
+  _first = (__llist_node *) 0;
+  _last = (__llist_node *) 0;
+  iterators = (__llist *) 0;
+  elements = 0;
+  
+  if (d) insert(d);
+}
+
+
+__llist::~__llist(void) {
+  // remove all the items in the list...
+  for (register int i = 0, r = elements; i < r; i++)
+    remove(0);
+
+  if (iterators) {
+    __llist_node *n = iterators->_first;
+
+    while (n) {
+      ((__llist_iterator *) n->getData())->list = (__llist *) 0;
+      ((__llist_iterator *) n->getData())->node = (__llist_node *) 0;
+
+      n = n->getNext();
+    }
+
+    delete iterators;
+  }
+}
+
+
+const int __llist::insert(void *d, int index) {
+  // insert item into linked list at specified index...
+  
+  if ((! _first) || (! _last)) {
+    // list is empty... insert the item as the first item, regardless of the
+    // index given
+    _first = new __llist_node;
+    _first->setData(d);
+    _first->setNext((__llist_node *) 0);
+    _last = _first;
+  } else {
+    if (index == 0) {
+      // if index is 0... prepend the data on the list
+      __llist_node *nnode = new __llist_node;
+      
+      nnode->setData(d);
+      nnode->setNext(_first);
+      
+      _first = nnode;
+    } else if ((index == -1) || (index == elements)) {
+      // if index is -1... append the data on the list
+      __llist_node *nnode = new __llist_node;
+      
+      nnode->setData(d);
+      nnode->setNext((__llist_node *) 0);
+      _last->setNext(nnode);
+
+      _last = nnode;
+    } else if (index < elements) {
+      // otherwise... insert the item at the position specified by index
+      __llist_node *nnode = new __llist_node, *inode = _first->getNext();
+      
+      if (! nnode)
+	return -1;
+      
+      nnode->setData(d);
+      
+      for (register int i = 1; i < index; i++)
+	if (inode)
+	  inode = inode->getNext();
+	else {
+	  delete nnode;
+	  return -1;
+	}
+      
+      if ((! inode) || inode == _last) {
+	nnode->setNext((__llist_node *) 0);
+	_last->setNext(nnode);
+	
+	_last = nnode;
+      } else {
+	nnode->setNext(inode->getNext());
+	inode->setNext(nnode);
+      }
+    }
+  }
+  
+  return ++elements;
+}
+
+
+const int __llist::remove(void *d) {
+  // remove list item whose data pointer address matches the pointer address
+  // given
+
+  if ((! _first) || (! _last))
+    return -1;
+  else if (_first->getData() == d) {
+    // remove the first item in the list...
+    __llist_node *node = _first;
+    _first = _first->getNext();
+
+    if (iterators && iterators->_first) {
+      __llist_node *n = iterators->_first;
+      while (n) {
+        ((__llist_iterator *) n->getData())->reset();
+        n = n->getNext();
+      }
+    }
+ 
+    --elements;
+    delete node;
+    return 0;
+  } else {
+    // iterate through the list and remove the first occurance of the item
+    
+    // NOTE: we don't validate _first in this assignment, because it is checked
+    // for validity above...
+    __llist_node *rnode = _first->getNext(), *prev = _first;
+    
+    for (register int i = 1; i < elements; i++)
+      if (rnode)
+	if (rnode->getData() == d) {
+	  // we found the item... update the previous node and delete the
+	  // now useless rnode...
+	  prev->setNext(rnode->getNext());
+	  
+	  if (rnode == _last)
+	    _last = prev;
+
+          if (iterators && iterators->_first) {
+            __llist_node *n = iterators->_first;
+            while (n) {
+              ((__llist_iterator *) n->getData())->reset();
+              n = n->getNext();
+            }
+          }
+
+	  --elements;
+	  delete rnode;
+	  return i;
+	} else {
+	  prev = rnode;
+	  rnode = rnode->getNext();
+	}
+    
+    return -1;
+  }
+}
+
+
+void *__llist::remove(const int index) {
+  if (index >= elements || index < 0 || (! _first) || (! _last))
+    return (void *) 0;
+
+  // remove list item at specified index within the list
+  if (index == 0) {
+    // remove the first item in the list...
+    __llist_node *node = _first;
+    void *data_return = _first->getData();
+    
+    _first = _first->getNext();
+
+    if (iterators && iterators->_first) {
+      __llist_node *n = iterators->_first;
+      while (n) {
+        ((__llist_iterator *) n->getData())->reset();
+        n = n->getNext();
+      }
+    }
+
+    --elements;
+    delete node;
+
+    return data_return;
+  } else {
+    __llist_node *rnode = _first->getNext(), *prev = _first;
+    void *data_return = (void *) 0;
+    
+    for (register int i = 1; i < index; i++)
+      if (rnode) {
+	prev = rnode;
+	rnode = rnode->getNext();
+      } else
+	return (void *) 0;
+    
+    if (! rnode) return (void *) 0;
+    
+    prev->setNext(rnode->getNext());
+    data_return = rnode->getData();
+    
+    if (rnode == _last)
+      _last = prev;
+
+    if (iterators && iterators->_first) {
+      __llist_node *n = iterators->_first;
+      while (n) {
+        ((__llist_iterator *) n->getData())->reset();
+        n = n->getNext();
+      }
+    }
+
+    --elements;
+    data_return = rnode->getData();
+    delete rnode;
+    return data_return;
+  }
+  
+  return (void *) 0;
+}
+
+void *__llist::find(const int index) {
+  if (index >= elements || index < 0 || (! _first) || (! _last))
+    return (void *) 0;
+
+  if (index == 0) {
+    // return the first item
+    return first();
+  } else if (index == (elements - 1)) {
+    // return the last item
+    return last();
+  } else {
+    __llist_node *fnode = _first->getNext();
+    
+    for (register int i = 1; i < index; i++)
+      if (fnode)
+	fnode = fnode->getNext();
+      else
+	return (void *) 0;
+    
+    return fnode->getData();
+  }
+  
+  return (void *) 0;
+}
+
+
+void *__llist::first(void) {
+  if (_first)
+    return _first->getData();
+  
+  return (void *) 0;
+}
+
+
+void *__llist::last(void) {
+  if (_last)
+    return _last->getData();
+  
+  return (void *) 0;
+}
diff --git a/src/LinkedList.hh b/src/LinkedList.hh
new file mode 100644
index 00000000..aa6bc281
--- /dev/null
+++ b/src/LinkedList.hh
@@ -0,0 +1,131 @@
+// LinkedList.hh for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the 
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in 
+// all copies or substantial portions of the Software. 
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL 
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+// DEALINGS IN THE SOFTWARE.
+  
+#ifndef   _LINKEDLIST_HH_
+#define   _LINKEDLIST_HH_
+
+
+class __llist_node {
+private:
+  __llist_node *next;
+  void *data;
+
+protected:
+
+public:
+  __llist_node(void) { next = (__llist_node *) 0; data = (void *) 0; }
+
+  inline __llist_node *getNext(void) { return next; }
+
+  inline void *getData(void) { return data; }
+  inline void setData(void *d) { data = d; }
+  inline void setNext(__llist_node *n) { next = n; }
+};
+
+
+// forward declaration
+class __llist;
+
+
+class __llist_iterator {
+private:
+  __llist *list;
+  __llist_node *node;
+
+  friend class __llist;
+
+
+protected:
+  __llist_iterator(__llist *);
+  ~__llist_iterator(void);
+
+  const int set(const int);
+
+  void *current(void);
+  void reset(void);
+
+  void operator++(void);
+  void operator++(int);
+};
+
+
+class __llist {
+private:
+  int elements;
+  __llist_node *_first, *_last;
+  __llist *iterators;
+
+  friend class __llist_iterator;
+
+
+protected:
+  __llist(void * = 0);
+  ~__llist(void);
+
+  inline const int &count(void) const { return elements; }
+  inline const int empty(void) const { return (elements == 0); }
+
+  const int insert(void *, int = -1);
+  const int remove(void *);
+  
+  void *find(const int);
+  void *remove(const int);
+  void *first(void);
+  void *last(void);
+};
+
+
+template 
+class LinkedListIterator : public __llist_iterator {
+public:
+  LinkedListIterator(__llist *d = 0) : __llist_iterator(d) { return; }
+
+  inline Z *current(void) { return (Z *) __llist_iterator::current(); }
+
+  inline const int set(const int i) { return __llist_iterator::set(i); }
+
+  inline void reset(void) { __llist_iterator::reset(); }
+ 
+  inline void operator++(void) { __llist_iterator::operator++(); } 
+  inline void operator++(int) { __llist_iterator::operator++(0); }
+};
+
+
+template 
+class LinkedList : public __llist {
+public:
+  LinkedList(Z *d = 0) : __llist(d) { return; }
+  
+  inline Z *find(const int i) { return (Z *) __llist::find(i); }
+  inline Z *remove(const int i) { return (Z *) __llist::remove(i); }
+  inline Z *first(void) { return (Z *) __llist::first(); }
+  inline Z *last(void) { return (Z *) __llist::last(); }
+  
+  inline const int count(void) const { return __llist::count(); }
+  inline const int empty(void) const { return __llist::empty(); }
+  
+  inline const int insert(Z *d, int i = -1) { return __llist::insert((void *) d, i); }
+  inline const int remove(Z *d) { return __llist::remove((void *) d); }
+};
+
+
+#endif //  _LINKEDLIST_HH_
+
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644
index 00000000..8e5f5142
--- /dev/null
+++ b/src/Makefile.am
@@ -0,0 +1,55 @@
+# Makefile.am for fluxbox
+# Copyright (c) 2001 Henrik Kinnunen (fluxgen@linuxmail.org)
+#
+# src/Makefile.am for Blackbox 0.61.x  - an X11 Window manager
+# Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the 
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in 
+# all copies or substantial portions of the Software. 
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL 
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+# DEALINGS IN THE SOFTWARE.
+
+
+DEFAULT_MENU=$(pkgdatadir)/menu
+DEFAULT_STYLE=$(pkgdatadir)/styles/Clean
+DEFAULT_TITLEBAR=$(pkgdatadir)/titlebar
+DEFAULT_KEYSFILE=$(pkgdatadir)/keys
+DEFAULT_INITFILE=
+
+CPPFLAGS= -Wall @CPPFLAGS@ @SHAPE@ @SLIT@ @INTERLACE@ @ORDEREDPSEUDO@ \
+@DEBUG@ @NEWWMSPEC@ @NLS@ @TIMEDCACHE@ @KDE@ @GNOME@ \
+-DLOCALEPATH=\"$(pkgdatadir)/nls\" \
+-DDEFAULTMENU=\"$(DEFAULT_MENU)\" \
+-DDEFAULTSTYLE=\"$(DEFAULT_STYLE)\" \
+-DDEFAULTTITLEBAR=\"$(DEFAULT_TITLEBAR)\"\
+-DDEFAULTKEYSFILE=\"$(DEFAULT_KEYSFILE)\"\
+-DDEFAULT_INITFILE=\"$(pkgdatadir)/init\"
+
+bin_PROGRAMS= fluxbox
+
+fluxbox_SOURCES= BaseDisplay.cc BaseDisplay.hh Basemenu.cc Basemenu.hh \
+						Clientmenu.cc Clientmenu.hh Configmenu.cc Configmenu.hh \
+						Icon.cc Icon.hh Image.cc Image.hh LinkedList.cc LinkedList.hh \
+						Netizen.cc Netizen.hh Rootmenu.cc Rootmenu.hh Screen.cc Screen.hh\
+						Slit.cc Slit.hh Timer.cc Timer.hh Toolbar.cc Toolbar.hh \
+						Window.cc Window.hh Windowmenu.cc Windowmenu.hh \
+						Workspace.cc Workspace.hh Workspacemenu.cc Workspacemenu.hh \
+						fluxbox.cc fluxbox.hh bsd-snprintf.c bsd-snprintf.h \
+						i18n.cc i18n.hh main.cc	Tab.hh Tab.cc Keys.cc Keys.hh\
+						IconBar.cc IconBar.hh Theme.hh Theme.cc misc.hh misc.cc \
+						Rotated.hh				
+MAINTAINERCLEANFILES= Makefile.in
+
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644
index 00000000..d4bcb631
--- /dev/null
+++ b/src/Makefile.in
@@ -0,0 +1,371 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Makefile.am for fluxbox
+# Copyright (c) 2001 Henrik Kinnunen (fluxgen@linuxmail.org)
+#
+# src/Makefile.am for Blackbox 0.61.x  - an X11 Window manager
+# Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the 
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in 
+# all copies or substantial portions of the Software. 
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL 
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+# DEALINGS IN THE SOFTWARE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+CXX = @CXX@
+DEBUG = @DEBUG@
+DLLTOOL = @DLLTOOL@
+GNOME = @GNOME@
+INTERLACE = @INTERLACE@
+KDE = @KDE@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+NEWWMSPEC = @NEWWMSPEC@
+NLS = @NLS@
+OBJDUMP = @OBJDUMP@
+ORDEREDPSEUDO = @ORDEREDPSEUDO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHAPE = @SHAPE@
+SLIT = @SLIT@
+TIMEDCACHE = @TIMEDCACHE@
+VERSION = @VERSION@
+gencat_cmd = @gencat_cmd@
+regex_cmd = @regex_cmd@
+
+DEFAULT_MENU = $(pkgdatadir)/menu
+DEFAULT_STYLE = $(pkgdatadir)/styles/Clean
+DEFAULT_TITLEBAR = $(pkgdatadir)/titlebar
+DEFAULT_KEYSFILE = $(pkgdatadir)/keys
+DEFAULT_INITFILE = 
+
+CPPFLAGS = -Wall @CPPFLAGS@ @SHAPE@ @SLIT@ @INTERLACE@ @ORDEREDPSEUDO@ @DEBUG@ @NEWWMSPEC@ @NLS@ @TIMEDCACHE@ @KDE@ @GNOME@ -DLOCALEPATH=\"$(pkgdatadir)/nls\" -DDEFAULTMENU=\"$(DEFAULT_MENU)\" -DDEFAULTSTYLE=\"$(DEFAULT_STYLE)\" -DDEFAULTTITLEBAR=\"$(DEFAULT_TITLEBAR)\" -DDEFAULTKEYSFILE=\"$(DEFAULT_KEYSFILE)\" -DDEFAULT_INITFILE=\"$(pkgdatadir)/init\"
+
+
+bin_PROGRAMS = fluxbox
+
+fluxbox_SOURCES = BaseDisplay.cc BaseDisplay.hh Basemenu.cc Basemenu.hh 						Clientmenu.cc Clientmenu.hh Configmenu.cc Configmenu.hh 						Icon.cc Icon.hh Image.cc Image.hh LinkedList.cc LinkedList.hh 						Netizen.cc Netizen.hh Rootmenu.cc Rootmenu.hh Screen.cc Screen.hh 						Slit.cc Slit.hh Timer.cc Timer.hh Toolbar.cc Toolbar.hh 						Window.cc Window.hh Windowmenu.cc Windowmenu.hh 						Workspace.cc Workspace.hh Workspacemenu.cc Workspacemenu.hh 						fluxbox.cc fluxbox.hh bsd-snprintf.c bsd-snprintf.h 						i18n.cc i18n.hh main.cc	Tab.hh Tab.cc Keys.cc Keys.hh 						IconBar.cc IconBar.hh Theme.hh Theme.cc misc.hh misc.cc 						Rotated.hh				
+
+MAINTAINERCLEANFILES = Makefile.in
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+PROGRAMS =  $(bin_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_LIBS = @X_LIBS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+fluxbox_OBJECTS =  BaseDisplay.o Basemenu.o Clientmenu.o Configmenu.o \
+Icon.o Image.o LinkedList.o Netizen.o Rootmenu.o Screen.o Slit.o \
+Timer.o Toolbar.o Window.o Windowmenu.o Workspace.o Workspacemenu.o \
+fluxbox.o bsd-snprintf.o i18n.o main.o Tab.o Keys.o IconBar.o Theme.o \
+misc.o
+fluxbox_LDADD = $(LDADD)
+fluxbox_DEPENDENCIES = 
+fluxbox_LDFLAGS = 
+CXXFLAGS = @CXXFLAGS@
+CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+SOURCES = $(fluxbox_SOURCES)
+OBJECTS = $(fluxbox_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .cc .lo .o .s
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-binPROGRAMS:
+
+clean-binPROGRAMS:
+	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+distclean-binPROGRAMS:
+
+maintainer-clean-binPROGRAMS:
+
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(bindir)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    echo " $(LIBTOOL)  --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+	    $(LIBTOOL)  --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+	done
+
+.c.o:
+	$(COMPILE) -c $<
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.c.lo:
+	$(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.s.lo:
+	$(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+	$(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+fluxbox: $(fluxbox_OBJECTS) $(fluxbox_DEPENDENCIES)
+	@rm -f fluxbox
+	$(CXXLINK) $(fluxbox_LDFLAGS) $(fluxbox_OBJECTS) $(fluxbox_LDADD) $(LIBS)
+.cc.o:
+	$(CXXCOMPILE) -c $<
+.cc.lo:
+	$(LTCXXCOMPILE) -c $<
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	here=`pwd` && cd $(srcdir) \
+	  && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+	-rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = src
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-binPROGRAMS
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-binPROGRAMS
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS)
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+	$(mkinstalldirs)  $(DESTDIR)$(bindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+mostlyclean-am:  mostlyclean-binPROGRAMS mostlyclean-compile \
+		mostlyclean-libtool mostlyclean-tags \
+		mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-binPROGRAMS clean-compile clean-libtool clean-tags \
+		clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-binPROGRAMS distclean-compile distclean-libtool \
+		distclean-tags distclean-generic clean-am
+	-rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-binPROGRAMS \
+		maintainer-clean-compile maintainer-clean-libtool \
+		maintainer-clean-tags maintainer-clean-generic \
+		distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
+maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Netizen.cc b/src/Netizen.cc
new file mode 100644
index 00000000..24f4a4cb
--- /dev/null
+++ b/src/Netizen.cc
@@ -0,0 +1,145 @@
+// Netizen.cc for Blackbox - An X11 Window Manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// stupid macros needed to access some functions in version 2 of the GNU C
+// library
+#ifndef   _GNU_SOURCE
+#define   _GNU_SOURCE
+#endif // _GNU_SOURCE
+
+#ifdef    HAVE_CONFIG_H
+#include "../config.h"
+#endif // HAVE_CONFIG_H
+
+#include "Netizen.hh"
+
+
+Netizen::Netizen(BScreen *scr, Window win) {
+  screen = scr;
+  basedisplay = screen->getBaseDisplay();
+  window = win;
+
+  event.type = ClientMessage;
+  event.xclient.message_type = basedisplay->getFluxboxStructureMessagesAtom();
+  event.xclient.display = basedisplay->getXDisplay();
+  event.xclient.window = window;
+  event.xclient.format = 32;
+  event.xclient.data.l[0] = basedisplay->getFluxboxNotifyStartupAtom();
+  event.xclient.data.l[1] = event.xclient.data.l[2] =
+    event.xclient.data.l[3] = event.xclient.data.l[4] = 0l;
+
+  XSendEvent(basedisplay->getXDisplay(), window, False, NoEventMask, &event);
+}
+
+
+void Netizen::sendWorkspaceCount(void) {
+ 
+  #ifdef GNOME
+/*	long val = screen->getCount();
+	XChangeProperty(basedisplay->getXDisplay(), screen->getRootWindow(),
+			basedisplay->getGnomeWorkspaceCountAtom(), XA_CARDINAL, 32,
+			PropModeReplace, (unsigned char *)&val, 1);*/
+	printf("UPDATE!\n");
+	unsigned long data=(unsigned long) screen->getCount();
+  Atom                atom_set;
+  // CARD32              val;
+  
+  atom_set = XInternAtom(basedisplay->getXDisplay(), "_WIN_WORKSPACE_COUNT", False);
+  // val = mode.numdesktops;
+  XChangeProperty(basedisplay->getXDisplay(), window, atom_set, 
+		 XA_CARDINAL, 32, PropModeReplace,(unsigned char *)&data, 1);
+	#endif //GNOME
+	
+	event.xclient.data.l[0] = basedisplay->getFluxboxNotifyWorkspaceCountAtom();
+  event.xclient.data.l[1] = screen->getCount();
+
+  XSendEvent(basedisplay->getXDisplay(), window, False, NoEventMask, &event);
+	
+	
+}
+
+
+void Netizen::sendCurrentWorkspace(void) {
+	#ifdef GNOME
+	//update atom	to workspace
+	long val;
+  val = screen->getCurrentWorkspaceID();
+  XChangeProperty(basedisplay->getXDisplay(), screen->getRootWindow(), 
+				basedisplay->getGnomeWorkspaceAtom(), XA_CARDINAL, 32,
+         PropModeReplace, (unsigned char *)&val, 1);
+
+	#endif
+
+	event.xclient.data.l[0] = basedisplay->getFluxboxNotifyCurrentWorkspaceAtom();
+	event.xclient.data.l[1] = screen->getCurrentWorkspaceID();
+
+	XSendEvent(basedisplay->getXDisplay(), window, False, NoEventMask, &event);
+
+}
+
+
+void Netizen::sendWindowFocus(Window w) {
+  event.xclient.data.l[0] = basedisplay->getFluxboxNotifyWindowFocusAtom();
+  event.xclient.data.l[1] = w;
+
+  XSendEvent(basedisplay->getXDisplay(), window, False, NoEventMask, &event);
+}
+
+
+void Netizen::sendWindowAdd(Window w, unsigned long p) {
+  event.xclient.data.l[0] = basedisplay->getFluxboxNotifyWindowAddAtom();
+  event.xclient.data.l[1] = w;
+  event.xclient.data.l[2] = p;
+
+  XSendEvent(basedisplay->getXDisplay(), window, False, NoEventMask, &event);
+
+  event.xclient.data.l[2] = 0l;
+}
+
+
+void Netizen::sendWindowDel(Window w) {
+  event.xclient.data.l[0] = basedisplay->getFluxboxNotifyWindowDelAtom();
+  event.xclient.data.l[1] = w;
+
+  XSendEvent(basedisplay->getXDisplay(), window, False, NoEventMask, &event);
+}
+
+
+void Netizen::sendWindowRaise(Window w) {
+  event.xclient.data.l[0] = basedisplay->getFluxboxNotifyWindowRaiseAtom();
+  event.xclient.data.l[1] = w;
+
+  XSendEvent(basedisplay->getXDisplay(), window, False, NoEventMask, &event);
+}
+
+
+void Netizen::sendWindowLower(Window w) {
+  event.xclient.data.l[0] = basedisplay->getFluxboxNotifyWindowLowerAtom();
+  event.xclient.data.l[1] = w;
+
+  XSendEvent(basedisplay->getXDisplay(), window, False, NoEventMask, &event);
+}
+
+
+void Netizen::sendConfigNotify(XEvent *e) {
+  XSendEvent(basedisplay->getXDisplay(), window, False,
+             StructureNotifyMask, e);
+}
diff --git a/src/Netizen.hh b/src/Netizen.hh
new file mode 100644
index 00000000..1c4a2b4b
--- /dev/null
+++ b/src/Netizen.hh
@@ -0,0 +1,64 @@
+// Netizen.hh for Blackbox - An X11 Window Manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef   _NETIZEN_HH_
+#define   _NETIZEN_HH_
+
+// forward declaration
+class Netizen;
+
+#include 
+
+#include "BaseDisplay.hh"
+#include "Screen.hh"
+
+
+class Netizen {
+private:
+  BaseDisplay *basedisplay;
+  BScreen *screen;
+  Window window;
+  XEvent event;
+
+
+protected:
+
+
+public:
+  Netizen(BScreen *, Window);
+
+  inline const Window &getWindowID(void) const { return window; }
+
+  void sendWorkspaceCount(void);
+  void sendCurrentWorkspace(void);
+
+  void sendWindowFocus(Window);
+  void sendWindowAdd(Window, unsigned long);
+  void sendWindowDel(Window);
+  void sendWindowRaise(Window);
+  void sendWindowLower(Window);
+
+  void sendConfigNotify(XEvent *);
+};
+
+
+#endif // _NETIZEN_HH_
+
diff --git a/src/Rootmenu.cc b/src/Rootmenu.cc
new file mode 100644
index 00000000..c86879f5
--- /dev/null
+++ b/src/Rootmenu.cc
@@ -0,0 +1,115 @@
+// Rootmenu.cc for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// stupid macros needed to access some functions in version 2 of the GNU C
+// library
+#ifndef   _GNU_SOURCE
+#define   _GNU_SOURCE
+#endif // _GNU_SOURCE
+
+#ifdef    HAVE_CONFIG_H
+#  include "../config.h"
+#endif // HAVE_CONFIG_H
+
+#include "fluxbox.hh"
+#include "Rootmenu.hh"
+#include "Screen.hh"
+
+#ifdef    HAVE_STDIO_H
+#  include 
+#endif // HAVE_STDIO_H
+
+#ifdef    STDC_HEADERS
+#  include 
+#  include 
+#endif // STDC_HEADERS
+
+#ifdef    HAVE_SYS_PARAM_H
+#  include 
+#endif // HAVE_SYS_PARAM_H
+
+#ifndef   MAXPATHLEN
+#define   MAXPATHLEN 255
+#endif // MAXPATHLEN
+
+
+Rootmenu::Rootmenu(BScreen *scrn) : Basemenu(scrn) {
+  screen = scrn;  
+}
+
+
+void Rootmenu::itemSelected(int button, int index) {
+	
+	Fluxbox *fluxbox = Fluxbox::instance();
+	
+	if (button == 1) {
+		BasemenuItem *item = find(index);
+
+		if (item->function()) {
+			switch (item->function()) {
+			case BScreen::Execute:
+				if (item->exec()) {
+					#ifndef    __EMX__
+					char displaystring[MAXPATHLEN];
+					sprintf(displaystring, "DISPLAY=%s",
+							DisplayString(screen->getBaseDisplay()->getXDisplay()));
+					sprintf(displaystring + strlen(displaystring) - 1, "%d",
+						screen->getScreenNumber());
+
+					bexec(item->exec(), displaystring);
+					#else //   __EMX__
+					spawnlp(P_NOWAIT, "cmd.exe", "cmd.exe", "/c", item->exec(), NULL);
+					#endif // !__EMX__
+				}
+				break;
+
+			case BScreen::Restart:
+				fluxbox->restart();
+				break;
+
+			case BScreen::RestartOther:
+				if (item->exec())
+					fluxbox->restart(item->exec());
+				break;
+
+			case BScreen::Exit:
+				fluxbox->shutdown();
+				break;
+
+			case BScreen::SetStyle:
+				if (item->exec()) {
+					fluxbox->saveStyleFilename(item->exec());
+					fluxbox->reconfigureTabs(); //TODO
+				}
+
+			case BScreen::Reconfigure:
+				fluxbox->reconfigure();
+				return;
+			}
+
+			if (! (screen->getRootmenu()->isTorn() || isTorn()) &&
+					item->function() != BScreen::Reconfigure &&
+					item->function() != BScreen::SetStyle)
+				hide();
+		}
+	}
+}
+
diff --git a/src/Rootmenu.hh b/src/Rootmenu.hh
new file mode 100644
index 00000000..839bcbc1
--- /dev/null
+++ b/src/Rootmenu.hh
@@ -0,0 +1,47 @@
+// Rootmenu.hh for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef  _ROOTMENU_HH_
+#define  _ROOTMENU_HH_
+
+// forward declarations
+class Rootmenu;
+class BScreen;
+
+#include "Basemenu.hh"
+
+
+class Rootmenu : public Basemenu {
+private:
+  BScreen *screen;
+
+
+protected:
+  virtual void itemSelected(int, int);
+
+
+public:
+  Rootmenu(BScreen *);
+};
+
+
+#endif // _ROOTMENU_HH_
+
diff --git a/src/Rotated.hh b/src/Rotated.hh
new file mode 100644
index 00000000..c07e1ce0
--- /dev/null
+++ b/src/Rotated.hh
@@ -0,0 +1,83 @@
+/* ************************************************************************ */
+
+
+/* Header file for the `xvertext' routines.
+
+   Copyright (c) 1992 Alan Richardson (mppa3@uk.ac.sussex.syma) */
+
+
+/* ************************************************************************ */
+
+
+#ifndef _XVERTEXT_INCLUDED_ 
+#define _XVERTEXT_INCLUDED_
+
+
+#define XV_VERSION      2.0
+#define XV_COPYRIGHT    "xvertext routines Copyright (c) 1992 Alan Richardson"
+
+
+/* ---------------------------------------------------------------------- */
+
+
+/* *** The font structures *** */
+
+struct BitmapStruct {
+    int			 bit_w;
+    int			 bit_h;
+
+    Pixmap bm;
+};
+
+struct XRotCharStruct {
+    int			 ascent;
+    int			 descent;
+    int			 lbearing;
+    int			 rbearing;
+    int			 width;
+
+    BitmapStruct	 glyph;
+};
+
+struct XRotFontStruct {
+    int			 dir;
+    int			 height;
+    int			 max_ascent;
+    int			 max_descent;
+    int			 max_char;
+    int			 min_char;
+    char 		*name;
+
+    XFontStruct		*xfontstruct;
+
+    XRotCharStruct	 per_char[95];
+};
+
+
+/* ---------------------------------------------------------------------- */
+
+
+extern float XRotVersion(char *, int);
+extern XRotFontStruct *XRotLoadFont(Display *, char *, float);
+extern void XRotUnloadFont(Display *, XRotFontStruct *);
+extern unsigned int XRotTextWidth(XRotFontStruct *, char *, int);
+extern void XRotDrawString(Display *, XRotFontStruct *, Drawable, GC,
+			   int, int, char *, int);
+
+/* ---------------------------------------------------------------------- */
+
+extern int		 xv_errno;
+
+#define XV_NOFONT	 1  /* no such font on X server */
+#define XV_NOMEM	 2  /* couldn't do malloc */
+#define XV_NOXIMAGE	 3  /* couldn't create an XImage */
+
+
+/* ---------------------------------------------------------------------- */
+ 
+
+#else
+
+extern int		 xv_errno;
+
+#endif 
diff --git a/src/Screen.cc b/src/Screen.cc
new file mode 100644
index 00000000..4a7c5154
--- /dev/null
+++ b/src/Screen.cc
@@ -0,0 +1,1677 @@
+// Screen.cc for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.	IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// stupid macros needed to access some functions in version 2 of the GNU C
+// library
+#ifndef	 _GNU_SOURCE
+#define	 _GNU_SOURCE
+#endif // _GNU_SOURCE
+
+#ifdef		HAVE_CONFIG_H
+#	include "../config.h"
+#endif // HAVE_CONFIG_H
+
+#include 
+#include 
+
+#include "i18n.hh"
+#include "fluxbox.hh"
+#include "Clientmenu.hh"
+#include "Icon.hh"
+#include "Image.hh"
+#include "Screen.hh"
+
+#ifdef		SLIT
+#include "Slit.hh"
+#endif // SLIT
+
+#include "Rootmenu.hh"
+#include "Toolbar.hh"
+#include "Window.hh"
+#include "Workspace.hh"
+#include "Workspacemenu.hh"
+
+#ifdef		STDC_HEADERS
+#	include 
+#	include 
+#	include 
+#endif // STDC_HEADERS
+
+#ifdef		HAVE_CTYPE_H
+#	include 
+#endif // HAVE_CTYPE_H
+
+#ifdef		HAVE_DIRENT_H
+#	include 
+#endif // HAVE_DIRENT_H
+
+#ifdef		HAVE_LOCALE_H
+#	include 
+#endif // HAVE_LOCALE_H
+
+#ifdef		HAVE_UNISTD_H
+#	include 
+#	include 
+#endif // HAVE_UNISTD_H
+
+#ifdef		HAVE_SYS_STAT_H
+#	include 
+#endif // HAVE_SYS_STAT_H
+
+#ifdef		HAVE_STDARG_H
+#	include 
+#endif // HAVE_STDARG_H
+
+#ifndef		HAVE_SNPRINTF
+#	include "bsd-snprintf.h"
+#endif // !HAVE_SNPRINTF
+
+#ifndef	 MAXPATHLEN
+#define	 MAXPATHLEN 255
+#endif // MAXPATHLEN
+
+#ifndef	 FONT_ELEMENT_SIZE
+#define	 FONT_ELEMENT_SIZE 50
+#endif // FONT_ELEMENT_SIZE
+
+#include 
+using namespace std;
+
+static Bool running = True;
+
+static int anotherWMRunning(Display *display, XErrorEvent *) {
+	fprintf(stderr,
+		I18n::instance()->
+		getMessage(
+#ifdef		NLS
+			ScreenSet, ScreenAnotherWMRunning,
+#else // !NLS
+			0, 0,
+#endif // NLS
+			"BScreen::BScreen: an error occured while querying the X server.\n"
+			"	another window manager already running on display %s.\n"),
+			DisplayString(display));
+
+	running = False;
+
+	return(-1);
+}
+
+static int dcmp(const void *one, const void *two) {
+	return (strcmp((*(char **) one), (*(char **) two)));
+}
+
+BScreen::BScreen(Fluxbox *b, int scrn) : ScreenInfo(b, scrn) {
+	theme = 0;
+	fluxbox = b;
+
+	event_mask = ColormapChangeMask | EnterWindowMask | PropertyChangeMask |
+			SubstructureRedirectMask | KeyPressMask | KeyReleaseMask |
+			ButtonPressMask | ButtonReleaseMask;
+
+	XErrorHandler old = XSetErrorHandler((XErrorHandler) anotherWMRunning);
+	XSelectInput(getBaseDisplay()->getXDisplay(), getRootWindow(), event_mask);
+	XSync(getBaseDisplay()->getXDisplay(), False);
+	XSetErrorHandler((XErrorHandler) old);
+
+	managed = running;
+	if (! managed)
+		return;
+	
+	I18n *i18n = I18n::instance();
+	
+	fprintf(stderr,
+		i18n->
+		getMessage(
+#ifdef		NLS
+				ScreenSet, ScreenManagingScreen,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"BScreen::BScreen: managing screen %d "
+				"using visual 0x%lx, depth %d\n"),
+		getScreenNumber(), XVisualIDFromVisual(getVisual()),
+		getDepth());
+
+	rootmenu = 0;
+		
+#ifdef		HAVE_STRFTIME
+	resource.strftime_format = 0;
+#endif // HAVE_STRFTIME
+
+#ifdef		HAVE_GETPID
+	pid_t bpid = getpid();
+
+	XChangeProperty(getBaseDisplay()->getXDisplay(), getRootWindow(),
+			fluxbox->getFluxboxPidAtom(), XA_CARDINAL,
+			sizeof(pid_t) * 8, PropModeReplace,
+			(unsigned char *) &bpid, 1);
+#endif // HAVE_GETPID
+
+
+	XDefineCursor(getBaseDisplay()->getXDisplay(), getRootWindow(),
+			fluxbox->getSessionCursor());
+
+	workspaceNames = new LinkedList;
+	workspacesList = new LinkedList;
+	rootmenuList = new LinkedList;
+	netizenList = new LinkedList;
+	iconList = new LinkedList;
+
+	image_control =
+		new BImageControl(fluxbox, this, True, fluxbox->getColorsPerChannel(),
+				fluxbox->getCacheLife(), fluxbox->getCacheMax());
+	image_control->installRootColormap();
+	root_colormap_installed = True;
+
+	fluxbox->load_rc(this);
+
+	image_control->setDither(resource.image_dither);
+	theme = new Theme(getBaseDisplay()->getXDisplay(), getColormap(), getScreenNumber(), 
+			image_control, fluxbox->getStyleFilename());
+#ifdef GNOME
+	/* create the GNOME window */
+  Window gnome_win = XCreateSimpleWindow(getBaseDisplay()->getXDisplay(),
+			getRootWindow(), 0, 0, 5, 5, 0, 0, 0);
+
+  /* supported WM check */
+  XChangeProperty(getBaseDisplay()->getXDisplay(),
+			getRootWindow(), getBaseDisplay()->getGnomeSupportingWMCheckAtom(), 
+			XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &gnome_win, 1);
+  XChangeProperty(getBaseDisplay()->getXDisplay(), gnome_win, 
+		getBaseDisplay()->getGnomeSupportingWMCheckAtom(), 
+		XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &gnome_win, 1);
+	 
+  XChangeProperty(getBaseDisplay()->getXDisplay(),
+		getRootWindow(), getBaseDisplay()->getGnomeProtAtom(),
+		XA_ATOM, 32, PropModeReplace,
+		(unsigned char *)getBaseDisplay()->getGnomeListAtoms(), 10);			
+#endif 
+
+
+	const char *s =	i18n->getMessage(
+#ifdef		NLS
+						ScreenSet, ScreenPositionLength,
+#else // !NLS
+						0, 0,
+#endif // NLS
+						"0: 0000 x 0: 0000");
+	int l = strlen(s);
+
+	if (i18n->multibyte()) {
+		XRectangle ink, logical;
+		XmbTextExtents(theme->getWindowStyle()->font.set, s, l, &ink, &logical);
+		geom_w = logical.width;
+
+		geom_h = theme->getWindowStyle()->font.set_extents->max_ink_extent.height;
+	} else {
+		geom_h = theme->getWindowStyle()->font.fontstruct->ascent +
+			 theme->getWindowStyle()->font.fontstruct->descent;
+
+		geom_w = XTextWidth(theme->getWindowStyle()->font.fontstruct, s, l);
+	}
+
+	geom_w += getBevelWidth()*2;
+	geom_h += getBevelWidth()*2;
+
+	XSetWindowAttributes attrib;
+	unsigned long mask = CWBorderPixel | CWColormap | CWSaveUnder;
+	attrib.border_pixel = getBorderColor()->getPixel();
+	attrib.colormap = getColormap();
+	attrib.save_under = True;
+
+	geom_window =
+		XCreateWindow(getBaseDisplay()->getXDisplay(), getRootWindow(),
+									0, 0, geom_w, geom_h, theme->getBorderWidth(), getDepth(),
+									InputOutput, getVisual(), mask, &attrib);
+	geom_visible = False;
+
+	if (theme->getWindowStyle()->l_focus.getTexture() & BImage_ParentRelative) {
+		if (theme->getWindowStyle()->t_focus.getTexture() ==
+			(BImage_Flat | BImage_Solid)) {
+			geom_pixmap = None;
+			XSetWindowBackground(getBaseDisplay()->getXDisplay(), geom_window,
+				 theme->getWindowStyle()->t_focus.getColor()->getPixel());
+		} else {
+			geom_pixmap = image_control->renderImage(geom_w, geom_h,
+								 &theme->getWindowStyle()->t_focus);
+			XSetWindowBackgroundPixmap(getBaseDisplay()->getXDisplay(),
+				 geom_window, geom_pixmap);
+		}
+	} else {
+		if (theme->getWindowStyle()->l_focus.getTexture() ==
+				(BImage_Flat | BImage_Solid)) {
+			geom_pixmap = None;
+			XSetWindowBackground(getBaseDisplay()->getXDisplay(), geom_window,
+				 theme->getWindowStyle()->l_focus.getColor()->getPixel());
+		} else {
+			geom_pixmap = image_control->renderImage(geom_w, geom_h,
+								 &theme->getWindowStyle()->l_focus);
+			XSetWindowBackgroundPixmap(getBaseDisplay()->getXDisplay(),
+				 geom_window, geom_pixmap);
+		}
+	}
+
+	workspacemenu = new Workspacemenu(this);
+	iconmenu = new Iconmenu(this);	
+	configmenu = new Configmenu(this);
+
+	Workspace *wkspc = (Workspace *) 0;
+	if (resource.workspaces != 0) {
+		for (int i = 0; i < resource.workspaces; ++i) {
+			wkspc = new Workspace(this, workspacesList->count());
+			workspacesList->insert(wkspc);
+			workspacemenu->insert(wkspc->getName(), wkspc->getMenu());
+		}
+	} else {
+		wkspc = new Workspace(this, workspacesList->count());
+		workspacesList->insert(wkspc);
+		workspacemenu->insert(wkspc->getName(), wkspc->getMenu());
+	}
+
+	workspacemenu->insert(i18n->
+			getMessage(
+#ifdef		NLS
+					 IconSet, IconIcons,
+#else // !NLS
+					 0, 0,
+#endif // NLS
+					 "Icons"),
+			iconmenu);
+	workspacemenu->update();
+
+	current_workspace = workspacesList->first();
+	workspacemenu->setItemSelected(2, True);
+
+	toolbar = new Toolbar(this);
+
+#ifdef		SLIT
+	slit = new Slit(this);
+#endif // SLIT
+
+	InitMenu();
+
+	raiseWindows(0, 0);
+	rootmenu->update();
+
+	changeWorkspaceID(0);
+
+	int i;
+	unsigned int nchild;
+	Window r, p, *children;
+	XQueryTree(getBaseDisplay()->getXDisplay(), getRootWindow(), &r, &p,
+			 &children, &nchild);
+
+	// preen the window list of all icon windows... for better dockapp support
+	for (i = 0; i < (int) nchild; i++) {
+		if (children[i] == None) continue;
+
+		XWMHints *wmhints = XGetWMHints(getBaseDisplay()->getXDisplay(),
+						children[i]);
+
+		if (wmhints) {
+			if ((wmhints->flags & IconWindowHint) &&
+		(wmhints->icon_window != children[i]))
+				for (int j = 0; j < (int) nchild; j++)
+					if (children[j] == wmhints->icon_window) {
+						children[j] = None;
+
+						break;
+					}
+
+			XFree(wmhints);
+		}
+	}
+
+	// manage shown windows
+	for (i = 0; i < (int) nchild; ++i) {
+		if (children[i] == None || (! fluxbox->validateWindow(children[i])))
+			continue;
+
+		XWindowAttributes attrib;
+		if (XGetWindowAttributes(getBaseDisplay()->getXDisplay(), children[i],
+				&attrib)) {
+			if (attrib.override_redirect) 
+				continue;
+
+			if (attrib.map_state != IsUnmapped) {
+				new FluxboxWindow(children[i], this);
+
+				FluxboxWindow *win = fluxbox->searchWindow(children[i]);
+				if (win) {
+					XMapRequestEvent mre;
+					mre.window = children[i];
+					win->restoreAttributes();
+					win->mapRequestEvent(&mre);
+				}
+			}
+		}
+	}
+
+	if (! resource.sloppy_focus)
+		XSetInputFocus(getBaseDisplay()->getXDisplay(), toolbar->getWindowID(),
+			RevertToParent, CurrentTime);
+
+	XFree(children);
+	XFlush(getBaseDisplay()->getXDisplay());
+	
+}
+
+
+BScreen::~BScreen(void) {
+	if (! managed) return;
+
+	if (geom_pixmap != None)
+		image_control->removeImage(geom_pixmap);
+
+	if (geom_window != None)
+		XDestroyWindow(getBaseDisplay()->getXDisplay(), geom_window);
+
+	removeWorkspaceNames();
+
+	while (workspacesList->count())
+		delete workspacesList->remove(0);
+
+	while (rootmenuList->count())
+		rootmenuList->remove(0);
+
+	while (iconList->count())
+		delete iconList->remove(0);
+
+	while (netizenList->count())
+		delete netizenList->remove(0);
+
+#ifdef		HAVE_STRFTIME
+	if (resource.strftime_format)
+		delete [] resource.strftime_format;
+#endif // HAVE_STRFTIME
+
+	delete rootmenu;
+	delete workspacemenu;
+	delete iconmenu;
+	delete configmenu;
+
+#ifdef		SLIT
+	delete slit;
+#endif // SLIT
+
+	delete toolbar;
+	delete image_control;
+
+	delete workspacesList;
+	delete workspaceNames;
+	delete rootmenuList;
+	delete iconList;
+	delete netizenList;
+	delete theme;
+	theme = 0;
+
+}
+
+void BScreen::reconfigure(void) {
+
+	theme->load(fluxbox->getStyleFilename());
+	theme->reconfigure();
+	I18n *i18n = I18n::instance();
+
+	const char *s = i18n->getMessage(
+#ifdef		NLS
+			ScreenSet, ScreenPositionLength,
+#else // !NLS
+			0, 0,
+#endif // NLS
+			"0: 0000 x 0: 0000");
+	int l = strlen(s);
+
+	if (i18n->multibyte()) {
+		XRectangle ink, logical;
+		XmbTextExtents(theme->getWindowStyle()->font.set, s, l, &ink, &logical);
+		geom_w = logical.width;
+
+		geom_h = theme->getWindowStyle()->font.set_extents->max_ink_extent.height;
+	} else {
+		geom_w = XTextWidth(theme->getWindowStyle()->font.fontstruct, s, l);
+
+		geom_h = theme->getWindowStyle()->font.fontstruct->ascent +
+			theme->getWindowStyle()->font.fontstruct->descent; 
+	}
+
+	geom_w += getBevelWidth()*2;
+	geom_h += getBevelWidth()*2;
+
+	Pixmap tmp = geom_pixmap;
+	if (theme->getWindowStyle()->l_focus.getTexture() & BImage_ParentRelative) {
+		if (theme->getWindowStyle()->t_focus.getTexture() ==
+				(BImage_Flat | BImage_Solid)) {
+			geom_pixmap = None;
+			XSetWindowBackground(getBaseDisplay()->getXDisplay(), geom_window,
+				theme->getWindowStyle()->t_focus.getColor()->getPixel());
+		} else {
+			geom_pixmap = image_control->renderImage(geom_w, geom_h,
+				&theme->getWindowStyle()->t_focus);
+			XSetWindowBackgroundPixmap(getBaseDisplay()->getXDisplay(),
+				geom_window, geom_pixmap);
+		}
+	} else {
+		if (theme->getWindowStyle()->l_focus.getTexture() ==
+				(BImage_Flat | BImage_Solid)) {
+			geom_pixmap = None;
+			XSetWindowBackground(getBaseDisplay()->getXDisplay(), geom_window,
+				theme->getWindowStyle()->l_focus.getColor()->getPixel());
+		} else {
+			geom_pixmap = image_control->renderImage(geom_w, geom_h,
+				&theme->getWindowStyle()->l_focus);
+			XSetWindowBackgroundPixmap(getBaseDisplay()->getXDisplay(),
+				geom_window, geom_pixmap);
+		}
+	}
+	if (tmp) image_control->removeImage(tmp);
+
+	XSetWindowBorderWidth(getBaseDisplay()->getXDisplay(), geom_window,
+												theme->getBorderWidth());
+	XSetWindowBorder(getBaseDisplay()->getXDisplay(), geom_window,
+									 theme->getBorderColor().getPixel());
+
+	workspacemenu->reconfigure();
+	iconmenu->reconfigure();
+
+	{
+		int remember_sub = rootmenu->getCurrentSubmenu();
+		InitMenu();
+		raiseWindows(0, 0);
+		rootmenu->reconfigure();
+		rootmenu->drawSubmenu(remember_sub);
+	}
+
+	configmenu->reconfigure();
+
+	toolbar->reconfigure();
+
+#ifdef		SLIT
+	slit->reconfigure();
+#endif // SLIT
+
+	LinkedListIterator wit(workspacesList);
+	for (; wit.current(); wit++)
+		wit.current()->reconfigure();
+
+	LinkedListIterator iit(iconList);
+	for (; iit.current(); iit++)
+		if (iit.current()->validateClient())
+			iit.current()->reconfigure();
+
+	image_control->timeout();
+}
+
+
+void BScreen::rereadMenu(void) {
+	InitMenu();
+	raiseWindows(0, 0);
+
+	rootmenu->reconfigure();
+}
+
+
+void BScreen::removeWorkspaceNames(void) {
+	while (workspaceNames->count())
+		delete [] workspaceNames->remove(0);
+}
+
+void BScreen::updateWorkspaceNamesAtom(void) {
+
+#ifdef GNOME	
+	XTextProperty	text;
+	int number_of_desks = workspaceNames->count();
+	
+	char s[1024];
+	char *names[number_of_desks];		
+	
+	for (int i = 0; i < number_of_desks; i++) {		
+		sprintf(s, "Desktop %i", i);
+		names[i] = new char[strlen(s) + 1];
+		strcpy(names[i], s);
+	}
+	
+	if (XStringListToTextProperty(names, number_of_desks, &text)) {
+		XSetTextProperty(getBaseDisplay()->getXDisplay(), getRootWindow(),
+			 &text, getBaseDisplay()->getGnomeWorkspaceNamesAtom());
+		XFree(text.value);
+	}
+	
+	for (int i = 0; i < number_of_desks; i++)
+		delete names[i];			
+  	
+#endif
+
+}
+
+void BScreen::addIcon(FluxboxWindow *w) {
+	if (! w) return;
+
+	w->setWorkspace(-1);
+	w->setWindowNumber(iconList->count());
+
+	iconList->insert(w);
+
+	iconmenu->insert((const char **) w->getIconTitle());	
+	iconmenu->update();
+	toolbar->addIcon(w);
+}
+
+
+void BScreen::removeIcon(FluxboxWindow *w) {
+	if (! w) return;
+
+	iconList->remove(w->getWindowNumber());
+
+	iconmenu->remove(w->getWindowNumber());
+	iconmenu->update();
+	toolbar->delIcon(w);
+	
+	LinkedListIterator it(iconList);
+	for (int i = 0; it.current(); it++, i++)
+		it.current()->setWindowNumber(i);
+}
+
+
+FluxboxWindow *BScreen::getIcon(int index) {
+	if (index >= 0 && index < iconList->count())
+		return iconList->find(index);
+
+	return (FluxboxWindow *) 0;
+}
+
+
+int BScreen::addWorkspace(void) {
+	Workspace *wkspc = new Workspace(this, workspacesList->count());
+	workspacesList->insert(wkspc);
+
+	workspacemenu->insert(wkspc->getName(), wkspc->getMenu(),
+			wkspc->getWorkspaceID() + 1);
+	workspacemenu->update();
+
+	toolbar->reconfigure();
+
+	updateNetizenWorkspaceCount();	
+	
+	
+	return workspacesList->count();
+	
+}
+
+
+int BScreen::removeLastWorkspace(void) {
+	if (workspacesList->count() > 1) {
+		Workspace *wkspc = workspacesList->last();
+
+		if (current_workspace->getWorkspaceID() == wkspc->getWorkspaceID())
+			changeWorkspaceID(current_workspace->getWorkspaceID() - 1);
+
+		wkspc->removeAll();
+
+		workspacemenu->remove(wkspc->getWorkspaceID() + 2);
+		workspacemenu->update();
+
+		workspacesList->remove(wkspc);
+		delete wkspc;
+
+		toolbar->reconfigure();
+
+		updateNetizenWorkspaceCount();
+	
+		return workspacesList->count();
+	}
+
+	return 0;
+}
+
+
+void BScreen::changeWorkspaceID(int id) {
+	if (! current_workspace || id >= workspacesList->count() || id < 0)
+		return;
+	
+	if (id != current_workspace->getWorkspaceID()) {
+		current_workspace->hideAll();
+
+		workspacemenu->setItemSelected(current_workspace->getWorkspaceID() + 2,
+					 False);
+
+		if (fluxbox->getFocusedWindow() &&
+				fluxbox->getFocusedWindow()->getScreen() == this &&
+				(! fluxbox->getFocusedWindow()->isStuck())) {
+				
+			current_workspace->setLastFocusedWindow(fluxbox->getFocusedWindow());
+			fluxbox->setFocusedWindow((FluxboxWindow *) 0);
+			
+		}
+
+		current_workspace = getWorkspace(id);
+
+		workspacemenu->setItemSelected(current_workspace->getWorkspaceID() + 2,
+					 True);
+		toolbar->redrawWorkspaceLabel(True);
+
+		current_workspace->showAll();
+
+		if (resource.focus_last && current_workspace->getLastFocusedWindow()) {
+			XSync(fluxbox->getXDisplay(), False);
+			current_workspace->getLastFocusedWindow()->setInputFocus();
+		}
+	}
+	
+
+
+	updateNetizenCurrentWorkspace();
+}
+
+
+void BScreen::addNetizen(Netizen *n) {
+	netizenList->insert(n);
+
+	n->sendWorkspaceCount();
+	n->sendCurrentWorkspace();
+
+	LinkedListIterator it(workspacesList);
+	for (; it.current(); it++) {
+		int i;
+		for (i = 0; i < it.current()->getCount(); i++)
+			n->sendWindowAdd(it.current()->getWindow(i)->getClientWindow(),
+											 it.current()->getWorkspaceID());
+	}
+
+	Window f = ((fluxbox->getFocusedWindow()) ?
+							fluxbox->getFocusedWindow()->getClientWindow() : None);
+	n->sendWindowFocus(f);
+}
+
+
+void BScreen::removeNetizen(Window w) {
+	LinkedListIterator it(netizenList);
+	int i = 0;
+
+	for (; it.current(); it++, i++)
+		if (it.current()->getWindowID() == w) {
+			Netizen *n = netizenList->remove(i);
+			delete n;
+
+			break;
+		}
+}
+
+
+void BScreen::updateNetizenCurrentWorkspace(void) {
+	LinkedListIterator it(netizenList);
+	for (; it.current(); it++)
+		it.current()->sendCurrentWorkspace();
+}
+
+
+void BScreen::updateNetizenWorkspaceCount(void) {
+	LinkedListIterator it(netizenList);
+	for (; it.current(); it++)
+		it.current()->sendWorkspaceCount();
+}
+
+
+void BScreen::updateNetizenWindowFocus(void) {
+	LinkedListIterator it(netizenList);
+	Window f = ((fluxbox->getFocusedWindow()) ?
+							fluxbox->getFocusedWindow()->getClientWindow() : None);
+	for (; it.current(); it++)
+		it.current()->sendWindowFocus(f);
+}
+
+
+void BScreen::updateNetizenWindowAdd(Window w, unsigned long p) {
+	LinkedListIterator it(netizenList);
+	for (; it.current(); it++)
+		it.current()->sendWindowAdd(w, p);
+}
+
+
+void BScreen::updateNetizenWindowDel(Window w) {
+	LinkedListIterator it(netizenList);
+	for (; it.current(); it++)
+		it.current()->sendWindowDel(w);
+}
+
+
+void BScreen::updateNetizenWindowRaise(Window w) {
+	LinkedListIterator it(netizenList);
+	for (; it.current(); it++)
+		it.current()->sendWindowRaise(w);
+}
+
+
+void BScreen::updateNetizenWindowLower(Window w) {
+	LinkedListIterator it(netizenList);
+	for (; it.current(); it++)
+		it.current()->sendWindowLower(w);
+}
+
+
+void BScreen::updateNetizenConfigNotify(XEvent *e) {
+	LinkedListIterator it(netizenList);
+	for (; it.current(); it++)
+		it.current()->sendConfigNotify(e);
+}
+
+
+void BScreen::raiseWindows(Window *workspace_stack, int num) {
+	Window *session_stack = new
+		Window[(num + workspacesList->count() + rootmenuList->count() + 13)];
+	int i = 0, k = num;
+
+	XRaiseWindow(getBaseDisplay()->getXDisplay(), iconmenu->getWindowID());
+	*(session_stack + i++) = iconmenu->getWindowID();
+
+	LinkedListIterator wit(workspacesList);
+	for (; wit.current(); wit++)
+		*(session_stack + i++) = wit.current()->getMenu()->getWindowID();
+
+	*(session_stack + i++) = workspacemenu->getWindowID();
+
+	*(session_stack + i++) = configmenu->getFocusmenu()->getWindowID();
+	*(session_stack + i++) = configmenu->getPlacementmenu()->getWindowID();
+	*(session_stack + i++) = configmenu->getTabmenu()->getWindowID();
+	*(session_stack + i++) = configmenu->getWindowID();
+
+#ifdef		SLIT
+	*(session_stack + i++) = slit->getMenu()->getDirectionmenu()->getWindowID();
+	*(session_stack + i++) = slit->getMenu()->getPlacementmenu()->getWindowID();
+	*(session_stack + i++) = slit->getMenu()->getWindowID();
+#endif // SLIT
+
+	*(session_stack + i++) =
+		toolbar->getMenu()->getPlacementmenu()->getWindowID();
+	*(session_stack + i++) = toolbar->getMenu()->getWindowID();
+
+	LinkedListIterator rit(rootmenuList);
+	for (; rit.current(); rit++)
+		*(session_stack + i++) = rit.current()->getWindowID();
+	*(session_stack + i++) = rootmenu->getWindowID();
+
+	if (toolbar->isOnTop())
+		*(session_stack + i++) = toolbar->getWindowID();
+
+#ifdef		SLIT
+	if (slit->isOnTop())
+		*(session_stack + i++) = slit->getWindowID();
+#endif // SLIT
+
+	while (k--)
+		*(session_stack + i++) = *(workspace_stack + k);
+
+	XRestackWindows(getBaseDisplay()->getXDisplay(), session_stack, i);
+
+	delete [] session_stack;
+}
+
+
+#ifdef		HAVE_STRFTIME
+void BScreen::saveStrftimeFormat(char *format) {
+	if (resource.strftime_format)
+		delete [] resource.strftime_format;
+
+	resource.strftime_format = bstrdup(format);
+}
+#endif // HAVE_STRFTIME
+
+
+void BScreen::addWorkspaceName(char *name) {
+	workspaceNames->insert(bstrdup(name));
+	
+}
+
+
+void BScreen::getNameOfWorkspace(int id, char **name) {
+	if (id >= 0 && id < workspaceNames->count()) {
+		char *wkspc_name = workspaceNames->find(id);
+
+		if (wkspc_name)
+			*name = bstrdup(wkspc_name);
+	} else
+		*name = 0;
+}
+
+
+void BScreen::reassociateWindow(FluxboxWindow *w, int wkspc_id, Bool ignore_sticky) {
+	if (! w) return;
+
+	if (wkspc_id == -1)
+		wkspc_id = current_workspace->getWorkspaceID();
+
+	if (w->getWorkspaceNumber() == wkspc_id)
+		return;
+
+	if (w->isIconic()) {
+		removeIcon(w);
+		getWorkspace(wkspc_id)->addWindow(w);
+	} else if (ignore_sticky || ! w->isStuck()) {
+		getWorkspace(w->getWorkspaceNumber())->removeWindow(w);
+		getWorkspace(wkspc_id)->addWindow(w);
+	}
+}
+
+
+void BScreen::nextFocus(void) {
+	Bool have_focused = False;
+	int focused_window_number = -1;
+	FluxboxWindow *next;
+
+	if (fluxbox->getFocusedWindow())
+		if (fluxbox->getFocusedWindow()->getScreen()->getScreenNumber() ==
+			getScreenNumber()) {
+			have_focused = True;
+			focused_window_number = fluxbox->getFocusedWindow()->getWindowNumber();
+		}
+
+	if ((getCurrentWorkspace()->getCount() > 1) && have_focused) {
+		int next_window_number = focused_window_number;
+		do {
+			if ((++next_window_number) >= getCurrentWorkspace()->getCount())
+				next_window_number = 0;
+
+			next = getCurrentWorkspace()->getWindow(next_window_number);
+		} while ((! next->setInputFocus()) && (next_window_number !=
+						 focused_window_number));
+
+		if (next_window_number != focused_window_number)
+			getCurrentWorkspace()->raiseWindow(next);
+	} else if (getCurrentWorkspace()->getCount() >= 1) {
+		next = current_workspace->getWindow(0);
+
+		current_workspace->raiseWindow(next);
+		next->setInputFocus();
+	}
+}
+
+
+void BScreen::prevFocus(void) {
+	Bool have_focused = False;
+	int focused_window_number = -1;
+	FluxboxWindow *prev;
+
+	if (fluxbox->getFocusedWindow())
+		if (fluxbox->getFocusedWindow()->getScreen()->getScreenNumber() ==
+	getScreenNumber()) {
+			have_focused = True;
+			focused_window_number = fluxbox->getFocusedWindow()->getWindowNumber();
+		}
+
+	if ((getCurrentWorkspace()->getCount() > 1) && have_focused) {
+		int prev_window_number = focused_window_number;
+		do {
+			if ((--prev_window_number) < 0)
+	prev_window_number = getCurrentWorkspace()->getCount() - 1;
+
+			prev = getCurrentWorkspace()->getWindow(prev_window_number);
+		} while ((! prev->setInputFocus()) && (prev_window_number !=
+						 focused_window_number));
+
+		if (prev_window_number != focused_window_number)
+			getCurrentWorkspace()->raiseWindow(prev);
+	} else if (getCurrentWorkspace()->getCount() >= 1) {
+		prev = current_workspace->getWindow(0);
+
+		current_workspace->raiseWindow(prev);
+		prev->setInputFocus();
+	}
+}
+
+//--------- raiseFocus -----------
+// Raise the current focused window
+//--------------------------------
+void BScreen::raiseFocus(void) {
+	Bool have_focused = False;
+	int focused_window_number = -1;
+
+	if (fluxbox->getFocusedWindow())
+		if (fluxbox->getFocusedWindow()->getScreen()->getScreenNumber() ==
+	getScreenNumber()) {
+			have_focused = True;
+			focused_window_number = fluxbox->getFocusedWindow()->getWindowNumber();
+		}
+
+	if ((getCurrentWorkspace()->getCount() > 1) && have_focused)
+		getWorkspace(fluxbox->getFocusedWindow()->getWorkspaceNumber())->
+			raiseWindow(fluxbox->getFocusedWindow());
+}
+
+
+void BScreen::InitMenu(void) {
+	I18n *i18n = I18n::instance();
+	
+	if (rootmenu) {
+		while (rootmenuList->count())
+			rootmenuList->remove(0);
+
+		while (rootmenu->getCount())
+			rootmenu->remove(0);
+	} else
+		rootmenu = new Rootmenu(this);
+
+	Bool defaultMenu = True;
+
+	if (fluxbox->getMenuFilename()) {
+		FILE *menu_file = fopen(fluxbox->getMenuFilename(), "r");
+
+		if (menu_file) {
+			if (! feof(menu_file)) {
+				const int buff_size = 1024;
+				char line[buff_size], label[buff_size];
+				memset(line, 0, buff_size);
+				memset(label, 0, buff_size);
+
+				while (fgets(line, buff_size, menu_file) && ! feof(menu_file)) {
+					if (line[0] != '#') {
+						int i, key = 0, index = -1, len = strlen(line);
+						key = 0;
+						for (i = 0; i < len; i++) {
+							if (line[i] == '[')
+								index = 0;
+							else if (line[i] == ']')
+								break;
+							else if (line[i] != ' ')
+								if (index++ >= 0)
+									key += tolower(line[i]);
+						}
+						if (key == 517) {
+							index = -1;
+							for (i = index; i < len; i++) {
+								if (line[i] == '(') index = 0;
+								else if (line[i] == ')') break;
+								else if (index++ >= 0) {
+									if (line[i] == '\\' && i < len - 1) i++;
+										label[index - 1] = line[i];
+								}
+							}
+
+							if (index == -1)
+								index = 0;
+							label[index] = '\0';
+
+							rootmenu->setLabel(label);
+							defaultMenu = parseMenuFile(menu_file, rootmenu);
+							break;
+						}
+					}
+				}
+			} else {
+				fprintf(stderr,
+					i18n->getMessage(
+#ifdef		NLS
+						ScreenSet, ScreenEmptyMenuFile,
+#else // !NLS
+						0, 0,
+#endif // NLS
+						"%s: Empty menu file"),
+					fluxbox->getMenuFilename());
+			}
+			
+			fclose(menu_file);
+		} else
+			perror(fluxbox->getMenuFilename());
+	}
+
+	if (defaultMenu) {
+		rootmenu->setInternalMenu();
+		rootmenu->insert(i18n->getMessage(
+#ifdef		NLS
+						ScreenSet, Screenxterm,
+#else // !NLS
+						0, 0,
+#endif // NLS
+						"xterm"),
+						BScreen::Execute,
+						i18n->getMessage(
+#ifdef		NLS
+							ScreenSet, Screenxterm,
+#else // !NLS
+							0, 0,
+#endif // NLS
+							"xterm"));
+		rootmenu->insert(i18n->getMessage(
+#ifdef		NLS
+						ScreenSet, ScreenRestart,
+#else // !NLS
+						0, 0,
+#endif // NLS
+						"Restart"),
+					BScreen::Restart);
+		rootmenu->insert(i18n->getMessage(
+#ifdef		NLS
+						ScreenSet, ScreenExit,
+#else // !NLS
+						0, 0,
+#endif // NLS
+						"Exit"),
+				BScreen::Exit);
+	} else
+		fluxbox->saveMenuFilename(fluxbox->getMenuFilename());
+}
+
+
+Bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
+	const int buff_size = 1024;
+	char line[buff_size], label[buff_size], command[buff_size];
+
+	while (! feof(file)) {
+		memset(line, 0, buff_size);
+		memset(label, 0, buff_size);
+		memset(command, 0, buff_size);
+
+		if (fgets(line, buff_size, file)) {
+			if (line[0] != '#') {
+				register int i, key = 0, parse = 0, 
+						index = -1,	
+						line_length = strlen(line), label_length = 0, command_length = 0;
+
+				// determine the keyword
+				key = 0;
+				for (i = 0; i < line_length; i++) {
+					if (line[i] == '[')
+						parse = 1;
+					else if (line[i] == ']') 
+						break;
+					else if (line[i] != ' ')
+						if (parse)
+							key += tolower(line[i]);
+				}
+
+				// get the label enclosed in ()'s
+				parse = 0;
+
+				for (i = 0; i < line_length; i++) {
+					if (line[i] == '(') {
+						index = 0;
+						parse = 1;
+					} else if (line[i] == ')') 
+						break;
+					else if (index++ >= 0) {
+						if (line[i] == '\\' && i < line_length - 1)
+							i++;
+						label[index - 1] = line[i];
+					}
+				}
+				if (parse) {
+					label[index] = '\0';
+					label_length = index;
+				} else {
+					label[0] = '\0';
+					label_length = 0;
+				}
+
+				// get the command enclosed in {}'s
+				parse = 0;
+				index = -1;
+				for (i = 0; i < line_length; i++)
+					if (line[i] == '{') {
+						index = 0;
+						parse = 1;
+					} else if (line[i] == '}') break;
+				else if (index++ >= 0) {
+					if (line[i] == '\\' && i < line_length - 1)
+						i++;
+					command[index - 1] = line[i];
+				}
+
+				if (parse) {
+					command[index] = '\0';
+					command_length = index;
+				} else {
+					command[0] = '\0';
+					command_length = 0;
+				}
+
+				I18n *i18n = I18n::instance();
+	
+			switch (key) {
+				case 311: //end
+					return ((menu->getCount() == 0) ? True : False);
+					break;
+
+				case 333: // nop
+					menu->insert(label);
+					break;
+
+				case 421: // exec
+				if ((! *label) && (! *command)) {
+					fprintf(stderr,
+					i18n->getMessage(
+#ifdef		NLS
+						 ScreenSet, ScreenEXECError,
+#else // !NLS
+						 0, 0,
+#endif // NLS
+						 "BScreen::parseMenuFile: [exec] error, "
+						 "no menu label and/or command defined\n"));
+					continue;
+				}
+
+				menu->insert(label, BScreen::Execute, command);		
+				break;
+
+			case 442: // exit
+				if (! *label) {
+					fprintf(stderr,
+						i18n->getMessage(
+#ifdef		NLS
+						 ScreenSet, ScreenEXITError,
+#else // !NLS
+						 0, 0,
+#endif // NLS
+						 "BScreen::parseMenuFile: [exit] error, "
+						 "no menu label defined\n"));
+				continue;
+				}
+
+				menu->insert(label, BScreen::Exit);
+				break;
+	
+			case 561: // style
+			{
+				if ((! *label) || (! *command)) {
+					fprintf(stderr,
+						i18n->
+						getMessage(
+#ifdef		NLS
+					 ScreenSet, ScreenSTYLEError,
+#else // !NLS
+						 0, 0,
+#endif // NLS
+					 "BScreen::parseMenuFile: [style] error, "
+					 "no menu label and/or filename defined\n"));
+					continue;
+				}
+
+				char style[MAXPATHLEN];
+
+				// perform shell style ~ home directory expansion
+				char *homedir = 0;
+				int homedir_len = 0;
+				if (*command == '~' && *(command + 1) == '/') {
+					homedir = getenv("HOME");
+					homedir_len = strlen(homedir);
+				}
+
+				if (homedir && homedir_len != 0) {
+					strncpy(style, homedir, homedir_len);
+
+					strncpy(style + homedir_len, command + 1,
+						command_length - 1);
+					*(style + command_length + homedir_len - 1) = '\0';
+				} else {
+					strncpy(style, command, command_length);
+					*(style + command_length) = '\0';
+				}
+
+				menu->insert(label, BScreen::SetStyle, style);
+			}
+
+			break;
+
+			case 630: // config
+				if (! *label) {
+					fprintf(stderr,
+						i18n->
+						getMessage(
+#ifdef		NLS
+						 ScreenSet, ScreenCONFIGError,
+#else // !NLS
+						 0, 0,
+#endif // NLS
+						 "BScreen::parseMenufile: [config] error, "
+						 "no label defined"));
+				continue;
+			}
+
+			menu->insert(label, configmenu);
+
+			break;
+
+			case 740: // include
+			{
+				if (! *label) {
+					fprintf(stderr,
+						i18n->
+						getMessage(
+#ifdef		NLS
+					 ScreenSet, ScreenINCLUDEError,
+#else // !NLS
+				 0, 0,
+#endif // NLS
+				 "BScreen::parseMenuFile: [include] error, "
+				 "no filename defined\n"));
+				continue;
+			}
+
+			char newfile[MAXPATHLEN];
+
+			// perform shell style ~ home directory expansion
+			char *homedir = 0;
+			int homedir_len = 0;
+			if (*label == '~' && *(label + 1) == '/') {
+				homedir = getenv("HOME");
+				homedir_len = strlen(homedir);
+			}
+
+			if (homedir && homedir_len != 0) {
+				strncpy(newfile, homedir, homedir_len);
+
+				strncpy(newfile + homedir_len, label + 1,
+					label_length - 1);
+				*(newfile + label_length + homedir_len - 1) = '\0';
+			} else {
+				strncpy(newfile, label, label_length);
+				*(newfile + label_length) = '\0';
+			}
+
+			if (newfile) {
+				FILE *submenufile = fopen(newfile, "r");
+
+				if (submenufile) {
+								struct stat buf;
+								if (fstat(fileno(submenufile), &buf) ||
+										(! S_ISREG(buf.st_mode))) {
+									fprintf(stderr,
+				i18n->
+				getMessage(
+#ifdef		NLS
+						 ScreenSet, ScreenINCLUDEErrorReg,
+#else // !NLS
+						 0, 0,
+#endif // NLS
+						 "BScreen::parseMenuFile: [include] error: "
+						 "'%s' is not a regular file\n"), newfile);
+									break;
+								}
+
+		if (! feof(submenufile)) {
+			if (! parseMenuFile(submenufile, menu))
+				fluxbox->saveMenuFilename(newfile);
+
+			fclose(submenufile);
+		}
+				} else
+		perror(newfile);
+			}
+		}
+
+		break;
+
+	case 767: // submenu
+		{
+			if (! *label) {
+				fprintf(stderr,
+					i18n->
+					getMessage(
+#ifdef		NLS
+				 ScreenSet, ScreenSUBMENUError,
+#else // !NLS
+				 0, 0,
+#endif // NLS
+				 "BScreen::parseMenuFile: [submenu] error, "
+				 "no menu label defined\n"));
+				continue;
+			}
+
+			Rootmenu *submenu = new Rootmenu(this);
+
+			if (*command)
+				submenu->setLabel(command);
+			else
+				submenu->setLabel(label);
+
+			parseMenuFile(file, submenu);
+			submenu->update();
+			menu->insert(label, submenu);
+			rootmenuList->insert(submenu);
+		}
+
+		break;
+
+	case 773: // restart
+		{
+			if (! *label) {
+				fprintf(stderr,
+					i18n->
+					getMessage(
+#ifdef		NLS
+				 ScreenSet, ScreenRESTARTError,
+#else // !NLS
+				 0, 0,
+#endif // NLS
+				 "BScreen::parseMenuFile: [restart] error, "
+				 "no menu label defined\n"));
+				continue;
+			}
+
+			if (*command)
+				menu->insert(label, BScreen::RestartOther, command);
+			else
+				menu->insert(label, BScreen::Restart);
+		}
+
+		break;
+
+	case 845: // reconfig
+		{
+			if (! *label) {
+				fprintf(stderr,
+					i18n->
+					getMessage(
+#ifdef		NLS
+				 ScreenSet, ScreenRECONFIGError,
+#else // !NLS
+				 0, 0,
+#endif // NLs
+				 "BScreen::parseMenuFile: [reconfig] error, "
+				 "no menu label defined\n"));
+				continue;
+			}
+
+			menu->insert(label, BScreen::Reconfigure);
+		}
+
+		break;
+
+				case 995: // stylesdir
+				case 1113: // stylesmenu
+					{
+						Bool newmenu = ((key == 1113) ? True : False);
+
+						if ((! *label) || ((! *command) && newmenu)) {
+							fprintf(stderr,
+					i18n->
+					getMessage(
+#ifdef		NLS
+				 ScreenSet, ScreenSTYLESDIRError,
+#else // !NLS
+				 0, 0,
+#endif // NLS
+				 "BScreen::parseMenuFile: [stylesdir/stylesmenu]"
+				 " error, no directory defined\n"));
+							continue;
+						}
+
+						char stylesdir[MAXPATHLEN];
+
+						char *directory = ((newmenu) ? command : label);
+						int directory_length = ((newmenu) ? command_length : label_length);
+
+						// perform shell style ~ home directory expansion
+						char *homedir = 0;
+						int homedir_len = 0;
+
+						if (*directory == '~' && *(directory + 1) == '/') {
+							homedir = getenv("HOME");
+							homedir_len = strlen(homedir);
+						}
+
+						if (homedir && homedir_len != 0) {
+							strncpy(stylesdir, homedir, homedir_len);
+
+							strncpy(stylesdir + homedir_len, directory + 1,
+											directory_length - 1);
+							*(stylesdir + directory_length + homedir_len - 1) = '\0';
+						} else {
+							strncpy(stylesdir, directory, directory_length);
+							*(stylesdir + directory_length) = '\0';
+						}
+
+						struct stat statbuf;
+
+						if (! stat(stylesdir, &statbuf)) {
+							if (S_ISDIR(statbuf.st_mode)) {
+								Rootmenu *stylesmenu;
+
+								if (newmenu)
+									stylesmenu = new Rootmenu(this);
+								else
+									stylesmenu = menu;
+
+								DIR *d = opendir(stylesdir);
+								int entries = 0;
+								struct dirent *p;
+
+								// get the total number of directory entries
+								while ((p = readdir(d))) entries++;
+								rewinddir(d);
+
+								char **ls = new char* [entries];
+								int index = 0;
+								while ((p = readdir(d)))
+									ls[index++] = bstrdup(p->d_name);
+
+								qsort(ls, entries, sizeof(char *), dcmp);
+
+								int n, slen = strlen(stylesdir);
+								for (n = 0; n < entries; n++) {
+									int nlen = strlen(ls[n]);
+									char style[MAXPATHLEN + 1];
+
+									strncpy(style, stylesdir, slen);
+									*(style + slen) = '/';
+									strncpy(style + slen + 1, ls[n], nlen + 1);
+
+									if ((! stat(style, &statbuf)) && S_ISREG(statbuf.st_mode))
+										stylesmenu->insert(ls[n], BScreen::SetStyle, style);
+
+									delete [] ls[n];
+								}
+
+								delete [] ls;
+
+								stylesmenu->update();
+
+								if (newmenu) {
+									stylesmenu->setLabel(label);
+									menu->insert(label, stylesmenu);
+									rootmenuList->insert(stylesmenu);
+								}
+
+								fluxbox->saveMenuFilename(stylesdir);
+							} else {
+								fprintf(stderr,
+			i18n->
+			getMessage(
+#ifdef		NLS
+					 ScreenSet, ScreenSTYLESDIRErrorNotDir,
+#else // !NLS
+					 0, 0,
+#endif // NLS
+					 "BScreen::parseMenuFile:"
+					 " [stylesdir/stylesmenu] error, %s is not a"
+					 " directory\n"), stylesdir);
+							}
+						} else {
+							fprintf(stderr,
+					i18n->
+					getMessage(
+#ifdef		NLS
+				 ScreenSet, ScreenSTYLESDIRErrorNoExist,
+#else // !NLS
+				 0, 0,
+#endif // NLS
+				 "BScreen::parseMenuFile: [stylesdir/stylesmenu]"
+				 " error, %s does not exist\n"), stylesdir);
+						}
+
+						break;
+					}
+
+	case 1090: // workspaces
+		{
+			if (! *label) {
+				fprintf(stderr,
+					i18n->getMessage(
+#ifdef		NLS
+							 ScreenSet, ScreenWORKSPACESError,
+#else // !NLS
+							 0, 0,
+#endif // NLS
+							 "BScreen:parseMenuFile: [workspaces] error, "
+							 "no menu label defined\n"));
+				continue;
+			}
+
+			menu->insert(label, workspacemenu);
+
+			break;
+		}
+	}
+			}
+		}
+	}
+
+	return ((menu->getCount() == 0) ? True : False);
+}
+
+
+void BScreen::shutdown(void) {
+	fluxbox->grab();
+
+	XSelectInput(getBaseDisplay()->getXDisplay(), getRootWindow(), NoEventMask);
+	XSync(getBaseDisplay()->getXDisplay(), False);
+
+	LinkedListIterator it(workspacesList);
+	for (; it.current(); it ++)
+		it.current()->shutdown();
+
+	while (iconList->count()) {
+		iconList->first()->restore();
+		delete iconList->first();
+	}
+
+#ifdef		SLIT
+	slit->shutdown();
+#endif // SLIT
+
+	fluxbox->ungrab();
+}
+
+
+void BScreen::showPosition(int x, int y) {
+	if (! geom_visible) {
+		XMoveResizeWindow(getBaseDisplay()->getXDisplay(), geom_window,
+											(getWidth() - geom_w) / 2,
+											(getHeight() - geom_h) / 2, geom_w, geom_h);
+		XMapWindow(getBaseDisplay()->getXDisplay(), geom_window);
+		XRaiseWindow(getBaseDisplay()->getXDisplay(), geom_window);
+
+		geom_visible = True;
+	}
+	const int label_size = 1024;
+	char label[label_size];
+	
+	snprintf(label, label_size,
+		I18n::instance()->getMessage(
+#ifdef		NLS
+				 ScreenSet, ScreenPositionFormat,
+#else // !NLS
+				 0, 0,
+#endif // NLS
+				 "X: %4d x Y: %4d"), x, y);
+
+	XClearWindow(getBaseDisplay()->getXDisplay(), geom_window);
+
+	if (I18n::instance()->multibyte()) 
+		XmbDrawString(getBaseDisplay()->getXDisplay(), geom_window,
+			theme->getWindowStyle()->font.set, theme->getWindowStyle()->l_text_focus_gc,
+			theme->getBevelWidth(), theme->getBevelWidth() -
+			theme->getWindowStyle()->font.set_extents->max_ink_extent.y,
+			label, strlen(label));
+	else
+		XDrawString(getBaseDisplay()->getXDisplay(), geom_window,
+			theme->getWindowStyle()->l_text_focus_gc,
+			theme->getBevelWidth(),
+			theme->getWindowStyle()->font.fontstruct->ascent +
+			theme->getBevelWidth(), label, strlen(label));
+	
+}
+
+
+void BScreen::showGeometry(unsigned int gx, unsigned int gy) {
+	if (! geom_visible) {
+		XMoveResizeWindow(getBaseDisplay()->getXDisplay(), geom_window,
+											(getWidth() - geom_w) / 2,
+											(getHeight() - geom_h) / 2, geom_w, geom_h);
+		XMapWindow(getBaseDisplay()->getXDisplay(), geom_window);
+		XRaiseWindow(getBaseDisplay()->getXDisplay(), geom_window);
+
+		geom_visible = True;
+	}
+	
+	char label[1024];
+
+	sprintf(label,
+		I18n::instance()->getMessage(
+#ifdef		NLS
+				 ScreenSet, ScreenGeometryFormat,
+#else // !NLS
+				 0, 0,
+#endif // NLS
+				 "W: %4d x H: %4d"), gx, gy);
+
+	XClearWindow(getBaseDisplay()->getXDisplay(), geom_window);
+
+	if (I18n::instance()->multibyte())
+		XmbDrawString(getBaseDisplay()->getXDisplay(), geom_window,
+			theme->getWindowStyle()->font.set, theme->getWindowStyle()->l_text_focus_gc,
+			theme->getBevelWidth(), theme->getBevelWidth() -
+			theme->getWindowStyle()->font.set_extents->max_ink_extent.y,
+			label, strlen(label));
+	else
+		XDrawString(getBaseDisplay()->getXDisplay(), geom_window,
+		theme->getWindowStyle()->l_text_focus_gc,
+		theme->getBevelWidth(),
+		theme->getWindowStyle()->font.fontstruct->ascent +
+		theme->getBevelWidth(), label, strlen(label));
+}
+
+
+void BScreen::hideGeometry(void) {
+	if (geom_visible) {
+		XUnmapWindow(getBaseDisplay()->getXDisplay(), geom_window);
+		geom_visible = False;
+	}
+}
+
+//-------------- nextWorkspace ---------------
+// Goes to the workspace "right" of the current
+//--------------------------------------------
+void BScreen::nextWorkspace(void) {
+	if (getCurrentWorkspaceID()+1 > getCount()-1)
+		changeWorkspaceID(0);
+	else
+		changeWorkspaceID(getCurrentWorkspaceID()+1);
+}
+
+//------------- prevWorkspace ----------------
+// Goes to the workspace "left" of the current
+//--------------------------------------------
+void BScreen::prevWorkspace(void) {
+	if (getCurrentWorkspaceID()-1 < 0)
+		changeWorkspaceID(getCount()-1);
+	else
+		changeWorkspaceID(getCurrentWorkspaceID()-1);
+}
diff --git a/src/Screen.hh b/src/Screen.hh
new file mode 100644
index 00000000..8ab49d58
--- /dev/null
+++ b/src/Screen.hh
@@ -0,0 +1,349 @@
+// Screen.hh for fluxbox 
+// Copyright (c) 2001 Henrik Kinnunen (fluxgen@linuxmail.org)
+// 
+// Screen.hh for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.	IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+
+
+#ifndef	 __Screen_hh
+#define	 __Screen_hh
+
+#include 
+#include 
+
+#ifdef		TIME_WITH_SYS_TIME
+#	include 
+#	include 
+#else // !TIME_WITH_SYS_TIME
+#	ifdef		HAVE_SYS_TIME_H
+#		include 
+#	else // !HAVE_SYS_TIME_H
+#		include 
+#	endif // HAVE_SYS_TIME_H
+#endif // TIME_WITH_SYS_TIME
+
+#include 
+
+#include "Theme.hh"
+
+// forward declaration
+class BScreen;
+#ifndef _BASEDISPLAY_HH_
+#include "BaseDisplay.hh"
+#endif
+#ifndef _CONFIGMENU_HH_
+#include "Configmenu.hh"
+#endif
+#ifndef _ICON_HH_
+#include "Icon.hh"
+#endif
+#ifndef _LINKEDLIST_HH_
+#include "LinkedList.hh"
+#endif
+#ifndef _NETIZEN_HH_
+#include "Netizen.hh"
+#endif
+#ifndef _ROOTMENU_HH_
+#include "Rootmenu.hh"
+#endif
+#ifndef _TIMER_HH_
+#include "Timer.hh"
+#endif
+#ifndef _WORKSPACE_HH_
+#include "Workspace.hh"
+#endif
+#ifndef _WORKSPACEMENU_HH_
+#include "Workspacemenu.hh"
+#endif
+#ifndef _FLUXBOX_HH_
+#include "fluxbox.hh"
+#endif
+
+#ifdef		SLIT
+#	include "Slit.hh"
+#endif // SLIT
+
+class BScreen : public ScreenInfo {
+public:
+	BScreen(Fluxbox *, int);
+	~BScreen(void);
+
+	inline const Bool &isToolbarOnTop(void) const
+	{ return resource.toolbar_on_top; }
+	inline const Bool &doToolbarAutoHide(void) const
+	{ return resource.toolbar_auto_hide; }
+	inline const Bool &isSloppyFocus(void) const
+	{ return resource.sloppy_focus; }
+	inline const Bool &isSemiSloppyFocus(void) const
+	{ return resource.semi_sloppy_focus; }
+	inline const Bool &isRootColormapInstalled(void) const
+	{ return root_colormap_installed; }
+	inline const Bool &isScreenManaged(void) const { return managed; }
+	inline const Bool &isTabRotateVertical(void) const
+	{ return resource.tab_rotate_vertical; }
+	inline const Bool &doAutoRaise(void) const { return resource.auto_raise; }
+	inline const Bool &doImageDither(void) const
+	{ return resource.image_dither; }
+	inline const Bool &doOrderedDither(void) const
+	{ return resource.ordered_dither; }
+	inline const Bool &doOpaqueMove(void) const { return resource.opaque_move; }
+	inline const Bool &doFullMax(void) const { return resource.full_max; }
+	inline const Bool &doFocusNew(void) const { return resource.focus_new; }
+	inline const Bool &doFocusLast(void) const { return resource.focus_last; }
+
+	inline const GC &getOpGC() const { return theme->getOpGC(); }
+
+	inline const BColor *getBorderColor(void) { return &theme->getBorderColor(); }
+	inline BImageControl *getImageControl(void) { return image_control; }
+	inline Rootmenu *getRootmenu(void) { return rootmenu; }
+
+#ifdef	 SLIT
+	inline const Bool &isSlitOnTop(void) const { return resource.slit_on_top; }
+	inline const Bool &doSlitAutoHide(void) const
+	{ return resource.slit_auto_hide; }
+	inline Slit *getSlit(void) { return slit; }
+	inline const int &getSlitPlacement(void) const
+	{ return resource.slit_placement; }
+	inline const int &getSlitDirection(void) const
+	{ return resource.slit_direction; }
+	inline void saveSlitPlacement(int p) { resource.slit_placement = p; }
+	inline void saveSlitDirection(int d) { resource.slit_direction = d; }
+	inline void saveSlitOnTop(Bool t)		{ resource.slit_on_top = t; }
+	inline void saveSlitAutoHide(Bool t) { resource.slit_auto_hide = t; }
+#endif // SLIT
+
+	inline Toolbar *getToolbar(void) { return toolbar; }
+
+	inline Workspace *getWorkspace(int w) { return workspacesList->find(w); }
+	inline Workspace *getCurrentWorkspace(void) { return current_workspace; }
+
+	inline Workspacemenu *getWorkspacemenu(void) { return workspacemenu; }
+
+	inline const unsigned int &getHandleWidth(void) const
+	{ return theme->getHandleWidth(); }
+	inline const unsigned int &getBevelWidth(void) const
+	{ return theme->getBevelWidth(); }
+	inline const unsigned int &getFrameWidth(void) const
+	{ return theme->getFrameWidth(); }
+	inline const unsigned int &getBorderWidth(void) const
+	{ return theme->getBorderWidth(); }
+	inline const unsigned int getBorderWidth2x(void) const
+	{ return theme->getBorderWidth()*2; }
+	
+	inline const int getCurrentWorkspaceID()
+	{ return current_workspace->getWorkspaceID(); }
+	inline const int getCount(void) { return workspacesList->count(); }
+	inline const int getIconCount(void) { return iconList->count(); }
+	inline LinkedList *getIconList(void) { return iconList; }
+	inline const int &getNumberOfWorkspaces(void) const
+	{ return resource.workspaces; }
+	inline const int &getToolbarPlacement(void) const
+	{ return resource.toolbar_placement; }
+	inline const int &getToolbarWidthPercent(void) const
+	{ return resource.toolbar_width_percent; }
+	inline const int &getPlacementPolicy(void) const
+	{ return resource.placement_policy; }
+	inline const int &getEdgeSnapThreshold(void) const
+	{ return resource.edge_snap_threshold; }
+	inline const int &getRowPlacementDirection(void) const
+	{ return resource.row_direction; }
+	inline const int &getColPlacementDirection(void) const
+	{ return resource.col_direction; }
+	inline const int getTabPlacement(void)
+	{ return resource.tab_placement; }
+	inline const int getTabAlignment(void)
+	{ return resource.tab_alignment; }
+
+	inline void setRootColormapInstalled(Bool r) { root_colormap_installed = r; }
+	inline void saveSloppyFocus(Bool s) { resource.sloppy_focus = s; }
+	inline void saveSemiSloppyFocus(Bool s) { resource.semi_sloppy_focus = s; }
+	inline void saveAutoRaise(Bool a) { resource.auto_raise = a; }
+	inline void saveWorkspaces(int w) { resource.workspaces = w; }
+	inline void saveToolbarOnTop(Bool r) { resource.toolbar_on_top = r; }
+	inline void saveToolbarAutoHide(Bool r) { resource.toolbar_auto_hide = r; }
+	inline void saveToolbarWidthPercent(int w)
+	{ resource.toolbar_width_percent = w; }
+	inline void saveToolbarPlacement(int p) { resource.toolbar_placement = p; }
+	inline void savePlacementPolicy(int p) { resource.placement_policy = p; }
+	inline void saveRowPlacementDirection(int d) { resource.row_direction = d; }
+	inline void saveColPlacementDirection(int d) { resource.col_direction = d; }
+	inline void saveEdgeSnapThreshold(int t)
+	{ resource.edge_snap_threshold = t; }
+	inline void saveImageDither(Bool d) { resource.image_dither = d; }
+	inline void saveOpaqueMove(Bool o) { resource.opaque_move = o; }
+	inline void saveFullMax(Bool f) { resource.full_max = f; }
+	inline void saveFocusNew(Bool f) { resource.focus_new = f; }
+	inline void saveFocusLast(Bool f) { resource.focus_last = f; }
+	inline void saveTabPlacement(unsigned int p) { resource.tab_placement = p; }
+	inline void saveTabAlignment(unsigned int a) { resource.tab_alignment = a; }
+	inline void saveTabRotateVertical(Bool r)
+	{ resource.tab_rotate_vertical = r; }
+	inline void iconUpdate(void) { iconmenu->update(); }
+	inline Iconmenu *getIconmenu(void) { return iconmenu; }
+
+	
+#ifdef		HAVE_STRFTIME
+	inline char *getStrftimeFormat(void) { return resource.strftime_format; }
+	void saveStrftimeFormat(char *);
+#else // !HAVE_STRFTIME
+	inline int getDateFormat(void) { return resource.date_format; }
+	inline void saveDateFormat(int f) { resource.date_format = f; }
+	inline Bool isClock24Hour(void) { return resource.clock24hour; }
+	inline void saveClock24Hour(Bool c) { resource.clock24hour = c; }
+#endif // HAVE_STRFTIME
+
+	inline WindowStyle *getWindowStyle(void) { return theme->getWindowStyle(); } 
+	inline MenuStyle *getMenuStyle(void) { return theme->getMenuStyle(); } 
+	inline ToolbarStyle *getToolbarStyle(void) { return theme->getToolbarStyle(); } 
+
+	FluxboxWindow *getIcon(int);
+
+	int addWorkspace(void);
+	int removeLastWorkspace(void);
+	//scroll workspaces
+	void nextWorkspace();
+	void prevWorkspace();
+
+	void removeWorkspaceNames(void);
+	void updateWorkspaceNamesAtom(void);
+	
+	void addWorkspaceName(char *);
+	void addNetizen(Netizen *);
+	void removeNetizen(Window);
+	void addIcon(FluxboxWindow *);
+	void removeIcon(FluxboxWindow *);
+	void getNameOfWorkspace(int, char **);
+	void changeWorkspaceID(int);
+	void raiseWindows(Window *, int);
+	void reassociateWindow(FluxboxWindow *, int, Bool);
+	void prevFocus(void);
+	void nextFocus(void);
+	void raiseFocus(void);
+	void reconfigure(void);
+	void rereadMenu(void);
+	void shutdown(void);
+	void showPosition(int, int);
+	void showGeometry(unsigned int, unsigned int);
+	void hideGeometry(void);
+
+	void updateNetizenCurrentWorkspace(void);
+	void updateNetizenWorkspaceCount(void);
+	void updateNetizenWindowFocus(void);
+	void updateNetizenWindowAdd(Window, unsigned long);
+	void updateNetizenWindowDel(Window);
+	void updateNetizenConfigNotify(XEvent *);
+	void updateNetizenWindowRaise(Window);
+	void updateNetizenWindowLower(Window);
+
+	enum { RowSmartPlacement = 1, ColSmartPlacement, CascadePlacement, LeftRight,
+				 RightLeft, TopBottom, BottomTop };
+	enum { LeftJustify = 1, RightJustify, CenterJustify };
+	enum { RoundBullet = 1, TriangleBullet, SquareBullet, NoBullet };
+	enum { Restart = 1, RestartOther, Exit, Shutdown, Execute, Reconfigure,
+				 WindowShade, WindowIconify, WindowMaximize, WindowClose, WindowRaise,
+				 WindowLower, WindowStick, WindowKill, SetStyle, WindowTab};
+
+private:
+	Theme *theme;
+	
+	Bool root_colormap_installed, managed, geom_visible;
+	GC opGC;
+	Pixmap geom_pixmap;
+	Window geom_window;
+
+	Fluxbox *fluxbox;
+	BImageControl *image_control;
+	Configmenu *configmenu;
+	Iconmenu *iconmenu;
+
+	Rootmenu *rootmenu;
+
+	LinkedList *rootmenuList;
+	LinkedList *netizenList;
+	LinkedList *iconList;
+
+#ifdef		SLIT
+	Slit *slit;
+#endif // SLIT
+
+	Toolbar *toolbar;
+	Workspace *current_workspace;
+	Workspacemenu *workspacemenu;
+
+	unsigned int geom_w, geom_h;
+	unsigned long event_mask;
+
+	LinkedList *workspaceNames;
+	LinkedList *workspacesList;
+
+	struct resource {
+//		WindowStyle wstyle;
+//		ToolbarStyle tstyle;
+//		MenuStyle mstyle;
+
+		Bool toolbar_on_top, toolbar_auto_hide, sloppy_focus, auto_raise,
+			auto_edge_balance, image_dither, ordered_dither, opaque_move, full_max,
+			focus_new, focus_last, tab_rotate_vertical, semi_sloppy_focus;
+//		BColor border_color;
+//		XrmDatabase stylerc;
+
+		int workspaces, toolbar_placement, toolbar_width_percent, placement_policy,
+			edge_snap_threshold, row_direction, col_direction;
+
+		unsigned int tab_placement, tab_alignment;
+
+#ifdef		SLIT
+		Bool slit_on_top, slit_auto_hide;
+		int slit_placement, slit_direction;
+#endif // SLIT
+
+	//	unsigned int handle_width, frame_width,
+	//		border_width, border_width_2x;
+
+#ifdef		HAVE_STRFTIME
+		char *strftime_format;
+#else // !HAVE_STRFTIME
+		Bool clock24hour;
+		int date_format;
+#endif // HAVE_STRFTIME
+
+
+	} resource;
+
+
+protected:
+	Bool parseMenuFile(FILE *, Rootmenu *);
+
+	bool readDatabaseTexture(char *, char *, BTexture *, unsigned long);
+	bool readDatabaseColor(char *, char *, BColor *, unsigned long);
+
+	void readDatabaseFontSet(char *, char *, XFontSet *);
+	XFontSet createFontSet(char *);
+	void readDatabaseFont(char *, char *, XFontStruct **);
+
+	void InitMenu(void);
+
+
+};
+
+
+#endif // __Screen_hh
diff --git a/src/Slit.cc b/src/Slit.cc
new file mode 100644
index 00000000..379fdaa0
--- /dev/null
+++ b/src/Slit.cc
@@ -0,0 +1,905 @@
+// Slit.cc for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.	IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// stupid macros needed to access some functions in version 2 of the GNU C
+// library
+#ifndef	 _GNU_SOURCE
+#define	 _GNU_SOURCE
+#endif // _GNU_SOURCE
+
+#ifdef		HAVE_CONFIG_H
+#	include "../config.h"
+#endif // HAVE_CONFIG_H
+
+#ifdef		SLIT
+
+#include 
+
+#include "i18n.hh"
+#include "fluxbox.hh"
+#include "Image.hh"
+#include "Screen.hh"
+#include "Slit.hh"
+#include "Toolbar.hh"
+
+
+Slit::Slit(BScreen *scr) {
+	screen = scr;
+	fluxbox = Fluxbox::instance();
+
+	on_top = screen->isSlitOnTop();
+	hidden = do_auto_hide = screen->doSlitAutoHide();
+
+	display = screen->getBaseDisplay()->getXDisplay();
+	frame.window = frame.pixmap = None;
+
+	timer = new BTimer(fluxbox, this);
+	timer->setTimeout(fluxbox->getAutoRaiseDelay());
+	timer->fireOnce(True);
+
+	clientList = new LinkedList;
+
+	slitmenu = new Slitmenu(this);
+
+	XSetWindowAttributes attrib;
+	unsigned long create_mask = CWBackPixmap | CWBackPixel | CWBorderPixel |
+															CWColormap | CWOverrideRedirect | CWEventMask;
+	attrib.background_pixmap = None;
+	attrib.background_pixel = attrib.border_pixel =
+		screen->getBorderColor()->getPixel();
+	attrib.colormap = screen->getColormap();
+	attrib.override_redirect = True;
+	attrib.event_mask = SubstructureRedirectMask | ButtonPressMask |
+											EnterWindowMask | LeaveWindowMask;
+
+	frame.x = frame.y = 0;
+	frame.width = frame.height = 1;
+
+	frame.window =
+		XCreateWindow(display, screen->getRootWindow(), frame.x, frame.y,
+			frame.width, frame.height, screen->getBorderWidth(),
+									screen->getDepth(), InputOutput, screen->getVisual(),
+									create_mask, &attrib);
+	fluxbox->saveSlitSearch(frame.window, this);
+
+	reconfigure();
+}
+
+
+Slit::~Slit() {
+	fluxbox->grab();
+
+	if (timer->isTiming()) timer->stop();
+	delete timer;
+
+	delete clientList;
+	delete slitmenu;
+
+	screen->getImageControl()->removeImage(frame.pixmap);
+
+	fluxbox->removeSlitSearch(frame.window);
+
+	XDestroyWindow(display, frame.window);
+
+	fluxbox->ungrab();
+}
+
+
+void Slit::addClient(Window w) {
+	fluxbox->grab();
+
+	if (fluxbox->validateWindow(w)) {
+		SlitClient *client = new SlitClient;
+		client->client_window = w;
+
+		XWMHints *wmhints = XGetWMHints(display, w);
+
+		if (wmhints) {
+			if ((wmhints->flags & IconWindowHint) &&
+					(wmhints->icon_window != None)) {
+				XMoveWindow(display, client->client_window, screen->getWidth() + 10,
+				screen->getHeight() + 10);
+				XMapWindow(display, client->client_window);
+
+				client->icon_window = wmhints->icon_window;
+				client->window = client->icon_window;
+			} else {
+				client->icon_window = None;
+				client->window = client->client_window;
+			}
+
+			XFree(wmhints);
+		} else {
+			client->icon_window = None;
+			client->window = client->client_window;
+		}
+	#ifndef KDE 
+		XWindowAttributes attrib;
+		if (XGetWindowAttributes(display, client->window, &attrib)) {
+			client->width = attrib.width;
+			client->height = attrib.height;
+		} else {
+			client->width = client->height = 64;
+		}
+	#else //KDE stuff starts here
+	  XWindowAttributes attrib;
+		//Check and see if new client is a KDE dock applet
+		//If so force reasonable size
+		bool iskdedockapp=false;
+		Atom ajunk;
+		int ijunk;
+		unsigned long *data = (unsigned long *) 0, uljunk;
+
+		// Check if KDE v2.x dock applet
+		if (XGetWindowProperty(fluxbox->getXDisplay(), w,
+												fluxbox->getKWM2DockwindowAtom(), 0l, 1l, False,
+												fluxbox->getKWM2DockwindowAtom(),
+												&ajunk, &ijunk, &uljunk, &uljunk,
+												(unsigned char **) &data) == Success) {
+			iskdedockapp = (data && data[0] != 0);
+			XFree((char *) data);
+    }
+
+		// Check if KDE v1.x dock applet
+		if (!iskdedockapp) {
+			if (XGetWindowProperty(fluxbox->getXDisplay(), w,
+													fluxbox->getKWM1DockwindowAtom(), 0l, 1l, False,
+													fluxbox->getKWM1DockwindowAtom(),
+													&ajunk, &ijunk, &uljunk, &uljunk,
+													(unsigned char **) &data) == Success) {
+				iskdedockapp = (data && data[0] != 0);
+	 	    XFree((char *) data);
+  	 	}
+		}
+
+		if (iskdedockapp)
+			client->width = client->height = 24;
+		else {
+			if (XGetWindowAttributes(display, client->window, &attrib)) {
+				client->width = attrib.width;
+				client->height = attrib.height;
+			}	else
+				client->width = client->height = 64;
+		}
+	#endif // KDE
+
+		XSetWindowBorderWidth(display, client->window, 0);
+
+		XSelectInput(display, frame.window, NoEventMask);
+		XSelectInput(display, client->window, NoEventMask);
+
+		XReparentWindow(display, client->window, frame.window, 0, 0);
+		XMapRaised(display, client->window);
+		XChangeSaveSet(display, client->window, SetModeInsert);
+
+		XSelectInput(display, frame.window, SubstructureRedirectMask |
+		 ButtonPressMask | EnterWindowMask | LeaveWindowMask);
+		XSelectInput(display, client->window, StructureNotifyMask |
+								 SubstructureNotifyMask | EnterWindowMask);
+		XFlush(display);
+
+		clientList->insert(client);
+
+		fluxbox->saveSlitSearch(client->client_window, this);
+		fluxbox->saveSlitSearch(client->icon_window, this);
+		reconfigure();
+	}
+
+	fluxbox->ungrab();
+}
+
+
+void Slit::removeClient(SlitClient *client, Bool remap) {
+	fluxbox->removeSlitSearch(client->client_window);
+	fluxbox->removeSlitSearch(client->icon_window);
+	clientList->remove(client);
+
+	screen->removeNetizen(client->window);
+
+	if (remap && fluxbox->validateWindow(client->window)) {
+		XSelectInput(display, frame.window, NoEventMask);
+		XSelectInput(display, client->window, NoEventMask);
+		XReparentWindow(display, client->window, screen->getRootWindow(),
+				client->x, client->y);
+		XChangeSaveSet(display, client->window, SetModeDelete);
+		XSelectInput(display, frame.window, SubstructureRedirectMask |
+		 ButtonPressMask | EnterWindowMask | LeaveWindowMask);
+		XFlush(display);
+	}
+
+	delete client;
+}
+
+
+void Slit::removeClient(Window w, Bool remap) {
+	fluxbox->grab();
+
+	Bool reconf = False;
+
+	LinkedListIterator it(clientList);
+	for (; it.current(); it++)
+		if (it.current()->window == w) {
+			removeClient(it.current(), remap);
+			reconf = True;
+
+			break;
+		}
+
+	if (reconf) reconfigure();
+
+	fluxbox->ungrab();
+}
+
+
+void Slit::reconfigure(void) {
+	frame.width = 0;
+	frame.height = 0;
+	LinkedListIterator it(clientList);
+
+	switch (screen->getSlitDirection()) {
+	case Vertical:
+		for (; it.current(); it++) {
+			frame.height += it.current()->height + screen->getBevelWidth();
+
+			if (frame.width < it.current()->width)
+				frame.width = it.current()->width;
+		}
+
+		if (frame.width < 1)
+			frame.width = 1;
+		else
+			frame.width += (screen->getBevelWidth() * 2);
+
+		if (frame.height < 1)
+			frame.height = 1;
+		else
+			frame.height += screen->getBevelWidth();
+
+		break;
+
+	case Horizontal:
+		for (; it.current(); it++) {
+			frame.width += it.current()->width + screen->getBevelWidth();
+
+			if (frame.height < it.current()->height)
+				frame.height = it.current()->height;
+		}
+
+		if (frame.width < 1)
+			frame.width = 1;
+		else
+			frame.width += screen->getBevelWidth();
+
+		if (frame.height < 1)
+			frame.height = 1;
+		else
+			frame.height += (screen->getBevelWidth() * 2);
+
+		break;
+	}
+
+	reposition();
+
+	XSetWindowBorderWidth(display ,frame.window, screen->getBorderWidth());
+	XSetWindowBorder(display, frame.window,
+									 screen->getBorderColor()->getPixel());
+
+	if (! clientList->count())
+		XUnmapWindow(display, frame.window);
+	else
+		XMapWindow(display, frame.window);
+
+	Pixmap tmp = frame.pixmap;
+	BImageControl *image_ctrl = screen->getImageControl();
+	BTexture *texture = &(screen->getToolbarStyle()->toolbar);
+	if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+		frame.pixmap = None;
+		XSetWindowBackground(display, frame.window,
+			 texture->getColor()->getPixel());
+	} else {
+		frame.pixmap = image_ctrl->renderImage(frame.width, frame.height,
+						 texture);
+		XSetWindowBackgroundPixmap(display, frame.window, frame.pixmap);
+	}
+	if (tmp) image_ctrl->removeImage(tmp);
+	XClearWindow(display, frame.window);
+
+	int x, y;
+	it.reset();
+
+	switch (screen->getSlitDirection()) {
+	case Vertical:
+		x = 0;
+		y = screen->getBevelWidth();
+
+		for (; it.current(); it++) {
+			x = (frame.width - it.current()->width) / 2;
+
+			XMoveResizeWindow(display, it.current()->window, x, y,
+												it.current()->width, it.current()->height);
+			XMapWindow(display, it.current()->window);
+
+			// for ICCCM compliance
+			it.current()->x = x;
+			it.current()->y = y;
+
+			XEvent event;
+			event.type = ConfigureNotify;
+
+			event.xconfigure.display = display;
+			event.xconfigure.event = it.current()->window;
+			event.xconfigure.window = it.current()->window;
+			event.xconfigure.x = x;
+			event.xconfigure.y = y;
+			event.xconfigure.width = it.current()->width;
+			event.xconfigure.height = it.current()->height;
+			event.xconfigure.border_width = 0;
+			event.xconfigure.above = frame.window;
+			event.xconfigure.override_redirect = False;
+
+			XSendEvent(display, it.current()->window, False, StructureNotifyMask,
+					 &event);
+
+			y += it.current()->height + screen->getBevelWidth();
+		}
+
+		break;
+
+	case Horizontal:
+		x = screen->getBevelWidth();
+		y = 0;
+
+		for (; it.current(); it++) {
+			y = (frame.height - it.current()->height) / 2;
+
+			XMoveResizeWindow(display, it.current()->window, x, y,
+												it.current()->width, it.current()->height);
+			XMapWindow(display, it.current()->window);
+
+			// for ICCCM compliance
+			it.current()->x = x;
+			it.current()->y = y;
+
+			XEvent event;
+			event.type = ConfigureNotify;
+
+			event.xconfigure.display = display;
+			event.xconfigure.event = it.current()->window;
+			event.xconfigure.window = it.current()->window;
+			event.xconfigure.x = frame.x + x + screen->getBorderWidth();
+			event.xconfigure.y = frame.y + y + screen->getBorderWidth();
+			event.xconfigure.width = it.current()->width;
+			event.xconfigure.height = it.current()->height;
+			event.xconfigure.border_width = 0;
+			event.xconfigure.above = frame.window;
+			event.xconfigure.override_redirect = False;
+
+			XSendEvent(display, it.current()->window, False, StructureNotifyMask,
+								 &event);
+
+			x += it.current()->width + screen->getBevelWidth();
+		}
+
+		break;
+	}
+
+	slitmenu->reconfigure();
+}
+
+
+void Slit::reposition(void) {
+	// place the slit in the appropriate place
+	switch (screen->getSlitPlacement()) {
+	case TopLeft:
+		frame.x = 0;
+		frame.y = 0;
+		if (screen->getSlitDirection() == Vertical) {
+			frame.x_hidden = screen->getBevelWidth() - screen->getBorderWidth()
+								 - frame.width;
+			frame.y_hidden = 0;
+		} else {
+			frame.x_hidden = 0;
+			frame.y_hidden = screen->getBevelWidth() - screen->getBorderWidth()
+								 - frame.height;
+		}
+		break;
+
+	case CenterLeft:
+		frame.x = 0;
+		frame.y = (screen->getHeight() - frame.height) / 2;
+		frame.x_hidden = screen->getBevelWidth() - screen->getBorderWidth()
+							 - frame.width;
+		frame.y_hidden = frame.y;
+		break;
+
+	case BottomLeft:
+		frame.x = 0;
+		frame.y = screen->getHeight() - frame.height - screen->getBorderWidth2x();
+		if (screen->getSlitDirection() == Vertical) {
+			frame.x_hidden = screen->getBevelWidth() - screen->getBorderWidth()
+								 - frame.width;
+			frame.y_hidden = frame.y;
+		} else {
+			frame.x_hidden = 0;
+			frame.y_hidden = screen->getHeight() - screen->getBevelWidth()
+								 - screen->getBorderWidth();
+		}
+		break;
+
+	case TopCenter:
+		frame.x = (screen->getWidth() - frame.width) / 2;
+		frame.y = 0;
+		frame.x_hidden = frame.x;
+		frame.y_hidden = screen->getBevelWidth() - screen->getBorderWidth()
+										 - frame.height;
+		break;
+
+	case BottomCenter:
+		frame.x = (screen->getWidth() - frame.width) / 2;
+		frame.y = screen->getHeight() - frame.height - screen->getBorderWidth2x();
+		frame.x_hidden = frame.x;
+		frame.y_hidden = screen->getHeight() - screen->getBevelWidth()
+										 - screen->getBorderWidth();
+		break;
+
+	case TopRight:
+		frame.x = screen->getWidth() - frame.width - screen->getBorderWidth2x();
+		frame.y = 0;
+		if (screen->getSlitDirection() == Vertical) {
+			frame.x_hidden = screen->getWidth() - screen->getBevelWidth()
+								 - screen->getBorderWidth();
+			frame.y_hidden = 0;
+		} else {
+			frame.x_hidden = frame.x;
+			frame.y_hidden = screen->getBevelWidth() - screen->getBorderWidth()
+											 - frame.height;
+		}
+		break;
+
+	case CenterRight:
+	default:
+		frame.x = screen->getWidth() - frame.width - screen->getBorderWidth2x();
+		frame.y = (screen->getHeight() - frame.height) / 2;
+		frame.x_hidden = screen->getWidth() - screen->getBevelWidth()
+										 - screen->getBorderWidth();
+		frame.y_hidden = frame.y;
+		break;
+
+	case BottomRight:
+		frame.x = screen->getWidth() - frame.width - screen->getBorderWidth2x();
+		frame.y = screen->getHeight() - frame.height - screen->getBorderWidth2x();
+		if (screen->getSlitDirection() == Vertical) {
+			frame.x_hidden = screen->getWidth() - screen->getBevelWidth()
+								 - screen->getBorderWidth();
+			frame.y_hidden = frame.y;
+		} else {
+			frame.x_hidden = frame.x;
+			frame.y_hidden = screen->getHeight() - screen->getBevelWidth()
+											 - screen->getBorderWidth();
+		}
+		break;
+	}
+
+	Toolbar *tbar = screen->getToolbar();
+	int sw = frame.width + screen->getBorderWidth2x(),
+			sh = frame.height + screen->getBorderWidth2x(),
+			tw = tbar->getWidth() + screen->getBorderWidth(),
+			th = tbar->getHeight() + screen->getBorderWidth();
+
+	if (tbar->getX() < frame.x + sw && tbar->getX() + tw > frame.x &&
+			tbar->getY() < frame.y + sh && tbar->getY() + th > frame.y) {
+		if (frame.y < th) {
+			frame.y += tbar->getExposedHeight();
+			if (screen->getSlitDirection() == Vertical)
+				frame.y_hidden += tbar->getExposedHeight();
+			else
+	frame.y_hidden = frame.y;
+		} else {
+			frame.y -= tbar->getExposedHeight();
+			if (screen->getSlitDirection() == Vertical)
+				frame.y_hidden -= tbar->getExposedHeight();
+			else
+	frame.y_hidden = frame.y;
+		}
+	}
+
+	if (hidden)
+		XMoveResizeWindow(display, frame.window, frame.x_hidden,
+					frame.y_hidden, frame.width, frame.height);
+	else
+		XMoveResizeWindow(display, frame.window, frame.x,
+					frame.y, frame.width, frame.height);
+}
+
+
+void Slit::shutdown(void) {
+	while (clientList->count())
+		removeClient(clientList->first());
+}
+
+
+void Slit::buttonPressEvent(XButtonEvent *e) {
+	if (e->window != frame.window) return;
+
+	if (e->button == Button1 && (! on_top)) {
+		Window w[1] = { frame.window };
+		screen->raiseWindows(w, 1);
+	} else if (e->button == Button2 && (! on_top)) {
+		XLowerWindow(display, frame.window);
+	} else if (e->button == Button3) {
+		if (! slitmenu->isVisible()) {
+			int x, y;
+
+			x = e->x_root - (slitmenu->getWidth() / 2);
+			y = e->y_root - (slitmenu->getHeight() / 2);
+
+			if (x < 0)
+				x = 0;
+			else if (x + slitmenu->getWidth() > screen->getWidth())
+				x = screen->getWidth() - slitmenu->getWidth();
+
+			if (y < 0)
+				y = 0;
+			else if (y + slitmenu->getHeight() > screen->getHeight())
+				y = screen->getHeight() - slitmenu->getHeight();
+
+			slitmenu->move(x, y);
+			slitmenu->show();
+		} else
+			slitmenu->hide();
+	}
+}
+
+
+void Slit::enterNotifyEvent(XCrossingEvent *) {
+	if (! do_auto_hide)
+		return;
+
+	if (hidden) {
+		if (! timer->isTiming()) timer->start();
+	} else {
+		if (timer->isTiming()) timer->stop();
+	}
+}
+
+
+void Slit::leaveNotifyEvent(XCrossingEvent *) {
+	if (! do_auto_hide)
+		return;
+
+	if (hidden) {
+		if (timer->isTiming()) timer->stop();
+	} else if (! slitmenu->isVisible()) {
+		if (! timer->isTiming()) timer->start();
+	}
+}
+
+
+void Slit::configureRequestEvent(XConfigureRequestEvent *e) {
+	fluxbox->grab();
+
+	if (fluxbox->validateWindow(e->window)) {
+		Bool reconf = False;
+		XWindowChanges xwc;
+
+		xwc.x = e->x;
+		xwc.y = e->y;
+		xwc.width = e->width;
+		xwc.height = e->height;
+		xwc.border_width = 0;
+		xwc.sibling = e->above;
+		xwc.stack_mode = e->detail;
+
+		XConfigureWindow(display, e->window, e->value_mask, &xwc);
+
+		LinkedListIterator it(clientList);
+		for (; it.current(); it++)
+			if (it.current()->window == e->window)
+				if (it.current()->width != ((unsigned) e->width) ||
+						it.current()->height != ((unsigned) e->height)) {
+					it.current()->width = (unsigned) e->width;
+					it.current()->height = (unsigned) e->height;
+
+					reconf = True;
+
+					break;
+				}
+
+		if (reconf) reconfigure();
+
+	}
+
+	fluxbox->ungrab();
+}
+
+
+void Slit::timeout(void) {
+	hidden = ! hidden;
+	if (hidden)
+		XMoveWindow(display, frame.window, frame.x_hidden, frame.y_hidden);
+	else
+		XMoveWindow(display, frame.window, frame.x, frame.y);
+}
+
+
+Slitmenu::Slitmenu(Slit *sl) : Basemenu(sl->screen) {
+	slit = sl;
+	I18n *i18n = I18n::instance();
+	
+	setLabel(i18n->getMessage(
+#ifdef		NLS
+					SlitSet, SlitSlitTitle,
+#else // !NLS
+					0, 0,
+#endif // NLS
+					"Slit"));
+	setInternalMenu();
+
+	directionmenu = new Directionmenu(this);
+	placementmenu = new Placementmenu(this);
+
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonDirectionTitle,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Direction"),
+	 directionmenu);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementTitle,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Placement"),
+	 placementmenu);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonAlwaysOnTop,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Always on top"), 1);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonAutoHide,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Auto hide"), 2);
+
+	update();
+
+	if (slit->isOnTop()) setItemSelected(2, True);
+	if (slit->doAutoHide()) setItemSelected(3, True);
+}
+
+
+Slitmenu::~Slitmenu(void) {
+	delete directionmenu;
+	delete placementmenu;
+}
+
+
+void Slitmenu::itemSelected(int button, int index) {
+	if (button == 1) {
+		BasemenuItem *item = find(index);
+		if (! item) return;
+
+		switch (item->function()) {
+		case 1: // always on top
+			{
+	Bool change = ((slit->isOnTop()) ?	False : True);
+	slit->on_top = change;
+	setItemSelected(2, change);
+
+	if (slit->isOnTop()) slit->screen->raiseWindows((Window *) 0, 0);
+	break;
+			}
+
+		case 2: // auto hide
+			{
+	Bool change = ((slit->doAutoHide()) ?	False : True);
+	slit->do_auto_hide = change;
+	setItemSelected(3, change);
+
+	break;
+			}
+		}
+	}
+}
+
+
+void Slitmenu::internal_hide(void) {
+	Basemenu::internal_hide();
+	if (slit->doAutoHide())
+		slit->timeout();
+}
+
+
+void Slitmenu::reconfigure(void) {
+	directionmenu->reconfigure();
+	placementmenu->reconfigure();
+
+	Basemenu::reconfigure();
+}
+
+
+Slitmenu::Directionmenu::Directionmenu(Slitmenu *sm) : Basemenu(sm->slit->screen) {
+	slitmenu = sm;
+	I18n *i18n = I18n::instance();
+	
+	setLabel(i18n->getMessage(
+#ifdef		NLS
+					SlitSet, SlitSlitDirection,
+#else // !NLS
+					0, 0,
+#endif // NLS
+					"Slit Direction"));
+	setInternalMenu();
+
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonDirectionHoriz,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Horizontal"),
+	 Slit::Horizontal);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonDirectionVert,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Vertical"),
+	 Slit::Vertical);
+
+	update();
+
+	if (sm->slit->screen->getSlitDirection() == Slit::Horizontal)
+		setItemSelected(0, True);
+	else
+		setItemSelected(1, True);
+}
+
+
+void Slitmenu::Directionmenu::itemSelected(int button, int index) {
+	if (button == 1) {
+		BasemenuItem *item = find(index);
+		if (! item) return;
+
+		slitmenu->slit->screen->saveSlitDirection(item->function());
+
+		if (item->function() == Slit::Horizontal) {
+			setItemSelected(0, True);
+			setItemSelected(1, False);
+		} else {
+			setItemSelected(0, False);
+			setItemSelected(1, True);
+		}
+
+		hide();
+		slitmenu->slit->reconfigure();
+	}
+}
+
+
+Slitmenu::Placementmenu::Placementmenu(Slitmenu *sm) : Basemenu(sm->slit->screen) {
+	slitmenu = sm;
+	I18n *i18n = I18n::instance();
+	
+	setLabel(i18n->getMessage(
+#ifdef		NLS
+					SlitSet, SlitSlitPlacement,
+#else // !NLS
+					0, 0,
+#endif // NLS
+					"Slit Placement"));
+	setMinimumSublevels(3);
+	setInternalMenu();
+
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementTopLeft,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Top Left"),
+	 Slit::TopLeft);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementCenterLeft,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Center Left"),
+	 Slit::CenterLeft);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementBottomLeft,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Bottom Left"),
+	 Slit::BottomLeft);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementTopCenter,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Top Center"),
+	 Slit::TopCenter);
+	insert("");
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementBottomCenter,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Bottom Center"),
+	 Slit::BottomCenter);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementTopRight,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Top Right"),
+	 Slit::TopRight);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementCenterRight,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Center Right"),
+	 Slit::CenterRight);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementBottomRight,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Bottom Right"),
+	 Slit::BottomRight);
+
+	update();
+}
+
+
+void Slitmenu::Placementmenu::itemSelected(int button, int index) {
+	if (button == 1) {
+		BasemenuItem *item = find(index);
+		if (! item) return;
+
+		if (item->function()) {
+			slitmenu->slit->screen->saveSlitPlacement(item->function());
+			hide();
+			slitmenu->slit->reconfigure();
+		}
+	}
+}
+
+
+#endif // SLIT
diff --git a/src/Slit.hh b/src/Slit.hh
new file mode 100644
index 00000000..cce1d973
--- /dev/null
+++ b/src/Slit.hh
@@ -0,0 +1,159 @@
+// Slit.hh for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the 
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in 
+// all copies or substantial portions of the Software. 
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL 
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+// DEALINGS IN THE SOFTWARE.
+  
+#ifndef   _SLIT_HH_
+#define   _SLIT_HH_
+
+#include 
+#include 
+
+// forward declaration
+class Slit;
+class Slitmenu;
+
+#include "Basemenu.hh"
+#include "LinkedList.hh"
+
+
+class Slitmenu : public Basemenu {
+private: 
+  class Directionmenu : public Basemenu {
+  private:
+    Slitmenu *slitmenu;
+
+  protected:
+    virtual void itemSelected(int, int);
+
+  public:
+    Directionmenu(Slitmenu *);
+  };
+
+  class Placementmenu : public Basemenu {
+  private:
+    Slitmenu *slitmenu;
+
+  protected: 
+    virtual void itemSelected(int, int);
+
+  public:
+    Placementmenu(Slitmenu *);
+  };
+
+  Directionmenu *directionmenu;
+  Placementmenu *placementmenu;
+
+  Slit *slit;
+
+  friend class Directionmenu;
+  friend class Placementmenu;
+  friend class Slit;
+
+
+protected:
+  virtual void itemSelected(int, int);
+  virtual void internal_hide(void);
+
+
+public:
+  Slitmenu(Slit *);
+  virtual ~Slitmenu(void);
+
+  inline Basemenu *getDirectionmenu(void) { return directionmenu; }
+  inline Basemenu *getPlacementmenu(void) { return placementmenu; }
+
+  void reconfigure(void);
+};
+
+
+class Slit : public TimeoutHandler {
+private:
+  class SlitClient {
+  public:
+    Window window, client_window, icon_window;
+
+    int x, y;
+    unsigned int width, height;
+  };
+
+  Bool on_top, hidden, do_auto_hide;
+  Display *display;
+
+  Fluxbox *fluxbox;
+  BScreen *screen;
+  BTimer *timer;
+
+  LinkedList *clientList;
+  Slitmenu *slitmenu;
+
+  struct frame {
+    Pixmap pixmap;
+    Window window;
+
+    int x, y, x_hidden, y_hidden;
+    unsigned int width, height;
+  } frame;
+
+  friend class Slitmenu;
+  friend class Slitmenu::Directionmenu;
+  friend class Slitmenu::Placementmenu;
+
+
+public:
+  Slit(BScreen *);
+  virtual ~Slit();
+
+  inline const Bool &isOnTop(void) const { return on_top; }
+  inline const Bool &isHidden(void) const { return hidden; }
+  inline const Bool &doAutoHide(void) const { return do_auto_hide; }
+
+  inline Slitmenu *getMenu() { return slitmenu; }
+
+  inline const Window &getWindowID() const { return frame.window; }
+
+  inline const int &getX(void) const
+  { return ((hidden) ? frame.x_hidden : frame.x); }
+  inline const int &getY(void) const
+  { return ((hidden) ? frame.y_hidden : frame.y); }
+
+  inline const unsigned int &getWidth(void) const { return frame.width; }
+  inline const unsigned int &getHeight(void) const { return frame.height; }
+
+  void addClient(Window);
+  void removeClient(SlitClient *, Bool = True);
+  void removeClient(Window, Bool = True);
+  void reconfigure(void);
+  void reposition(void);
+  void shutdown(void);
+
+  void buttonPressEvent(XButtonEvent *);
+  void enterNotifyEvent(XCrossingEvent *);
+  void leaveNotifyEvent(XCrossingEvent *);
+  void configureRequestEvent(XConfigureRequestEvent *);
+
+  virtual void timeout(void);
+
+  enum { Vertical = 1, Horizontal };
+  enum { TopLeft = 1, CenterLeft, BottomLeft, TopCenter, BottomCenter,
+         TopRight, CenterRight, BottomRight };
+};
+
+
+#endif // __Slit_hh
diff --git a/src/Tab.cc b/src/Tab.cc
new file mode 100644
index 00000000..51281194
--- /dev/null
+++ b/src/Tab.cc
@@ -0,0 +1,1069 @@
+// Tab.cc for Fluxbox
+// Copyright (c) 2001 Henrik Kinnunen (fluxgen@linuxmail.org)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#include "Tab.hh"
+#include 
+#ifdef HAVE_CONFIG_H
+#  include "../config.h"
+#endif // HAVE_CONFIG_H
+#include "i18n.hh"
+
+#include "misc.hh"
+
+using namespace std;
+
+bool Tab::m_stoptabs = false;
+Tab::t_tabplacementlist Tab::m_tabplacementlist[] = {
+		{PTop, "Top"},
+		{PBottom, "Bottom"},
+		{PLeft, "Left"},
+		{PRight, "Right"},
+		{pnone, "none"}
+	};
+
+Tab::t_tabplacementlist Tab::m_tabalignmentlist[] = {
+		{ALeft, "Left"},
+		{ACenter, "Center"},
+		{ARight, "Right"},
+		{ARelative, "Relative"},
+		{anone, "none"}
+	};
+
+Tab::Tab(FluxboxWindow *win, Tab *prev, Tab *next) { 
+	//set default values
+	
+	m_focus = m_moving = false;
+	m_configured = true; // only set to false before Fluxbox::reconfigure
+	m_move_x = m_move_y = 0;	
+	m_prev = prev; m_next = next; 
+	m_win = win;
+	m_display = Fluxbox::instance()->getXDisplay();
+	
+	if ((m_win->screen->getTabPlacement() == PLeft ||
+			m_win->screen->getTabPlacement() == PRight) &&
+			m_win->screen->isTabRotateVertical()) {
+		m_size_w = Fluxbox::instance()->getTabHeight();
+		m_size_h = Fluxbox::instance()->getTabWidth();
+	} else {
+		m_size_w = Fluxbox::instance()->getTabWidth();
+		m_size_h = Fluxbox::instance()->getTabHeight();
+	}
+
+	createTabWindow();
+
+	calcIncrease();
+}
+
+Tab::~Tab() {
+
+	disconnect();	
+	
+	Fluxbox::instance()->removeTabSearch(m_tabwin);
+	XDestroyWindow(m_display, m_tabwin);
+}
+
+
+//----------------  createTabWindow ---------------
+// (private)
+// Creates the Window for tab to be above the title window.
+// This should only be called by the constructor.
+//-------------------------------------------------
+void Tab::createTabWindow() {
+	unsigned long attrib_mask = CWBackPixmap | CWBackPixel | CWBorderPixel |
+			      CWColormap | CWOverrideRedirect | CWEventMask;
+	XSetWindowAttributes attrib;
+	attrib.background_pixmap = None;
+	attrib.background_pixel = attrib.border_pixel =
+			m_win->screen->getWindowStyle()->tab.border_color.getPixel();
+	attrib.colormap = m_win->screen->getColormap();
+	attrib.override_redirect = True;
+	attrib.event_mask = ButtonPressMask | ButtonReleaseMask |
+						ButtonMotionMask | ExposureMask | EnterWindowMask;
+	//Notice that m_size_w gets the TOTAL width of tabs INCLUDING borders
+	m_tabwin = XCreateWindow(m_display, m_win->screen->getRootWindow(), 
+							-30000, -30000, //TODO: So that it wont flicker or
+											// appear before the window do
+			m_size_w - m_win->screen->getWindowStyle()->tab.border_width_2x,
+			m_size_h - m_win->screen->getWindowStyle()->tab.border_width_2x,
+							m_win->screen->getWindowStyle()->tab.border_width,
+							m_win->screen->getDepth(), InputOutput,
+							m_win->screen->getVisual(), attrib_mask, &attrib);
+	//set grab
+	XGrabButton(m_display, Button1, Mod1Mask, m_tabwin, True,
+				ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
+				GrabModeAsync, None, Fluxbox::instance()->getMoveCursor());
+	
+	
+	//save to tabsearch
+	Fluxbox::instance()->saveTabSearch(m_tabwin, this);	
+
+	XMapSubwindows(m_display, m_tabwin);
+		
+	XMapWindow(m_display, m_tabwin);
+
+	decorate();
+}
+
+//-------------- focus --------------------
+// Called when the focus changes in m_win 
+// updates pixmap or color and draws the tab
+//-----------------------------------------
+void Tab::focus() {
+
+	if (m_win->focused) {
+		if (m_focus_pm)
+			XSetWindowBackgroundPixmap(m_display, m_tabwin, m_focus_pm);
+		else
+			XSetWindowBackground(m_display, m_tabwin, m_focus_pixel);
+	} else {
+		if (m_unfocus_pm)
+			XSetWindowBackgroundPixmap(m_display, m_tabwin, m_unfocus_pm);
+		else
+			XSetWindowBackground(m_display, m_tabwin, m_unfocus_pixel);
+	}
+	XClearWindow(m_display, m_tabwin);	
+	draw(false);
+}
+
+//-------------- raise --------------------
+// Raises the tabs in the tablist
+//-----------------------------------------
+void Tab::raise() {
+	//get first tab
+	Tab *first = 0;
+	first = getFirst(this);
+	//raise tabs
+	for (; first!=0; first = first->m_next)
+		m_win->screen->raiseWindows(&first->m_tabwin, 1);
+}
+
+//-------------- decorate --------------------
+// decorates the tab with current theme
+// TODO optimize this
+//--------------------------------------------
+void Tab::decorate() {
+	
+	BImageControl *image_ctrl = m_win->screen->getImageControl();
+	Pixmap tmp = m_focus_pm;
+	BTexture *texture = &(m_win->screen->getWindowStyle()->tab.l_focus);
+
+ 	if (texture->getTexture() & BImage_ParentRelative ) {
+		BTexture *pt = &(m_win->screen->getWindowStyle()->tab.t_focus);
+		if (pt->getTexture() == (BImage_Flat | BImage_Solid)) {
+  		  m_focus_pm = None;
+	    m_focus_pixel = pt->getColor()->getPixel();
+  	} else
+    	m_focus_pm =
+	      image_ctrl->renderImage(m_size_w, m_size_h, pt);
+  	if (tmp) image_ctrl->removeImage(tmp);
+		
+	} else {
+		if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+  		  m_focus_pm = None;
+	    m_focus_pixel = texture->getColor()->getPixel();
+  	} else
+    	m_focus_pm =
+	      image_ctrl->renderImage(m_size_w, m_size_h, texture);
+  	if (tmp) image_ctrl->removeImage(tmp);
+	}
+	
+	tmp = m_unfocus_pm;
+	texture = &(m_win->screen->getWindowStyle()->tab.l_unfocus);
+  
+	if (texture->getTexture() & BImage_ParentRelative ) {
+		BTexture *pt = &(m_win->screen->getWindowStyle()->tab.t_unfocus);
+		if (pt->getTexture() == (BImage_Flat | BImage_Solid)) {
+			m_unfocus_pm = None;
+			m_unfocus_pixel = pt->getColor()->getPixel();
+  		} else
+			m_unfocus_pm =
+			image_ctrl->renderImage(m_size_w, m_size_h, pt);
+	} else {
+		if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+			m_unfocus_pm = None;
+			m_unfocus_pixel = texture->getColor()->getPixel();
+  		} else
+			m_unfocus_pm =
+				image_ctrl->renderImage(m_size_w, m_size_h, texture);
+	}
+	
+	if (tmp) image_ctrl->removeImage(tmp);
+	
+	XSetWindowBorderWidth(m_display, m_tabwin,
+		m_win->screen->getWindowStyle()->tab.border_width);
+	XSetWindowBorder(m_display, m_tabwin,
+		m_win->screen->getWindowStyle()->tab.border_color.getPixel());
+}
+
+
+//-------------- deiconify -------------------
+// Deiconifies the tab
+// Used from FluxboxWindow to deiconify the tab when the window is deiconfied
+//--------------------------------------------
+void Tab::deiconify() {
+	XMapWindow(m_display, m_tabwin);
+}
+
+//------------- iconify --------------------
+// Iconifies the tab.
+// Used from FluxboxWindow to hide tab win when window is iconified
+// disconnects itself from the list
+//------------------------------------------
+void Tab::iconify() {
+	disconnect();
+	withdraw();
+}
+
+//------------ withdraw --------------
+// Unmaps the tab from display
+//------------------------------------
+void Tab::withdraw() {
+	XUnmapWindow(m_display, m_tabwin);	
+}
+
+//------------ stick --------------------
+// Set/reset the the sticky on all windows in the list
+//---------------------------------------
+void Tab::stick() {
+ 
+	//get first tab
+	Tab *first = 0;
+	first = getFirst(this);
+	
+	//now do stick for all windows in the list
+	for (; first!=0; first = first->m_next) {
+		FluxboxWindow *win = first->m_win; //just for convenient
+		if (win->stuck) {
+			win->blackbox_attrib.flags ^= AttribOmnipresent;
+			win->blackbox_attrib.attrib ^= AttribOmnipresent;
+			win->stuck = false;
+			if (!win->iconic)
+      	win->screen->reassociateWindow(win, -1, true);
+				    
+		} else {
+			win->stuck = true;
+			win->blackbox_attrib.flags |= AttribOmnipresent;
+			win->blackbox_attrib.attrib |= AttribOmnipresent;
+		}
+		
+		win->setState(win->current_state);
+	}	
+
+}
+
+//------------- resize -------------
+// Resize the window's in the tablist
+//----------------------------------
+void Tab::resize() {
+	Tab *first = getFirst(this);
+
+	//now move and resize the windows in the list
+	for (; first != 0; first = first->m_next) {
+		if (first!=this) {
+			first->m_win->configure(m_win->frame.x, m_win->frame.y,
+								m_win->frame.width, m_win->frame.height);
+		}
+	}
+
+	// need to resize tabs if in relative mode
+	if (m_win->screen->getTabAlignment() == ARelative) {
+		calcIncrease();
+		setPosition();
+	}
+}
+
+//----------- shade --------------
+// Shades the windows in the tablist
+//--------------------------------
+void Tab::shade() {
+	for(Tab *first = getFirst(this); first != 0; first = first->m_next) {
+		if (first==this)
+			continue;
+			first->m_win->shade();
+	}
+
+	if (m_win->screen->getTabPlacement() == PLeft ||
+			m_win->screen->getTabPlacement() == PRight) { 
+		resizeGroup();
+		calcIncrease();
+	}
+
+	if (!(m_win->screen->getTabPlacement() == PTop))
+		setPosition();
+}
+
+//------------ draw -----------------
+// Draws the tab 
+// if pressed = true then it draws the tab in pressed 
+// mode else it draws it in normal mode
+// TODO: the "draw in pressed mode" 
+//-----------------------------------
+void Tab::draw(bool pressed) {	
+	unsigned int tabtext_w;
+
+	GC gc = ((m_win->focused) ? m_win->screen->getWindowStyle()->tab.l_text_focus_gc :
+		   m_win->screen->getWindowStyle()->tab.l_text_unfocus_gc);
+
+	// Different routines for drawing rotated text
+	if ((m_win->screen->getTabPlacement() == PLeft ||
+			m_win->screen->getTabPlacement() == PRight) &&
+			(!m_win->isShaded() && m_win->screen->isTabRotateVertical())) {
+
+		tabtext_w = XRotTextWidth(m_win->screen->getWindowStyle()->tab.rot_font,
+						m_win->client.title, m_win->client.title_len);
+		tabtext_w += (m_win->frame.bevel_w * 4);
+
+		DrawRotString(m_display, m_tabwin, gc,
+				m_win->screen->getWindowStyle()->tab.rot_font,
+				m_win->screen->getWindowStyle()->tab.font.justify,
+				tabtext_w, m_size_w, m_size_h,
+				m_win->frame.bevel_w, m_win->client.title);
+
+	} else {
+		if (I18n::instance()->multibyte()) { // TODO: maybe move this out from here?
+			XRectangle ink, logical;
+			XmbTextExtents(m_win->screen->getWindowStyle()->tab.font.set,
+					m_win->client.title, m_win->client.title_len,
+					&ink, &logical);
+			tabtext_w = logical.width;
+		} else {
+			tabtext_w = XTextWidth(
+					m_win->screen->getWindowStyle()->tab.font.fontstruct,
+					m_win->client.title, m_win->client.title_len);
+		}
+		tabtext_w += (m_win->frame.bevel_w * 4);
+
+		DrawString(m_display, m_tabwin, gc,
+				&m_win->screen->getWindowStyle()->tab.font,
+				tabtext_w, m_size_w,
+				m_win->frame.bevel_w, m_win->client.title);
+	}
+}
+
+//------------- setPosition -----------------
+// Position tab ( follow the m_win pos ).
+// (and resize)
+// Set new position of the other tabs in the chain
+//-------------------------------------------
+void Tab::setPosition() {	
+	//don't do anything if the tablist is freezed
+	if (m_stoptabs)
+		return;
+
+	Tab *first = 0;
+	int pos_x = 0, pos_y = 0;
+	
+	m_stoptabs = true; //freeze tablist
+	
+	//and check for max tabs
+	//TODO: optimize! There is many ways to implement this...		
+	//posible movement to a static member function
+
+	//Tab placement
+	if (m_win->screen->getTabPlacement() == PTop) {
+		pos_y = m_win->frame.y - m_size_h; 
+
+	} else if (m_win->screen->getTabPlacement() == PBottom ||
+				m_win->isShaded()) { 
+		if (m_win->isShaded())
+			pos_y = m_win->frame.y + m_win->getTitleHeight() +
+					m_win->screen->getBorderWidth2x();
+		else
+			pos_y = m_win->frame.y + m_win->getHeight() +
+					m_win->screen->getBorderWidth2x();
+
+	} else if (m_win->screen->getTabPlacement() == PLeft) {
+		pos_x = m_win->frame.x - m_size_w;
+			
+	} else if (m_win->screen->getTabPlacement() == PRight) {
+		pos_x = m_win->frame.x + m_win->frame.width +
+				m_win->screen->getBorderWidth2x();	
+	}
+
+	//Tab alignment
+	if (m_win->screen->getTabPlacement() == PTop ||
+			m_win->screen->getTabPlacement() == PBottom ||
+			m_win->isShaded()) {
+		switch(m_win->screen->getTabAlignment()) {
+			case ARelative:
+			case ALeft:
+				pos_x = m_win->frame.x; 
+				break;
+			case ACenter:
+				pos_x = calcCenterXPos(); 
+				break;
+			case ARight:
+				pos_x = m_win->frame.x + m_win->frame.width +
+						m_win->screen->getBorderWidth2x() - m_size_w;
+				break;
+		}
+	} else { //PLeft | PRight
+		switch(m_win->screen->getTabAlignment()) {
+			case ALeft:
+				pos_y = m_win->frame.y - m_size_h + m_win->frame.height +
+						m_win->screen->getBorderWidth2x();
+				break;
+			case ACenter:
+				pos_y = calcCenterYPos();
+				break;
+			case ARelative:
+			case ARight:
+				pos_y = m_win->frame.y;
+				break;
+		}
+	}
+	
+	for (first = getFirst(this);
+			first!=0; 
+			pos_x += first->m_inc_x, pos_y += first->m_inc_y,
+			first = first->m_next){
+		
+		XMoveWindow(m_display, first->m_tabwin, pos_x, pos_y);
+				
+		//dont move fluxboxwindow if the itterator = this
+		if (first!=this) {
+			first->m_win->configure(m_win->frame.x, m_win->frame.y, 
+					m_win->frame.width, m_win->frame.height);
+		}	
+	}	
+
+	m_stoptabs = false;
+}
+
+//------------- calcIncrease ----------------
+// calculates m_inc_x and m_inc_y for tabs
+// used for positioning the tabs.
+//-------------------------------------------
+void Tab::calcIncrease(void) {
+	#ifdef DEBUG
+	cerr << "Calculating tab increase" << endl;
+	#endif // DEBUG
+
+	Tab *first;
+	int inc_x = 0, inc_y = 0;
+	unsigned int tabs = 0, i = 0;
+
+	if (m_win->screen->getTabPlacement() == PTop ||
+			m_win->screen->getTabPlacement() == PBottom ||
+			m_win->isShaded()) {
+		inc_y = 0;
+
+		switch(m_win->screen->getTabAlignment()) {
+			case ALeft:
+				inc_x = m_size_w;
+				break;
+			case ACenter:
+				inc_x = m_size_w;
+				break;
+			case ARight:
+				inc_x = -m_size_w;
+				break;
+			case ARelative:
+				inc_x = calcRelativeWidth();
+				break;
+		}
+	} else if (m_win->screen->getTabPlacement() == PLeft ||
+					m_win->screen->getTabPlacement() == PRight) {
+		inc_x = 0;
+
+		switch(m_win->screen->getTabAlignment()) {
+			case ALeft:
+				inc_y = -m_size_h;
+				break;
+			case ACenter:
+				inc_y = m_size_h;
+				break;
+			case ARight:
+				inc_y = m_size_h;
+				break;
+			case ARelative:
+				inc_y = calcRelativeHeight();
+				break;
+		}
+	}
+
+	for (first = getFirst(this); first!=0; first = first->m_next, tabs++);
+
+	for (first = getFirst(this); first!=0; first = first->m_next, i++){
+
+	//TODO: move this out from here?
+		if ((m_win->screen->getTabPlacement() == PTop ||
+				m_win->screen->getTabPlacement() == PBottom ||
+				m_win->isShaded()) &&
+				m_win->screen->getTabAlignment() == ARelative) {
+			if (!((m_win->frame.width +
+					m_win->screen->getBorderWidth2x()) % tabs) ||
+					i >= ((m_win->frame.width +
+					m_win->screen->getBorderWidth2x()) % tabs)) {
+				first->setTabWidth(inc_x);
+				first->m_inc_x = inc_x;
+			} else { // adding 1 extra pixel to get tabs like win width
+				first->setTabWidth(inc_x + 1);
+				first->m_inc_x = inc_x + 1;
+			}
+			first->m_inc_y = inc_y;
+		} else if (m_win->screen->getTabAlignment() == ARelative) {
+			if (!((m_win->frame.height +
+				m_win->screen->getBorderWidth2x()) % tabs) ||
+				i >= ((m_win->frame.height +
+				m_win->screen->getBorderWidth2x()) % tabs)) {
+
+				first->setTabHeight(inc_y);
+				first->m_inc_y = inc_y;
+			} else {
+				// adding 1 extra pixel to get tabs match window width
+				first->setTabHeight(inc_y + 1);
+				first->m_inc_y = inc_y + 1;
+			}
+			first->m_inc_x = inc_x;
+		} else { // non relative modes
+			first->m_inc_x = inc_x;
+			first->m_inc_y = inc_y;
+		}
+	}
+}
+
+//------------- buttonPressEvent -----------
+// Handle button press event here.
+//------------------------------------------
+void Tab::buttonPressEvent(XButtonEvent *be) {	
+	//draw in pressed mode
+	draw(true);
+	
+	//set window to titlewindow so we can take advatage of drag function
+	be->window = m_win->frame.title;
+	
+	//call windows buttonpress eventhandler
+	m_win->buttonPressEvent(be);
+}
+
+//----------- buttonReleaseEvent ----------
+// Handle button release event here.
+// If tab is dropped then it should try to find
+// the window where the tab where dropped.
+//-----------------------------------------
+void Tab::buttonReleaseEvent(XButtonEvent *be) {		
+	
+	if (m_moving) {
+		
+		m_moving = false; 
+		
+		//erase tabmoving rectangle
+		XDrawRectangle(m_display, m_win->screen->getRootWindow(),
+			m_win->screen->getOpGC(),
+			m_move_x, m_move_y, 
+			m_size_w, m_size_h);
+		
+		Fluxbox::instance()->ungrab();
+		XUngrabPointer(m_display, CurrentTime);
+		
+		//storage of window and pos of window where we dropped the tab
+		Window child;
+		int dest_x = 0, dest_y = 0;
+		
+		//find window on coordinates of buttonReleaseEvent
+		if (XTranslateCoordinates(m_display, m_win->screen->getRootWindow(), 
+							m_win->screen->getRootWindow(),
+							be->x_root, be->y_root, &dest_x, &dest_y, &child)) {
+			
+			Tab *tab = 0;
+			//search tablist for a tabwindow
+			if ((tab = Fluxbox::instance()->searchTab(child))!=0)  {
+				// do only attach a hole chain if we dropped the
+				// first tab in the dropped chain...
+
+				if (m_prev)
+					disconnect();
+				
+				// attach this tabwindow chain to the tabwindow chain we found.								
+				tab->insert(this);
+
+			} else {	
+				disconnect();
+
+				// (ab)using dest_x and dest_y
+				switch(m_win->screen->getTabPlacement()) {
+					case PTop:
+						dest_x = be->x_root;
+						dest_y = be->y_root;
+						switch(m_win->screen->getTabAlignment()) {
+						case ACenter:
+							dest_x -= (m_win->frame.width / 2) - (m_size_w / 2);
+							break;
+						case ARight:
+							dest_x -=  m_win->frame.width - m_size_w;
+						break;
+						}
+					break;
+					case PBottom:
+						dest_x = be->x_root;
+						dest_y = be->y_root - m_win->frame.height;
+						switch(m_win->screen->getTabAlignment()) {
+						case ACenter:
+							dest_x -= (m_win->frame.width / 2) - (m_size_w / 2);
+							break;
+						case ARight:
+							dest_x -=  m_win->frame.width - m_size_w;
+						break;
+						}
+					break;
+					case PLeft:
+						dest_x = be->x_root;
+						dest_y = be->y_root;
+						switch(m_win->screen->getTabAlignment()) {
+						case ACenter:
+							dest_y -= (m_win->frame.height / 2) - (m_size_h / 2);
+							break;
+						case ALeft:
+							dest_y -= m_win->frame.height + m_size_h;
+							break;
+						}
+					break;
+					case PRight:
+						dest_x = be->x_root - m_win->frame.width;
+						dest_y = be->y_root;
+						switch(m_win->screen->getTabAlignment()) {
+						case ACenter:
+							dest_y -= (m_win->frame.height / 2) - (m_size_h / 2);
+							break;
+						case ALeft:
+							dest_y -= m_win->frame.height + m_size_h;
+							break;
+						}
+					break;
+				}
+				//TODO: this causes an calculate increase event, even if
+				// only moving a tab!
+				m_win->configure(dest_x, dest_y, m_win->frame.width, m_win->frame.height);
+			}
+		}
+	} else {
+		
+		//raise this tabwindow
+		raise();
+		
+		//set window to title window soo we can use m_win handler for menu
+		be->window = m_win->frame.title;
+		
+		//call windows buttonrelease event handler so it can popup a menu if needed
+		m_win->buttonReleaseEvent(be);
+	}
+	
+}
+
+//------------- exposeEvent ------------
+// Handle expose event here.
+// Draws the tab unpressed
+//--------------------------------------
+void Tab::exposeEvent(XExposeEvent *ee) {
+	draw(false);
+}
+
+//----------- motionNotifyEvent --------
+// Handles motion event here
+// Draws the rectangle of moving tab
+//--------------------------------------
+void Tab::motionNotifyEvent(XMotionEvent *me) {
+	
+	Fluxbox *fluxbox = Fluxbox::instance();
+	
+	//if mousebutton 2 is pressed
+	if (me->state & Button2Mask) {
+		if (!m_moving) {
+			m_moving = true; 
+			
+			XGrabPointer(m_display, me->window, False, Button2MotionMask |
+								ButtonReleaseMask, GrabModeAsync, GrabModeAsync,
+								None, fluxbox->getMoveCursor(), CurrentTime);
+
+			fluxbox->grab();
+
+			m_move_x = me->x_root - 1;
+			m_move_y = me->y_root - 1;
+				
+			XDrawRectangle(m_display, m_win->screen->getRootWindow(), 
+					m_win->screen->getOpGC(),
+					m_move_x, m_move_y,
+					m_size_w, m_size_h);
+	
+		} else {
+		
+			int dx = me->x_root - 1, dy = me->y_root - 1;
+
+			dx -= m_win->screen->getBorderWidth();
+			dy -= m_win->screen->getBorderWidth();
+
+			if (m_win->screen->getEdgeSnapThreshold()) {
+				int drx = m_win->screen->getWidth() - (dx + 1);
+
+				if (dx > 0 && dx < drx && dx < m_win->screen->getEdgeSnapThreshold()) 
+					dx = 0;
+				else if (drx > 0 && drx < m_win->screen->getEdgeSnapThreshold())
+					dx = m_win->screen->getWidth() - 1;
+
+				int dtty, dbby, dty, dby;
+		
+				switch (m_win->screen->getToolbarPlacement()) {
+				case Toolbar::TopLeft:
+				case Toolbar::TopCenter:
+				case Toolbar::TopRight:
+					dtty = m_win->screen->getToolbar()->getExposedHeight() +
+							m_win->screen->getBorderWidth();
+					dbby = m_win->screen->getHeight();
+					break;
+
+				default:
+					dtty = 0;
+					dbby = m_win->screen->getToolbar()->getY();
+					break;
+				}
+		
+				dty = dy - dtty;
+				dby = dbby - (dy + 1);
+
+				if (dy > 0 && dty < m_win->screen->getEdgeSnapThreshold())
+					dy = dtty;
+				else if (dby > 0 && dby < m_win->screen->getEdgeSnapThreshold())
+					dy = dbby - 1;
+		
+			}
+		
+			//erase rectangle
+			XDrawRectangle(m_display, m_win->screen->getRootWindow(),
+					m_win->screen->getOpGC(),
+					m_move_x, m_move_y, 
+					m_size_w, m_size_h);
+
+			//redraw rectangle at new pos
+			m_move_x = dx;
+			m_move_y = dy;			
+			XDrawRectangle(m_display, m_win->screen->getRootWindow(), 
+					m_win->screen->getOpGC(),
+					m_move_x, m_move_y,
+					m_size_w, m_size_h);					
+			
+		}
+	} 
+}
+
+//-------------- getFirst() ---------
+// Returns the first Tab in the chain 
+// of currentchain. 
+//-----------------------------------
+Tab *Tab::getFirst(Tab *current) {
+	if (current==0)
+		return 0;
+	for (; current->m_prev != 0; current = current->m_prev);
+	return current;
+}
+
+//-------------- insert ------------
+// (private)
+// Inserts a tab in the chain
+//----------------------------------
+void Tab::insert(Tab *tab) {
+	
+	if (!tab || tab == this) //dont insert if the tab = 0 or the tab = this
+		return;
+
+	Tab *first = getFirst(this);
+	
+	//if the tab already in chain then disconnect it
+	for (; first!=0; first = first->m_next) {
+		if (first==tab) {
+			#ifdef DEBUG
+			cerr<<"Tab already in chain. Disconnecting!"<disconnect();
+			break;
+		}
+	}
+
+	//get last tab in the chain to be inserted
+	Tab *last = tab;
+	for (; last->m_next!=0; last=last->m_next); 
+	//do sticky before we connect it to the chain
+	//sticky bit on window
+	if (m_win->isStuck() && !tab->m_win->isStuck() ||
+			!m_win->isStuck() && tab->m_win->isStuck())
+			tab->m_win->stick(); //this will set all the m_wins in the list
+	
+	//connect the tab to this chain
+	
+	if (m_next)	
+		m_next->m_prev = last;
+	tab->m_prev = this; 
+	last->m_next = m_next; 
+
+	m_next = tab;	
+
+	//TODO: cleanup and optimize
+	//move and resize all windows in the tablist we inserted
+	//only from first tab of the inserted chain to the last
+	for (; tab!=last->m_next; tab=tab->m_next) {
+		if (m_win->isShaded() != tab->m_win->isShaded()) {
+			if (m_win->screen->getTabPlacement() == PLeft ||
+					m_win->screen->getTabPlacement() == PRight) {
+				// if window were grouping to, we need to shade the tab window
+				// _after_ reconfigure
+				if(m_win->isShaded()) {
+						tab->m_win->configure(m_win->frame.x, m_win->frame.y,
+							m_win->frame.width, m_win->frame.height);
+						tab->m_win->shade();
+				// don't need unshading as configure will fix that for me
+				} else {
+					if ((m_win->frame.width != tab->m_win->frame.width) ||
+							(m_win->frame.height != tab->m_win->frame.height)) {
+						tab->m_win->configure(m_win->frame.x, m_win->frame.y,
+							m_win->frame.width, m_win->frame.height);
+					} else // need to change shade state as configure _won't_
+							// do the trick if the new and old size is the same
+						tab->m_win->shade();
+				}
+
+				tab->resizeGroup();
+				tab->calcIncrease();
+
+			} else { // PTop & PBottom
+				if(m_win->isShaded()) {
+
+					tab->m_win->configure(m_win->frame.x, m_win->frame.y,
+							m_win->frame.width, m_win->frame.height);
+					tab->m_win->shade();
+				// don't need unshading as configure will fix that for me
+				} else {
+					if ((m_win->frame.width != tab->m_win->frame.width) ||
+							(m_win->frame.height != tab->m_win->frame.height)) {
+
+						tab->m_win->configure(m_win->frame.x, m_win->frame.y,
+							m_win->frame.width, m_win->frame.height);
+					} else
+						tab->m_win->shade();
+				}
+			}
+
+		// both window have the same shaded state
+		} else {
+			if ((m_win->frame.width != tab->m_win->frame.width) ||
+					(m_win->frame.height != tab->m_win->frame.height)) {
+
+				tab->m_win->configure(m_win->frame.x, m_win->frame.y,
+					m_win->frame.width, m_win->frame.height);
+
+				// need to shade the tab window as configure will mess it up
+				if (m_win->isShaded())
+					tab->m_win->shade();
+			}
+		}
+
+		// TODO: should check if alignemnt is left or right,
+		// cus then resize is allready done resize tabs 
+		if(m_win->screen->getTabAlignment() == ARelative) {
+			tab->resizeGroup();
+			tab->calcIncrease();
+		}
+		m_win->tab->setPosition();
+	}	
+}
+
+//---------- disconnect() --------------
+// Disconnects the tab from any chain
+//--------------------------------------
+void Tab::disconnect() {
+	Tab *tmp = 0;
+	if (m_prev) {	//if this have a chain to "the left" (previous tab) then set it's next to this next
+		m_prev->m_next = m_next;
+		tmp = m_prev;
+	} 
+	if (m_next) {	//if this have a chain to "the right" (next tab) then set it's prev to this prev
+		m_next->m_prev = m_prev;
+		tmp = m_next;
+	}
+
+	//mark as no chain, previous and next.
+	m_prev = 0;
+	m_next = 0;
+	
+	//reposition the tabs
+	if (tmp) {
+		if (m_win->screen->getTabAlignment() == ARelative)
+			tmp->calcIncrease();
+		tmp->setPosition();
+	}
+
+	if (m_win->screen->getTabAlignment() == ARelative)
+		calcIncrease();
+	
+	setPosition();
+}
+
+// ------------ setTabWidth --------------
+// Sets Tab width _including_ borders
+// ---------------------------------------
+void Tab::setTabWidth(unsigned int w) {
+	if (w > m_win->screen->getWindowStyle()->tab.border_width_2x) {
+		m_size_w = w;
+		XResizeWindow(m_display, m_tabwin,
+			m_size_w - m_win->screen->getWindowStyle()->tab.border_width_2x,
+			m_size_h - m_win->screen->getWindowStyle()->tab.border_width_2x);
+	}
+}
+
+// ------------ setTabHeight ---------
+// Sets Tab height _including_ borders
+// ---------------------------------------
+void Tab::setTabHeight(unsigned int h) {
+	if (h > m_win->screen->getWindowStyle()->tab.border_width_2x) {
+		m_size_h = h;
+		XResizeWindow(m_display, m_tabwin, 
+			m_size_w - m_win->screen->getWindowStyle()->tab.border_width_2x,
+			m_size_h - m_win->screen->getWindowStyle()->tab.border_width_2x);
+	} 
+}
+
+// ------------ resizeGroup --------------
+// This function is used when (un)shading
+// to get right size/width of tabs when
+// PLeft || PRight && isTabRotateVertical
+// ---------------------------------------
+void Tab::resizeGroup(void) {
+	#ifdef DEBUG
+	cerr << "Resising group" << endl;
+	#endif //DEBUG
+	Tab *first;
+	for (first = getFirst(this); first != 0; first = first->m_next) {
+		if ((m_win->screen->getTabPlacement() == PLeft ||
+				m_win->screen->getTabPlacement() == PRight) &&
+				m_win->screen->isTabRotateVertical() &&
+				!m_win->isShaded()) {
+			first->setTabWidth(Fluxbox::instance()->getTabHeight());
+			first->setTabHeight(Fluxbox::instance()->getTabWidth());
+		} else {
+			first->setTabWidth(Fluxbox::instance()->getTabWidth());
+			first->setTabHeight(Fluxbox::instance()->getTabHeight());
+		}
+		//TODO: do I have to set this all the time?
+		first->m_configured = true; //used in Fluxbox::reconfigure()
+	}
+}
+
+//------------- calcRelativeWidth --------
+// Returns: Calculated width for relative 
+// alignment
+//----------------------------------------
+unsigned int Tab::calcRelativeWidth() {
+	unsigned int num=0;
+	//calculate num objs in list (extract this to a function?)
+	for (Tab *first=getFirst(this); first!=0; first=first->m_next, num++);	
+
+	return ((m_win->frame.width + m_win->screen->getBorderWidth2x())/num);
+}
+
+//------------- calcRelativeHeight -------
+// Returns: Calculated height for relative 
+// alignment
+//----------------------------------------
+unsigned int Tab::calcRelativeHeight() {
+	unsigned int num=0;
+	//calculate num objs in list (extract this to a function?)
+	for (Tab *first=getFirst(this); first!=0; first=first->m_next, num++);	
+
+	return ((m_win->frame.height + m_win->screen->getBorderWidth2x())/num);
+}
+
+//------------- calcCenterXPos -----------
+// Returns: Calculated x position for 
+// centered alignment
+//----------------------------------------
+unsigned int Tab::calcCenterXPos() {
+	unsigned int num=0;
+	//calculate num objs in list (extract this to a function?)
+	for (Tab *first=getFirst(this); first!=0; first=first->m_next, num++);	
+
+	return (m_win->frame.x + ((m_win->frame.width - (m_size_w * num)) / 2));
+}
+
+//------------- calcCenterYPos -----------
+// Returns: Calculated y position for 
+// centered alignment
+//----------------------------------------
+unsigned int Tab::calcCenterYPos() {
+	unsigned int num=0;
+	//calculate num objs in list (extract this to a function?)
+	for (Tab *first=getFirst(this); first!=0; first=first->m_next, num++);	
+
+	return (m_win->frame.y + ((m_win->frame.height - (m_size_h * num)) / 2));
+}
+
+
+//------- getTabPlacementString ----------
+// Returns the tabplacement string of the 
+// tabplacement number on success else
+// 0.
+//----------------------------------------
+const char *Tab::getTabPlacementString(int placement) {	
+	for (int i=0; i<(pnone / 5); i++) {
+		if (m_tabplacementlist[i] == placement)
+			return m_tabplacementlist[i].string;
+	}
+	return 0;
+}
+
+//------- getTabPlacementNum -------------
+// Returns the tabplacement number of the 
+// tabplacement string on success else
+// the type none on failure.
+//----------------------------------------
+int Tab::getTabPlacementNum(const char *string) {
+	for (int i=0; i<(pnone / 5); i ++) {
+		if (m_tabplacementlist[i] == string) {
+			return m_tabplacementlist[i].tp;
+		}
+	}
+	return pnone;
+}
+
+//------- getTabAlignmentString ----------
+// Returns the tabplacement string of the 
+// tabplacement number on success else
+// 0.
+//----------------------------------------
+const char *Tab::getTabAlignmentString(int placement) {	
+	for (int i=0; i
+#endif // HAVE_CTYPE_H
+
+#include "Theme.hh"
+#include "i18n.hh"
+#include "Basemenu.hh"
+#include "fluxbox.hh"
+
+#include 
+#include 
+#include 
+#include 
+
+#ifndef	 FONT_ELEMENT_SIZE
+#	define	 FONT_ELEMENT_SIZE 50
+#endif // FONT_ELEMENT_SIZE
+
+#ifndef HAVE_STRCASESTR 
+
+const char * strcasestr(const char *str, const char *ptn) {
+	const char *s2, *p2;
+	for( ; *str; str++) {
+		for(s2=str,p2=ptn; ; s2++,p2++) {
+			if (!*p2) return str;
+			if (toupper(*s2) != toupper(*p2)) break;
+		}
+	}
+	return NULL;
+}
+
+#endif
+
+Theme::Theme(Display *display, Colormap colormap, int screennum, BImageControl *ic, const char *filename) {
+
+	Window rootwindow = DefaultRootWindow(display);
+	m_screennum = screennum;
+	m_display = display;
+	m_imagecontrol = ic;
+	m_colormap = colormap;
+	//default settings	
+	m_menustyle.titlefont.set = m_menustyle.framefont.set = m_toolbarstyle.font.set =
+		m_windowstyle.font.set = m_windowstyle.tab.font.set =  0;
+	
+	m_menustyle.titlefont.fontstruct = m_menustyle.framefont.fontstruct = m_toolbarstyle.font.fontstruct =
+		m_windowstyle.font.fontstruct = m_windowstyle.tab.font.fontstruct = 0;
+	m_windowstyle.tab.rot_font = 0;
+		
+	load(filename);
+	//-------- create gc for the styles ------------
+	
+	
+	XGCValues gcv;
+	unsigned long gc_value_mask = GCForeground;
+
+	if (! I18n::instance()->multibyte())
+		gc_value_mask |= GCFont;
+
+	gcv.foreground = WhitePixel(m_display, screennum)^BlackPixel(m_display, screennum);
+	gcv.function = GXxor;
+	gcv.subwindow_mode = IncludeInferiors;
+	m_opgc = XCreateGC(m_display, rootwindow,
+									 GCForeground | GCFunction | GCSubwindowMode, &gcv);
+
+	gcv.foreground = m_windowstyle.l_text_focus.getPixel();
+	if (m_windowstyle.font.fontstruct)
+		gcv.font = m_windowstyle.font.fontstruct->fid;
+		
+	m_windowstyle.l_text_focus_gc =
+		XCreateGC(m_display, rootwindow,
+				gc_value_mask, &gcv);
+	
+	gcv.foreground = m_windowstyle.l_text_unfocus.getPixel();
+	if (m_windowstyle.font.fontstruct)
+		gcv.font = m_windowstyle.font.fontstruct->fid;
+	m_windowstyle.l_text_unfocus_gc =
+		XCreateGC(m_display, rootwindow,
+				gc_value_mask, &gcv);
+	
+	//---- Tab 
+	gcv.foreground = m_windowstyle.tab.l_text_focus.getPixel();
+	if (m_windowstyle.tab.font.fontstruct)
+		gcv.font = m_windowstyle.tab.font.fontstruct->fid;
+	
+	m_windowstyle.tab.l_text_focus_gc =
+		XCreateGC(m_display, rootwindow,
+				gc_value_mask, &gcv);
+	
+	gcv.foreground = m_windowstyle.tab.l_text_unfocus.getPixel();
+	m_windowstyle.tab.l_text_unfocus_gc =
+		XCreateGC(m_display, rootwindow,
+				gc_value_mask, &gcv);
+	
+	//---end Tab			
+	
+				
+	gcv.foreground = m_windowstyle.b_pic_focus.getPixel();
+	m_windowstyle.b_pic_focus_gc =
+		XCreateGC(m_display, rootwindow,
+				GCForeground, &gcv);
+
+	gcv.foreground = m_windowstyle.b_pic_unfocus.getPixel();
+	m_windowstyle.b_pic_unfocus_gc =
+		XCreateGC(m_display, rootwindow,
+				GCForeground, &gcv);
+
+	gcv.foreground = m_menustyle.t_text.getPixel();
+	if (m_menustyle.titlefont.fontstruct)
+		gcv.font = m_menustyle.titlefont.fontstruct->fid;
+	m_menustyle.t_text_gc =
+		XCreateGC(m_display, rootwindow,
+				gc_value_mask, &gcv);
+
+	gcv.foreground = m_menustyle.f_text.getPixel();
+	if (m_menustyle.framefont.fontstruct)
+		gcv.font = m_menustyle.framefont.fontstruct->fid;
+
+	m_menustyle.f_text_gc =
+		XCreateGC(m_display, rootwindow,
+				gc_value_mask, &gcv);
+
+	gcv.foreground = m_menustyle.h_text.getPixel();
+	m_menustyle.h_text_gc =
+		XCreateGC(m_display, rootwindow,
+				gc_value_mask, &gcv);
+
+	gcv.foreground = m_menustyle.d_text.getPixel();
+	m_menustyle.d_text_gc =
+		XCreateGC(m_display, rootwindow,
+				gc_value_mask, &gcv);
+
+	gcv.foreground = m_menustyle.hilite.getColor()->getPixel();
+	m_menustyle.hilite_gc =
+		XCreateGC(m_display, rootwindow,
+				gc_value_mask, &gcv);
+
+	gcv.foreground = m_toolbarstyle.l_text.getPixel();
+	if (m_toolbarstyle.font.fontstruct)
+		gcv.font = m_toolbarstyle.font.fontstruct->fid;
+	m_toolbarstyle.l_text_gc =
+		XCreateGC(m_display, rootwindow,
+				gc_value_mask, &gcv);
+
+	gcv.foreground = m_toolbarstyle.w_text.getPixel();
+	m_toolbarstyle.w_text_gc =
+		XCreateGC(m_display, rootwindow,
+				gc_value_mask, &gcv);
+
+	gcv.foreground = m_toolbarstyle.c_text.getPixel();
+	m_toolbarstyle.c_text_gc =
+		XCreateGC(m_display, rootwindow,
+				gc_value_mask, &gcv);
+
+	gcv.foreground = m_toolbarstyle.b_pic.getPixel();
+	m_toolbarstyle.b_pic_gc =
+		XCreateGC(m_display, rootwindow,
+				gc_value_mask, &gcv);
+	
+}
+
+Theme::~Theme() {
+
+	freeMenuStyle();
+	freeWindowStyle();
+	freeToolbarStyle();
+	freeTabStyle();
+}
+
+//----- freeMenuStyle -----
+// free memory allocated for m_menustyle
+// should only be called from ~Theme
+//--------------------
+void Theme::freeMenuStyle() {
+	if (m_menustyle.titlefont.set)
+		XFreeFontSet(m_display, m_menustyle.titlefont.set);
+	
+	if (m_menustyle.titlefont.fontstruct)
+		XFreeFont(m_display, m_menustyle.titlefont.fontstruct);
+		
+	if (m_menustyle.framefont.set)
+		XFreeFontSet(m_display, m_menustyle.framefont.set);
+	
+	if (m_menustyle.framefont.fontstruct)
+		XFreeFont(m_display, m_menustyle.framefont.fontstruct);
+		
+	XFreeGC(m_display, m_menustyle.t_text_gc);
+	XFreeGC(m_display, m_menustyle.f_text_gc);
+	XFreeGC(m_display, m_menustyle.h_text_gc);
+	XFreeGC(m_display, m_menustyle.d_text_gc);
+	XFreeGC(m_display, m_menustyle.hilite_gc);
+}
+
+//----- freeWindowStyle -----
+// free memory allocated for m_windowstyle
+// should only be called from ~Theme
+//--------------------
+void Theme::freeWindowStyle() {
+	if (m_windowstyle.font.set)
+		XFreeFontSet(m_display, m_windowstyle.font.set);
+	
+	if (m_windowstyle.font.fontstruct)
+		XFreeFont(m_display, m_windowstyle.font.fontstruct);	
+		
+	XFreeGC(m_display, m_windowstyle.l_text_focus_gc);
+	XFreeGC(m_display, m_windowstyle.l_text_unfocus_gc);
+	XFreeGC(m_display, m_windowstyle.b_pic_focus_gc);
+	XFreeGC(m_display, m_windowstyle.b_pic_unfocus_gc);
+}
+
+//----- freeTabStyle -----
+// free memory allocated for m_windowstyle.tab
+// should only be called from ~Theme
+//--------------------
+void Theme::freeTabStyle() {	
+	
+	if (m_windowstyle.tab.font.set)
+		XFreeFontSet(m_display, m_windowstyle.tab.font.set);
+		
+	if (m_windowstyle.tab.font.fontstruct)
+		XFreeFont(m_display, m_windowstyle.tab.font.fontstruct);
+
+	if (m_windowstyle.tab.rot_font)
+		XRotUnloadFont(m_display, m_windowstyle.tab.rot_font);
+
+	
+	XFreeGC(m_display, m_windowstyle.tab.l_text_focus_gc);
+	XFreeGC(m_display, m_windowstyle.tab.l_text_unfocus_gc);			
+}
+
+//----- freeToolbarStyle -----
+// free memory allocated for m_toolbarstyle
+// should only be called from ~Theme
+//--------------------
+void Theme::freeToolbarStyle() {
+	
+	if (m_toolbarstyle.font.set)
+		XFreeFontSet(m_display, m_toolbarstyle.font.set);
+
+	if (m_toolbarstyle.font.fontstruct)
+		XFreeFont(m_display, m_toolbarstyle.font.fontstruct);
+
+	XFreeGC(m_display, m_toolbarstyle.l_text_gc);
+	XFreeGC(m_display, m_toolbarstyle.w_text_gc);
+	XFreeGC(m_display, m_toolbarstyle.c_text_gc);
+	XFreeGC(m_display, m_toolbarstyle.b_pic_gc);
+	
+}
+
+//---------- load ------------
+// Loads a theme from a file
+//----------------------------
+void Theme::load(const char *filename) {
+	m_database = XrmGetFileDatabase(filename);
+	if (!m_database)
+		m_database = XrmGetFileDatabase(DEFAULTSTYLE);
+		
+	loadMenuStyle();	
+	loadToolbarStyle();
+	loadWindowStyle();
+	loadRootCommand();
+	loadTabStyle();
+	loadMisc();
+	
+	XrmDestroyDatabase(m_database);
+}
+
+void Theme::loadMenuStyle() {
+	
+	readDatabaseTexture("menu.title", "Menu.Title",
+					&m_menustyle.title,
+					WhitePixel(m_display, m_screennum));
+	readDatabaseTexture("menu.frame", "Menu.Frame",
+					&m_menustyle.frame,
+					BlackPixel(m_display, m_screennum));
+	readDatabaseTexture("menu.hilite", "Menu.Hilite",
+					&m_menustyle.hilite,
+					WhitePixel(m_display, m_screennum));
+	readDatabaseColor("menu.title.textColor", "Menu.Title.TextColor",
+				&m_menustyle.t_text,
+				BlackPixel(m_display, m_screennum));
+	readDatabaseColor("menu.frame.textColor", "Menu.Frame.TextColor",
+				&m_menustyle.f_text,
+				WhitePixel(m_display, m_screennum));
+	readDatabaseColor("menu.frame.disableColor", "Menu.Frame.DisableColor",
+				&m_menustyle.d_text,
+				BlackPixel(m_display, m_screennum));
+	readDatabaseColor("menu.hilite.textColor", "Menu.Hilite.TextColor",
+				&m_menustyle.h_text,
+				BlackPixel(m_display, m_screennum));
+
+	XrmValue value;
+	char *value_type=0;
+	
+	if (XrmGetResource(m_database, "menu.title.justify",
+				 "Menu.Title.Justify", &value_type, &value)) {
+				 
+		if (strstr(value.addr, "right") || strstr(value.addr, "Right"))
+			m_menustyle.titlefont.justify = FFont::Right;
+		else if (strstr(value.addr, "center") || strstr(value.addr, "Center"))
+			m_menustyle.titlefont.justify = FFont::Center;
+		else
+			m_menustyle.titlefont.justify = FFont::Left;
+			
+	} else
+		m_menustyle.titlefont.justify = FFont::Left;
+
+	if (XrmGetResource(m_database, "menu.frame.justify",
+				 "Menu.Frame.Justify", &value_type, &value)) {
+		
+		if (strstr(value.addr, "right") || strstr(value.addr, "Right"))
+			m_menustyle.framefont.justify = FFont::Right;
+		else if (strstr(value.addr, "center") || strstr(value.addr, "Center"))
+			m_menustyle.framefont.justify = FFont::Center;
+		else
+			m_menustyle.framefont.justify = FFont::Left;
+			
+	} else
+		m_menustyle.framefont.justify = FFont::Left;
+
+	if (XrmGetResource(m_database, "menu.bullet", "Menu.Bullet",
+										 &value_type, &value)) {
+		
+		if (! strncasecmp(value.addr, "empty", value.size))
+			m_menustyle.bullet = Basemenu::Empty;
+		else if (! strncasecmp(value.addr, "square", value.size))
+			m_menustyle.bullet = Basemenu::Square;
+		else if (! strncasecmp(value.addr, "diamond", value.size))
+			m_menustyle.bullet = Basemenu::Diamond;
+		else
+			m_menustyle.bullet = Basemenu::Triangle;
+			
+	} else
+		m_menustyle.bullet = Basemenu::Triangle;
+
+	if (XrmGetResource(m_database, "menu.bullet.position",
+										 "Menu.Bullet.Position", &value_type, &value)) {
+
+		if (! strncasecmp(value.addr, "right", value.size))
+			m_menustyle.bullet_pos = Basemenu::Right;
+		else
+			m_menustyle.bullet_pos = Basemenu::Left;
+			
+	} else
+		m_menustyle.bullet_pos = Basemenu::Left;
+
+	//---------- font
+
+	if (I18n::instance()->multibyte()) {
+		
+		readDatabaseFontSet("menu.title.font", "Menu.Title.Font",
+			&m_menustyle.titlefont.set);					
+		readDatabaseFontSet("menu.frame.font", "Menu.Frame.Font",
+			&m_menustyle.framefont.set);
+
+		m_menustyle.titlefont.set_extents =
+				XExtentsOfFontSet(m_menustyle.titlefont.set);
+		m_menustyle.framefont.set_extents =
+			XExtentsOfFontSet(m_menustyle.framefont.set);	
+			
+	} else {
+		
+		readDatabaseFont("menu.title.font", "Menu.Title.Font",
+				&m_menustyle.titlefont.fontstruct);			
+		
+		readDatabaseFont("menu.frame.font", "Menu.Frame.Font",
+				&m_menustyle.framefont.fontstruct);
+	}
+	
+}
+
+void Theme::loadWindowStyle() {
+	
+	readDatabaseTexture("window.title.focus", "Window.Title.Focus",
+					&m_windowstyle.t_focus,
+					WhitePixel(m_display,
+				 m_screennum));
+	readDatabaseTexture("window.title.unfocus", "Window.Title.Unfocus",
+					&m_windowstyle.t_unfocus,
+					BlackPixel(m_display, m_screennum));
+	readDatabaseTexture("window.label.focus", "Window.Label.Focus",
+					&m_windowstyle.l_focus,
+					WhitePixel(m_display, m_screennum));
+		
+	readDatabaseTexture("window.label.unfocus", "Window.Label.Unfocus",
+					&m_windowstyle.l_unfocus,
+					BlackPixel(m_display, m_screennum));
+
+	
+	readDatabaseTexture("window.handle.focus", "Window.Handle.Focus",
+				&m_windowstyle.h_focus,
+				WhitePixel(m_display, m_screennum));
+	readDatabaseTexture("window.handle.unfocus", "Window.Handle.Unfocus",
+				&m_windowstyle.h_unfocus,
+				BlackPixel(m_display, m_screennum));
+	readDatabaseTexture("window.grip.focus", "Window.Grip.Focus",
+				&m_windowstyle.g_focus,
+				WhitePixel(m_display, m_screennum));
+	readDatabaseTexture("window.grip.unfocus", "Window.Grip.Unfocus",
+				&m_windowstyle.g_unfocus,
+				BlackPixel(m_display, m_screennum));
+	readDatabaseTexture("window.button.focus", "Window.Button.Focus",
+				&m_windowstyle.b_focus,
+				WhitePixel(m_display, m_screennum));
+	readDatabaseTexture("window.button.unfocus", "Window.Button.Unfocus",
+				&m_windowstyle.b_unfocus,
+				BlackPixel(m_display, m_screennum));
+	readDatabaseTexture("window.button.pressed", "Window.Button.Pressed",
+				&m_windowstyle.b_pressed,
+				BlackPixel(m_display, m_screennum));
+	readDatabaseColor("window.frame.focusColor",
+				"Window.Frame.FocusColor",
+				&m_windowstyle.f_focus,
+				WhitePixel(m_display, m_screennum));
+	readDatabaseColor("window.frame.unfocusColor",
+				"Window.Frame.UnfocusColor",
+				&m_windowstyle.f_unfocus,
+				BlackPixel(m_display, m_screennum));
+	readDatabaseColor("window.label.focus.textColor",
+				"Window.Label.Focus.TextColor",
+				&m_windowstyle.l_text_focus,
+				BlackPixel(m_display, m_screennum));
+	readDatabaseColor("window.label.unfocus.textColor",
+				"Window.Label.Unfocus.TextColor",
+				&m_windowstyle.l_text_unfocus,
+				WhitePixel(m_display, m_screennum));	
+	readDatabaseColor("window.button.focus.picColor",
+				"Window.Button.Focus.PicColor",
+				&m_windowstyle.b_pic_focus,
+				BlackPixel(m_display, m_screennum));
+	readDatabaseColor("window.button.unfocus.picColor",
+				"Window.Button.Unfocus.PicColor",
+				&m_windowstyle.b_pic_unfocus,
+				WhitePixel(m_display, m_screennum));
+
+	//----- font
+	
+	if (I18n::instance()->multibyte()) {
+		readDatabaseFontSet("window.font", "Window.Font",
+			&m_windowstyle.font.set);	
+			
+		m_windowstyle.font.set_extents =
+			XExtentsOfFontSet(m_windowstyle.font.set);
+	} else {
+		readDatabaseFont("window.font", "Window.Font",
+					&m_windowstyle.font.fontstruct);
+	}
+	
+	XrmValue value;
+	char *value_type;
+	
+	if (XrmGetResource(m_database, "window.justify", "Window.Justify",
+				 &value_type, &value)) {
+		if (strstr(value.addr, "right") || strstr(value.addr, "Right"))
+			m_windowstyle.font.justify = FFont::Right;
+		else if (strstr(value.addr, "center") || strstr(value.addr, "Center"))
+			m_windowstyle.font.justify = FFont::Center;
+		else
+			m_windowstyle.font.justify = FFont::Left;
+	} else
+		m_windowstyle.font.justify = FFont::Left;
+		
+}
+
+void Theme::loadTabStyle() {
+	
+	if (!readDatabaseTexture("window.tab.title.focus", "Window.Tab.Title.Focus",
+					&m_windowstyle.tab.t_focus,
+					WhitePixel(m_display, m_screennum)))
+		m_windowstyle.tab.t_focus = m_windowstyle.t_focus;
+		
+	if (!readDatabaseTexture("window.tab.title.unfocus", "Window.Tab.Title.Unfocus",
+					&m_windowstyle.tab.t_unfocus,
+					BlackPixel(m_display, m_screennum)))
+		m_windowstyle.tab.t_unfocus = m_windowstyle.t_unfocus;
+	
+	if (!readDatabaseTexture("window.tab.label.focus", "Window.Tab.Label.Focus",
+					&m_windowstyle.tab.l_focus,
+					WhitePixel(m_display, m_screennum)))
+		m_windowstyle.tab.l_focus	= m_windowstyle.l_focus;
+		
+	if (!readDatabaseTexture("window.tab.label.unfocus", "Window.Tab.Label.Unfocus",
+					&m_windowstyle.tab.l_unfocus,
+					BlackPixel(m_display, m_screennum)))
+		m_windowstyle.tab.l_unfocus = m_windowstyle.l_unfocus;
+		
+
+	if (!readDatabaseColor("window.tab.label.focus.textColor",
+				"Window.Tab.Label.Focus.TextColor",
+				&m_windowstyle.tab.l_text_focus,
+				BlackPixel(m_display, m_screennum)))
+		m_windowstyle.tab.l_text_focus = m_windowstyle.l_text_focus;
+		
+	if (!readDatabaseColor("window.tab.label.unfocus.textColor",
+				"Window.Tab.Label.Unfocus.TextColor",
+				&m_windowstyle.tab.l_text_unfocus,
+				WhitePixel(m_display, m_screennum)))
+		m_windowstyle.tab.l_text_unfocus = m_windowstyle.l_text_unfocus;
+	
+	readDatabaseColor("window.tab.borderColor", "Window.Tab.BorderColor", 
+			&m_windowstyle.tab.border_color,	
+				BlackPixel(m_display, m_screennum));
+	
+	
+	XrmValue value;
+	char *value_type;
+	
+	if (XrmGetResource(m_database, "window.tab.borderWidth", "Window.Tab.BorderWidth",
+										 &value_type, &value)) {
+		if (sscanf(value.addr, "%u", &m_windowstyle.tab.border_width) != 1)
+			m_windowstyle.tab.border_width = 1;
+	} else
+		m_windowstyle.tab.border_width = 1;
+	m_windowstyle.tab.border_width_2x = m_windowstyle.tab.border_width*2;
+	
+	//---------- font
+	
+	if (I18n::instance()->multibyte()) {
+		readDatabaseFontSet("window.tab.font", "Window.Tab.Font",
+			&m_windowstyle.tab.font.set);
+		
+		m_windowstyle.tab.font.set_extents =
+			XExtentsOfFontSet(m_windowstyle.tab.font.set);
+	} else {
+		XFontStruct *fontstruct = 0;
+		readDatabaseFont("window.tab.font", "Window.Tab.Font",
+				&fontstruct);
+		m_windowstyle.tab.font.fontstruct = fontstruct;
+	}
+	
+	//--------- rotated font for left and right tabs
+
+	// TODO: add extra checking
+	if (XrmGetResource(m_database, "window.tab.font", "Window.Tab.Font",
+			&value_type, &value)) {		
+		if (! (m_windowstyle.tab.rot_font = XRotLoadFont(m_display, value.addr, 90.0)) )
+			m_windowstyle.tab.rot_font = XRotLoadFont(m_display, "fixed", 90);
+	} else
+		m_windowstyle.tab.rot_font = XRotLoadFont(m_display, "fixed", 90);
+
+
+	if (XrmGetResource(m_database, "window.tab.justify", "Window.Tab.Justify",
+			 &value_type, &value)) {
+		if (strstr(value.addr, "right") || strstr(value.addr, "Right"))
+			m_windowstyle.tab.font.justify = FFont::Right;
+		else if (strstr(value.addr, "center") || strstr(value.addr, "Center"))
+			m_windowstyle.tab.font.justify = FFont::Center;
+		else
+			m_windowstyle.tab.font.justify = FFont::Left;
+	} else
+		m_windowstyle.tab.font.justify = FFont::Left;
+		
+}
+
+void Theme::loadToolbarStyle() {
+
+	readDatabaseTexture("toolbar", "Toolbar",
+					&m_toolbarstyle.toolbar,
+					BlackPixel(m_display, m_screennum));
+	readDatabaseTexture("toolbar.label", "Toolbar.Label",
+					&m_toolbarstyle.label,
+					BlackPixel(m_display, m_screennum));
+	readDatabaseTexture("toolbar.windowLabel", "Toolbar.WindowLabel",
+					&m_toolbarstyle.window,
+					BlackPixel(m_display, m_screennum));
+	readDatabaseTexture("toolbar.button", "Toolbar.Button",
+					&m_toolbarstyle.button,
+					WhitePixel(m_display, m_screennum));
+	readDatabaseTexture("toolbar.button.pressed", "Toolbar.Button.Pressed",
+					&m_toolbarstyle.pressed,
+					BlackPixel(m_display, m_screennum));
+	readDatabaseTexture("toolbar.clock", "Toolbar.Clock",
+					&m_toolbarstyle.clock,
+					BlackPixel(m_display, m_screennum));
+	readDatabaseColor("toolbar.label.textColor", "Toolbar.Label.TextColor",
+				&m_toolbarstyle.l_text,
+				WhitePixel(m_display, m_screennum));
+	readDatabaseColor("toolbar.windowLabel.textColor",
+				"Toolbar.WindowLabel.TextColor",
+				&m_toolbarstyle.w_text,
+				WhitePixel(m_display, m_screennum));
+	readDatabaseColor("toolbar.clock.textColor", "Toolbar.Clock.TextColor",
+				&m_toolbarstyle.c_text,
+				WhitePixel(m_display, m_screennum));
+	readDatabaseColor("toolbar.button.picColor", "Toolbar.Button.PicColor",
+				&m_toolbarstyle.b_pic,
+				BlackPixel(m_display, m_screennum));
+
+	
+	// ----------- load font
+	
+	if (I18n::instance()->multibyte()) {
+		readDatabaseFontSet("toolbar.font", "Toolbar.Font",
+				&m_toolbarstyle.font.set);
+				
+		m_toolbarstyle.font.set_extents =
+			XExtentsOfFontSet(m_toolbarstyle.font.set);
+	} else {
+		readDatabaseFont("toolbar.font", "Toolbar.Font",
+				&m_toolbarstyle.font.fontstruct);
+	}
+	XrmValue value;
+	char *value_type;
+
+	if (XrmGetResource(m_database, "toolbar.justify",
+				 "Toolbar.Justify", &value_type, &value)) {
+		if (strstr(value.addr, "right") || strstr(value.addr, "Right"))
+			m_toolbarstyle.font.justify = FFont::Right;
+		else if (strstr(value.addr, "center") || strstr(value.addr, "Center"))
+			m_toolbarstyle.font.justify = FFont::Center;
+		else
+			m_toolbarstyle.font.justify = FFont::Left;
+	} else
+		m_toolbarstyle.font.justify = FFont::Left;
+
+}
+
+void Theme::loadRootCommand() {
+	XrmValue value;
+	char *value_type;
+ Fluxbox *fb=Fluxbox::instance();
+// printf("getting root command from fb->getRootCommand()");
+ const char *root_cmd=fb->getRootCommand();
+// printf("root kommandot: %s\n", root_cmd);
+	if (root_cmd) {
+		#ifndef         __EMX__
+		const int display_strlen = 1024;
+		char displaystring[display_strlen];
+		snprintf(displaystring, display_strlen, "DISPLAY=%s%d",
+		DisplayString(m_display), m_screennum);
+ 
+		bexec(root_cmd, displaystring);
+		#else //         __EMX__
+		spawnlp(P_NOWAIT, "cmd.exe", "cmd.exe", "/c", root_cmd, NULL);  
+		#endif // !__EMX__     
+		
+		#ifdef DEBUG
+    fprintf(stderr, "rootcommand:%s\n", root_cmd);
+  	#endif //!DEBUG
+	
+	} else if (XrmGetResource(m_database, "rootCommand",
+										 "RootCommand", &value_type, &value)) {
+#ifndef		__EMX__
+		const int display_strlen = 1024;
+		char displaystring[display_strlen];
+		
+		snprintf(displaystring, display_strlen, "DISPLAY=%s%d", 
+			DisplayString(m_display), m_screennum);	
+			
+		bexec(value.addr, displaystring);
+#else //	 __EMX__
+		spawnlp(P_NOWAIT, "cmd.exe", "cmd.exe", "/c", value.addr, NULL);
+#endif // !__EMX__
+	#ifdef DEBUG
+		fprintf(stderr, "rootcommand:%s\n", value.addr); 
+	#endif 	
+	}
+#ifdef DEBUG
+	else
+		fprintf(stderr, "%s(%d) Didnt find rootCommand!\n", __FILE__, __LINE__);
+#endif	
+
+}
+
+void Theme::loadMisc(void) {
+	unsigned int screen_width_div2 = WidthOfScreen(ScreenOfDisplay(m_display, m_screennum)) / 2;
+	XrmValue value;
+	char *value_type=0;
+	
+	if (XrmGetResource(m_database, "bevelWidth", "BevelWidth",
+										 &value_type, &value)) {
+		if (sscanf(value.addr, "%u", &m_bevel_width) != 1 ||
+				m_bevel_width >  screen_width_div2 || 
+				m_bevel_width == 0)
+			m_bevel_width = 3;
+	} else
+		m_bevel_width = 3;
+
+	if (XrmGetResource(m_database, "handleWidth", "HandleWidth",
+										 &value_type, &value)) {
+		if (sscanf(value.addr, "%u", &m_handle_width) != 1 ||
+			m_handle_width > screen_width_div2 || m_handle_width == 0)
+			m_handle_width = 6;
+	} else
+		m_handle_width = 6;
+
+	if (XrmGetResource(m_database, "borderWidth", "BorderWidth",
+										 &value_type, &value)) {
+		if (sscanf(value.addr, "%u", &m_border_width) != 1)
+			m_border_width = 1;
+	} else
+		m_border_width = 1;
+	
+	
+	if (XrmGetResource(m_database, "frameWidth", "FrameWidth",
+										 &value_type, &value)) {
+		if (sscanf(value.addr, "%u", &m_frame_width) != 1 ||
+				m_frame_width > screen_width_div2)
+			m_frame_width = m_bevel_width;
+	} else
+		m_frame_width = m_bevel_width;
+
+	readDatabaseColor("borderColor", "BorderColor", &m_border_color,
+				BlackPixel(m_display, m_screennum));		
+}
+
+
+bool Theme::readDatabaseTexture(char *rname, char *rclass,
+					BTexture *texture,
+					unsigned long default_pixel)
+{
+	XrmValue value;
+	char *value_type;
+	bool retval = true;//return true as default
+	
+	if (XrmGetResource(m_database, rname, rclass, &value_type,
+				 &value))
+		m_imagecontrol->parseTexture(texture, value.addr);
+	else
+		texture->setTexture(BImage_Solid | BImage_Flat);
+
+	if (texture->getTexture() & BImage_Solid) {
+		int clen = strlen(rclass) + 32, nlen = strlen(rname) + 32;
+
+		char *colorclass = new char[clen], *colorname = new char[nlen];
+
+		sprintf(colorclass, "%s.Color", rclass);
+		sprintf(colorname,	"%s.color", rname);
+		
+		if (!readDatabaseColor(colorname, colorclass, texture->getColor(),
+					default_pixel))
+				retval = false;
+
+#ifdef		INTERLACE
+		sprintf(colorclass, "%s.ColorTo", rclass);
+		sprintf(colorname,	"%s.colorTo", rname);
+
+		readDatabaseColor(colorname, colorclass, texture->getColorTo(),
+											default_pixel);
+#endif // INTERLACE
+
+		delete [] colorclass;
+		delete [] colorname;
+
+		if ((! texture->getColor()->isAllocated()) ||
+				(texture->getTexture() & BImage_Flat))
+			return retval;
+
+		XColor xcol;
+
+		xcol.red = (unsigned int) (texture->getColor()->getRed() +
+						 (texture->getColor()->getRed() >> 1));
+		if (xcol.red >= 0xff) xcol.red = 0xffff;
+		else xcol.red *= 0xff;
+		xcol.green = (unsigned int) (texture->getColor()->getGreen() +
+				 (texture->getColor()->getGreen() >> 1));
+		if (xcol.green >= 0xff) xcol.green = 0xffff;
+		else xcol.green *= 0xff;
+		xcol.blue = (unsigned int) (texture->getColor()->getBlue() +
+				(texture->getColor()->getBlue() >> 1));
+		if (xcol.blue >= 0xff) xcol.blue = 0xffff;
+		else xcol.blue *= 0xff;
+
+		if (! XAllocColor(m_display, m_colormap, &xcol))
+			xcol.pixel = 0;
+
+		texture->getHiColor()->setPixel(xcol.pixel);
+
+		xcol.red =
+			(unsigned int) ((texture->getColor()->getRed() >> 2) +
+					(texture->getColor()->getRed() >> 1)) * 0xff;
+		xcol.green =
+			(unsigned int) ((texture->getColor()->getGreen() >> 2) +
+					(texture->getColor()->getGreen() >> 1)) * 0xff;
+		xcol.blue =
+			(unsigned int) ((texture->getColor()->getBlue() >> 2) +
+					(texture->getColor()->getBlue() >> 1)) * 0xff;
+
+		if (! XAllocColor(m_display, m_colormap, &xcol))
+			xcol.pixel = 0;
+
+		texture->getLoColor()->setPixel(xcol.pixel);
+	} else if (texture->getTexture() & BImage_Gradient) {
+		int clen = strlen(rclass) + 10, nlen = strlen(rname) + 10;
+
+		char *colorclass = new char[clen], *colorname = new char[nlen],
+			*colortoclass = new char[clen], *colortoname = new char[nlen];
+
+		sprintf(colorclass, "%s.Color", rclass);
+		sprintf(colorname,	"%s.color", rname);
+
+		sprintf(colortoclass, "%s.ColorTo", rclass);
+		sprintf(colortoname,	"%s.colorTo", rname);
+
+		if (!readDatabaseColor(colorname, colorclass, texture->getColor(),
+					default_pixel))
+				retval = false;	//report failure in loading
+				
+		readDatabaseColor(colortoname, colortoclass, texture->getColorTo(),
+					default_pixel);
+
+		delete [] colorclass;
+		delete [] colorname;
+		delete [] colortoclass;
+		delete [] colortoname;
+	}
+
+	if (!retval)
+		fprintf(stderr, "Faild in readTexture\n");
+	
+	return retval;
+}
+
+
+bool Theme::readDatabaseColor(char *rname, char *rclass, BColor *color,
+				unsigned long default_pixel)
+{
+	XrmValue value;
+	char *value_type;
+
+	if (XrmGetResource(m_database, rname, rclass, &value_type,
+				 &value)) {
+		m_imagecontrol->parseColor(color, value.addr);
+	} else {
+		// parsing with no color string just deallocates the color, if it has
+		// been previously allocated
+		m_imagecontrol->parseColor(color);
+		color->setPixel(default_pixel);
+		return false; 
+	}
+
+	return true;
+}
+
+
+void Theme::readDatabaseFontSet(char *rname, char *rclass, XFontSet *fontset) {
+	if (! fontset) return;
+
+	static char *defaultFont = "fixed";
+
+	Bool load_default = False;
+	XrmValue value;
+	char *value_type;
+
+	if (*fontset)
+		XFreeFontSet(m_display, *fontset);
+
+	if (XrmGetResource(m_database, rname, rclass, &value_type, &value)) {
+		char *fontname = value.addr;
+		if (! (*fontset = createFontSet(fontname)))
+			load_default = True;
+	} else
+		load_default = True;
+
+	if (load_default) {
+		*fontset = createFontSet(defaultFont);
+
+		if (! *fontset) {
+			fprintf(stderr,
+						I18n::instance()->
+						getMessage(
+#ifdef		NLS
+						 ScreenSet, ScreenDefaultFontLoadFail,
+#else // !NLS
+						 0, 0,
+#endif // NLS
+					 "BScreen::LoadStyle(): couldn't load default font.\n"));
+			throw static_cast(2);
+		}
+	}
+}
+
+
+
+void Theme::readDatabaseFont(char *rname, char *rclass, XFontStruct **font) {
+	if (! font) return;
+
+	static char *defaultFont = "fixed";
+
+	Bool load_default = False;
+	XrmValue value;
+	char *value_type;
+
+	if (*font)
+		XFreeFont(m_display, *font);
+
+	if (XrmGetResource(m_database, rname, rclass, &value_type, &value)) {
+		
+		if ((*font = XLoadQueryFont(m_display,
+				value.addr)) == NULL) {
+			fprintf(stderr,
+				I18n::instance()->
+				getMessage(
+#ifdef		NLS
+			 ScreenSet, ScreenFontLoadFail,
+#else // !NLS
+			 0, 0,
+#endif // NLS
+			 "BScreen::LoadStyle(): couldn't load font '%s'\n"),
+				value.addr);
+
+			load_default = True;
+		}
+	} else
+		load_default = True;
+
+	if (load_default) {
+		if ((*font = XLoadQueryFont(m_display,
+				defaultFont)) == NULL) {
+			fprintf(stderr,
+				I18n::instance()->
+				getMessage(
+#ifdef		NLS
+			 ScreenSet, ScreenDefaultFontLoadFail,
+#else // !NLS
+			 0, 0,
+#endif // NLS
+						 "BScreen::LoadStyle(): couldn't load default font.\n"));
+			throw static_cast(2);
+		}
+	}
+}
+
+void Theme::reconfigure() {
+
+	//Window rootwindow = DefaultRootWindow(m_display);
+	XGCValues gcv;
+	unsigned long gc_value_mask = GCForeground;
+	if (! I18n::instance()->multibyte())
+		gc_value_mask |= GCFont;
+	
+	XChangeGC(m_display, m_opgc,
+		GCForeground | GCFunction | GCSubwindowMode, &gcv);
+		
+	gcv.foreground = WhitePixel(m_display, m_screennum);
+	gcv.function = GXinvert;
+	gcv.subwindow_mode = IncludeInferiors;
+	XChangeGC(m_display, m_opgc,
+		GCForeground | GCFunction | GCSubwindowMode, &gcv);
+
+	gcv.foreground = m_windowstyle.l_text_focus.getPixel();
+	if (m_windowstyle.font.fontstruct)
+		gcv.font = m_windowstyle.font.fontstruct->fid;
+		
+	XChangeGC(m_display, m_windowstyle.l_text_focus_gc,
+		gc_value_mask, &gcv);
+
+	gcv.foreground = m_windowstyle.l_text_unfocus.getPixel();
+	XChangeGC(m_display, m_windowstyle.l_text_unfocus_gc,
+		gc_value_mask, &gcv);
+
+	//---- Tab 
+	gcv.foreground = m_windowstyle.tab.l_text_focus.getPixel();
+	if (m_windowstyle.tab.font.fontstruct)
+		gcv.font = m_windowstyle.tab.font.fontstruct->fid;
+	
+	XChangeGC(m_display, m_windowstyle.tab.l_text_focus_gc,
+		gc_value_mask, &gcv);
+	
+	gcv.foreground = m_windowstyle.tab.l_text_unfocus.getPixel();
+	XChangeGC(m_display, m_windowstyle.tab.l_text_unfocus_gc,
+		gc_value_mask, &gcv);
+	
+	//--- end tab
+		
+	gcv.foreground = m_windowstyle.b_pic_focus.getPixel();
+	XChangeGC(m_display, m_windowstyle.b_pic_focus_gc,
+		GCForeground, &gcv);
+
+	gcv.foreground = m_windowstyle.b_pic_unfocus.getPixel();
+	XChangeGC(m_display, m_windowstyle.b_pic_unfocus_gc,
+		GCForeground, &gcv);
+
+	gcv.foreground = m_menustyle.t_text.getPixel();
+	if (m_menustyle.titlefont.fontstruct)
+		gcv.font = m_menustyle.titlefont.fontstruct->fid;
+	XChangeGC(m_display, m_menustyle.t_text_gc,
+		gc_value_mask, &gcv);
+
+	gcv.foreground = m_menustyle.f_text.getPixel();	
+	if (m_menustyle.framefont.fontstruct)
+		gcv.font = m_menustyle.framefont.fontstruct->fid;
+		
+	XChangeGC(m_display, m_menustyle.f_text_gc,
+		gc_value_mask, &gcv);
+
+	gcv.foreground = m_menustyle.h_text.getPixel();
+	XChangeGC(m_display, m_menustyle.h_text_gc,
+		gc_value_mask, &gcv);
+
+	gcv.foreground = m_menustyle.d_text.getPixel();
+	XChangeGC(m_display, m_menustyle.d_text_gc,
+		gc_value_mask, &gcv);
+
+	gcv.foreground = m_menustyle.hilite.getColor()->getPixel();
+	XChangeGC(m_display, m_menustyle.hilite_gc,
+			gc_value_mask, &gcv);
+
+	gcv.foreground = m_toolbarstyle.l_text.getPixel();
+	if (m_toolbarstyle.font.fontstruct)
+		gcv.font = m_toolbarstyle.font.fontstruct->fid;
+		
+	XChangeGC(m_display, m_toolbarstyle.l_text_gc,
+		gc_value_mask, &gcv);
+
+	gcv.foreground = m_toolbarstyle.w_text.getPixel();
+	XChangeGC(m_display, m_toolbarstyle.w_text_gc,
+		gc_value_mask, &gcv);
+
+	gcv.foreground = m_toolbarstyle.c_text.getPixel();
+	XChangeGC(m_display, m_toolbarstyle.c_text_gc,
+			gc_value_mask, &gcv);
+
+	gcv.foreground = m_toolbarstyle.b_pic.getPixel();
+	XChangeGC(m_display, m_toolbarstyle.b_pic_gc,
+			gc_value_mask, &gcv);
+			
+}
+
+XFontSet Theme::createFontSet(char *fontname) {
+	XFontSet fs;
+	char **missing, *def = "-";
+	int nmissing, pixel_size = 0, buf_size = 0;
+	char weight[FONT_ELEMENT_SIZE], slant[FONT_ELEMENT_SIZE];
+
+	fs = XCreateFontSet(m_display,
+					fontname, &missing, &nmissing, &def);
+	if (fs && (! nmissing)) return fs;
+
+#ifdef		HAVE_SETLOCALE
+	if (! fs) {
+		if (nmissing) XFreeStringList(missing);
+
+		setlocale(LC_CTYPE, "C");
+		fs = XCreateFontSet(m_display, fontname,
+			&missing, &nmissing, &def);
+		setlocale(LC_CTYPE, "");
+	}
+#endif // HAVE_SETLOCALE
+
+	if (fs) {
+		XFontStruct **fontstructs;
+		char **fontnames;
+		XFontsOfFontSet(fs, &fontstructs, &fontnames);
+		fontname = fontnames[0];
+	}
+
+	getFontElement(fontname, weight, FONT_ELEMENT_SIZE,
+		 "-medium-", "-bold-", "-demibold-", "-regular-", NULL);
+	getFontElement(fontname, slant, FONT_ELEMENT_SIZE,
+		 "-r-", "-i-", "-o-", "-ri-", "-ro-", NULL);
+	getFontSize(fontname, &pixel_size);
+
+	if (! strcmp(weight, "*")) 
+		strncpy(weight, "medium", FONT_ELEMENT_SIZE);
+	if (! strcmp(slant, "*")) 
+		strncpy(slant, "r", FONT_ELEMENT_SIZE);
+	if (pixel_size < 3) 
+		pixel_size = 3;
+	else if (pixel_size > 97) 
+		pixel_size = 97;
+
+	buf_size = strlen(fontname) + (FONT_ELEMENT_SIZE * 2) + 64;
+	char *pattern2 = new char[buf_size];
+	snprintf(pattern2, buf_size - 1,
+		 "%s,"
+		 "-*-*-%s-%s-*-*-%d-*-*-*-*-*-*-*,"
+		 "-*-*-*-*-*-*-%d-*-*-*-*-*-*-*,*",
+		 fontname, weight, slant, pixel_size, pixel_size);
+	fontname = pattern2;
+
+	if (nmissing)
+		XFreeStringList(missing);
+	if (fs)
+		XFreeFontSet(m_display, fs);
+
+	fs = XCreateFontSet(m_display, fontname,
+					&missing, &nmissing, &def);
+	delete [] pattern2;
+
+	return fs;
+}
+
+const char *Theme::getFontSize(const char *pattern, int *size) {
+	const char *p;
+	const char *p2=0;
+	int n=0;
+
+	for (p=pattern; 1; p++) {
+		if (!*p) {
+			if (p2!=NULL && n>1 && n<72) {
+				*size = n; return p2+1;
+			} else {
+				*size = 16; return NULL;
+			}
+		} else if (*p=='-') {
+			if (n>1 && n<72 && p2!=NULL) {
+				*size = n;
+				return p2+1;
+			}
+			p2=p; n=0;
+		} else if (*p>='0' && *p<='9' && p2!=NULL) {
+			n *= 10;
+			n += *p-'0';
+		} else {
+			p2=NULL; n=0;
+		}
+	}
+}
+
+const char *Theme::getFontElement(const char *pattern, char *buf, int bufsiz, ...) {
+	const char *p, *v;
+	char *p2;
+	va_list va;
+
+	va_start(va, bufsiz);
+	buf[bufsiz-1] = 0;
+	buf[bufsiz-2] = '*';
+	while((v = va_arg(va, char *)) != NULL) {
+		p = strcasestr(pattern, v);
+		if (p) {
+			strncpy(buf, p+1, bufsiz-2);
+			p2 = strchr(buf, '-');
+			if (p2) *p2=0;
+			va_end(va);
+			return p;
+		}
+	}
+	va_end(va);
+	strncpy(buf, "*", bufsiz);
+	return NULL;
+}
diff --git a/src/Theme.hh b/src/Theme.hh
new file mode 100644
index 00000000..c090a198
--- /dev/null
+++ b/src/Theme.hh
@@ -0,0 +1,162 @@
+// Theme.hh for fluxbox 
+// Copyright (c) 2001 Henrik Kinnunen (fluxgen@linuxmail.org)
+// 
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.	IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+//
+//  A lot of the base code is taken from Screen.hh in Blackbox 0.61.1
+//  and Brad Hughes (bhuges@tcac.net) should get alot of credit for it
+//  And for license-hunters here's the license and copyright for Screen.cc
+//  Screen.cc - Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+// 
+//  Permission is hereby granted, free of charge, to any person obtaining a
+//  copy of this software and associated documentation files (the "Software"),
+//  to deal in the Software without restriction, including without limitation
+//  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+//  and/or sell copies of the Software, and to permit persons to whom the
+//  Software is furnished to do so, subject to the following conditions:
+//
+//  The above copyright notice and this permission notice shall be included in
+//  all copies or substantial portions of the Software.
+//
+//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.	IN NO EVENT SHALL
+//  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+//  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+//  DEALINGS IN THE SOFTWARE.
+
+#ifndef _THEME_HH_
+#define _THEME_HH_
+
+
+#include "Image.hh"
+#include 
+#include 
+
+#include "Rotated.hh" // TODO: should bake this into misc.hh some day
+
+typedef struct FFont 
+{
+	enum FontJustify {Left=0, Right, Center};
+	
+	XFontSet set;
+	XFontSetExtents *set_extents;
+	XFontStruct *fontstruct;
+	FontJustify justify;
+} FFont;
+
+typedef struct LabelStyle
+{
+	BTexture l_focus, l_unfocus,
+		t_focus, t_unfocus;	
+	GC l_text_focus_gc, l_text_unfocus_gc;
+	FFont font;
+	BColor l_text_focus, l_text_unfocus;
+} LabelStyle;
+
+typedef struct WindowStyle:public LabelStyle {
+	BColor f_focus, f_unfocus, b_pic_focus,
+		b_pic_unfocus;
+	BTexture h_focus, h_unfocus,
+		b_focus, b_unfocus, b_pressed, g_focus, g_unfocus;
+	GC b_pic_focus_gc, b_pic_unfocus_gc;
+
+	struct t_tab:public LabelStyle {
+		BColor border_color;
+		unsigned int border_width;
+		unsigned int border_width_2x;
+		XRotFontStruct *rot_font;
+	} tab;
+	
+} WindowStyle;
+
+typedef struct ToolbarStyle {
+	BColor l_text, w_text, c_text, b_pic;
+	BTexture toolbar, label, window, button, pressed, clock;
+	GC l_text_gc, w_text_gc, c_text_gc, b_pic_gc;
+	FFont font;
+
+} ToolbarStyle;
+
+typedef struct MenuStyle {
+	BColor t_text, f_text, h_text, d_text;
+	BTexture title, frame, hilite;
+	GC t_text_gc, f_text_gc, h_text_gc, d_text_gc, hilite_gc;
+	FFont titlefont, framefont;
+	int bullet, bullet_pos;
+} MenuStyle;
+
+//singleton class
+class Theme
+{
+public:	
+	Theme(Display *display, Colormap colormap, int screennum, BImageControl *ic, const char *filename);
+	~Theme();	
+
+	void load(const char *filename);
+	void reconfigure();
+	inline WindowStyle *getWindowStyle(void) { return &m_windowstyle; }
+	inline MenuStyle *getMenuStyle(void) { return &m_menustyle; }
+	inline ToolbarStyle *getToolbarStyle(void) { return &m_toolbarstyle; }
+	inline const unsigned int & getBevelWidth(void) const { return m_bevel_width; }
+	inline const unsigned int & getBorderWidth(void) const { return m_border_width; }
+	inline const unsigned int & getHandleWidth(void) const { return m_handle_width; }
+	inline const unsigned int & getFrameWidth(void) const { return m_frame_width; }
+	inline const GC &getOpGC(void) const { return m_opgc; }
+	inline const BColor & getBorderColor(void) const { return m_border_color; }
+private:
+	
+	void loadMenuStyle();
+	void loadWindowStyle();
+	void loadTabStyle();
+	void loadToolbarStyle();	
+	void loadRootCommand();
+	void loadMisc();
+	void freeMenuStyle();
+	void freeWindowStyle();
+	void freeTabStyle();
+	void freeToolbarStyle();
+	
+	bool readDatabaseTexture(char *, char *, BTexture *, unsigned long);
+	bool readDatabaseColor(char *, char *, BColor *, unsigned long);
+
+	void readDatabaseFontSet(char *, char *, XFontSet *);
+	XFontSet createFontSet(char *);
+	void readDatabaseFont(char *, char *, XFontStruct **);
+
+	static const char *getFontElement(const char *pattern, char *buf, int bufsiz, ...);
+	static const char *getFontSize(const char *pattern, int *size);
+
+
+	WindowStyle m_windowstyle;
+	MenuStyle m_menustyle;
+	ToolbarStyle	m_toolbarstyle;
+	unsigned int m_bevel_width, m_border_width, m_handle_width, m_frame_width;
+	BColor m_border_color;
+	GC m_opgc;
+	BImageControl *m_imagecontrol;
+	Display *m_display;	 
+	XrmDatabase m_database;
+	Colormap m_colormap;
+	int m_screennum;
+};
+
+
+#endif  //_THEME_HH_
diff --git a/src/Timer.cc b/src/Timer.cc
new file mode 100644
index 00000000..f35f274f
--- /dev/null
+++ b/src/Timer.cc
@@ -0,0 +1,82 @@
+// Timer.cc for Blackbox - An X11 Window Manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// stupid macros needed to access some functions in version 2 of the GNU C
+// library
+#ifndef   _GNU_SOURCE
+#  define _GNU_SOURCE
+#endif // _GNU_SOURCE
+
+#ifdef    HAVE_CONFIG_H
+#  include "../config.h"
+#endif // HAVE_CONFIG_H
+
+#include "BaseDisplay.hh"
+#include "Timer.hh"
+
+
+BTimer::BTimer(BaseDisplay *d, TimeoutHandler *h) {
+  display = d;
+  handler = h;
+
+  once = timing = False;
+}
+
+
+BTimer::~BTimer(void) {
+  if (timing) stop();
+}
+
+
+void BTimer::setTimeout(long t) {
+  _timeout.tv_sec = t / 1000;
+  _timeout.tv_usec = t;
+  _timeout.tv_usec -= (_timeout.tv_sec * 1000);
+  _timeout.tv_usec *= 1000;
+}
+
+
+void BTimer::setTimeout(timeval t) {
+  _timeout.tv_sec = t.tv_sec;
+  _timeout.tv_usec = t.tv_usec;
+}
+
+
+void BTimer::start(void) {
+  gettimeofday(&_start, 0);
+
+  if (! timing) {
+    timing = True;
+    display->addTimer(this);
+  }
+}
+
+
+void BTimer::stop(void) {
+  timing = False;
+
+  display->removeTimer(this);
+}
+
+
+void BTimer::fireTimeout(void) {
+  if (handler) handler->timeout();
+}
diff --git a/src/Timer.hh b/src/Timer.hh
new file mode 100644
index 00000000..0cc6bbe6
--- /dev/null
+++ b/src/Timer.hh
@@ -0,0 +1,87 @@
+// Timer.hh for Blackbox - An X11 Window Manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the 
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in 
+// all copies or substantial portions of the Software. 
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL 
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+// DEALINGS IN THE SOFTWARE.
+  
+#ifndef   _TIMER_HH_
+#define   _TIMER_HH_
+
+#ifdef HAVE_CONFIG_H
+#include "../config.h"
+#endif //HAVE_CONFIG_H
+
+#ifdef    TIME_WITH_SYS_TIME
+#  include 
+#  include  
+#else // !TIME_WITH_SYS_TIME 
+#  ifdef    HAVE_SYS_TIME_H
+#include 
+#  else // !HAVE_SYS_TIME_H
+#    include 
+#  endif // HAVE_SYS_TIME_H
+#endif // TIME_WITH_SYS_TIME
+
+// forward declaration
+class BTimer;
+class TimeoutHandler;
+
+#include "BaseDisplay.hh"
+
+
+class TimeoutHandler {
+public:
+  virtual void timeout(void) = 0;
+};
+
+
+class BTimer {
+  friend class BaseDisplay;
+private:
+  BaseDisplay *display;
+  TimeoutHandler *handler;
+  int timing, once;
+
+  timeval _start, _timeout;
+
+
+protected:
+  void fireTimeout(void);
+
+
+public:
+  BTimer(BaseDisplay *, TimeoutHandler *);
+  virtual ~BTimer(void);
+
+  inline const int &isTiming(void) const { return timing; } 
+  inline const int &doOnce(void) const { return once; }
+
+  inline const timeval &getTimeout(void) const { return _timeout; }
+  inline const timeval &getStartTime(void) const { return _start; }
+
+  inline void fireOnce(int o) { once = o; }
+
+  void setTimeout(long);
+  void setTimeout(timeval);
+  void start(void);
+  void stop(void);
+};
+
+
+#endif // _TIMER_HH_
+
diff --git a/src/Toolbar.cc b/src/Toolbar.cc
new file mode 100644
index 00000000..214a64f0
--- /dev/null
+++ b/src/Toolbar.cc
@@ -0,0 +1,1415 @@
+// Toolbar.cc for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.	IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// stupid macros needed to access some functions in version 2 of the GNU C
+// library
+#ifndef	 _GNU_SOURCE
+#define	 _GNU_SOURCE
+#endif // _GNU_SOURCE
+
+#ifdef		HAVE_CONFIG_H
+#	include "../config.h"
+#endif // HAVE_CONFIG_H
+
+#include "i18n.hh"
+#include "fluxbox.hh"
+#include "Clientmenu.hh"
+#include "Icon.hh"
+#include "Rootmenu.hh"
+#include "Screen.hh"
+#include "Toolbar.hh"
+#include "Window.hh"
+#include "Workspace.hh"
+#include "Workspacemenu.hh"
+
+#include 
+#include 
+
+#ifdef		STDC_HEADERS
+#	include 
+#endif // STDC_HEADERS
+
+#ifdef		HAVE_STDIO_H
+#	include 
+#endif // HAVE_STDIO_H
+
+#ifdef		TIME_WITH_SYS_TIME
+# include 
+# include 
+#else // !TIME_WITH_SYS_TIME
+# ifdef		HAVE_SYS_TIME_H
+#	include 
+# else // !HAVE_SYS_TIME_H
+#	include 
+# endif // HAVE_SYS_TIME_H
+#endif // TIME_WITH_SYS_TIME
+
+#include 
+#include "misc.hh"
+
+using namespace std;
+
+Toolbar::Toolbar(BScreen *scrn) {
+	screen = scrn;
+	fluxbox = Fluxbox::instance();
+	
+	// get the clock updating every minute
+	clock_timer = new BTimer(fluxbox, this);
+	timeval now;
+	gettimeofday(&now, 0);
+	clock_timer->setTimeout((60 - (now.tv_sec % 60)) * 1000);
+	clock_timer->start();
+
+	hide_handler.toolbar = this;
+	hide_timer = new BTimer(fluxbox, &hide_handler);
+	hide_timer->setTimeout(fluxbox->getAutoRaiseDelay());
+	hide_timer->fireOnce(True);
+
+	image_ctrl = screen->getImageControl();
+
+	editing = False;
+	on_top = screen->isToolbarOnTop();
+	hidden = do_auto_hide = screen->doToolbarAutoHide();
+
+	new_workspace_name = new_name_pos = 0;
+	frame.grab_x = frame.grab_y = 0;
+
+	toolbarmenu = new Toolbarmenu(this);
+
+	display = fluxbox->getXDisplay();
+	XSetWindowAttributes attrib;
+	unsigned long create_mask = CWBackPixmap | CWBackPixel | CWBorderPixel |
+															CWColormap | CWOverrideRedirect | CWEventMask;
+	attrib.background_pixmap = None;
+	attrib.background_pixel = attrib.border_pixel =
+		screen->getBorderColor()->getPixel();
+	attrib.colormap = screen->getColormap();
+	attrib.override_redirect = True;
+	attrib.event_mask = ButtonPressMask | ButtonReleaseMask |
+											EnterWindowMask | LeaveWindowMask;
+
+	frame.window =
+		XCreateWindow(display, screen->getRootWindow(), 0, 0, 1, 1, 0,
+			screen->getDepth(), InputOutput, screen->getVisual(),
+			create_mask, &attrib);
+	fluxbox->saveToolbarSearch(frame.window, this);
+
+	attrib.event_mask = ButtonPressMask | ButtonReleaseMask | ExposureMask |
+											KeyPressMask | EnterWindowMask;
+
+	frame.workspace_label =
+		XCreateWindow(display, frame.window, 0, 0, 1, 1, 0, screen->getDepth(),
+			InputOutput, screen->getVisual(), create_mask, &attrib);
+	fluxbox->saveToolbarSearch(frame.workspace_label, this);
+
+	frame.window_label =
+		XCreateWindow(display, frame.window, 0, 0, 1, 1, 0, screen->getDepth(),
+			InputOutput, screen->getVisual(), create_mask, &attrib);
+	fluxbox->saveToolbarSearch(frame.window_label, this);
+
+	frame.clock =
+		XCreateWindow(display, frame.window, 0, 0, 1, 1, 0, screen->getDepth(),
+			InputOutput, screen->getVisual(), create_mask, &attrib);
+	fluxbox->saveToolbarSearch(frame.clock, this);
+
+	frame.psbutton =
+		XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, screen->getDepth(),
+									InputOutput, screen->getVisual(), create_mask, &attrib);
+	fluxbox->saveToolbarSearch(frame.psbutton, this);
+
+	frame.nsbutton =
+		XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, screen->getDepth(),
+									InputOutput, screen->getVisual(), create_mask, &attrib);
+	fluxbox->saveToolbarSearch(frame.nsbutton, this);
+
+	frame.pwbutton =
+		XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, screen->getDepth(),
+									InputOutput, screen->getVisual(), create_mask, &attrib);
+	fluxbox->saveToolbarSearch(frame.pwbutton, this);
+
+	frame.nwbutton =
+		XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, screen->getDepth(),
+									InputOutput, screen->getVisual(), create_mask, &attrib);
+	fluxbox->saveToolbarSearch(frame.nwbutton, this);
+
+	frame.base = frame.label = frame.wlabel = frame.clk = frame.button =
+		frame.pbutton = None;
+
+	if (Fluxbox::instance()->useIconBar())
+		iconbar = new IconBar(screen, frame.window_label);
+	else
+		iconbar = 0;
+		
+	reconfigure();
+
+	XMapSubwindows(display, frame.window);
+	XMapWindow(display, frame.window);
+}
+
+
+Toolbar::~Toolbar(void) {
+	XUnmapWindow(display, frame.window);
+	 
+	if (frame.base) image_ctrl->removeImage(frame.base);
+	if (frame.label) image_ctrl->removeImage(frame.label);
+	if (frame.wlabel) image_ctrl->removeImage(frame.wlabel);
+	if (frame.clk) image_ctrl->removeImage(frame.clk);
+	if (frame.button) image_ctrl->removeImage(frame.button);
+	if (frame.pbutton) image_ctrl->removeImage(frame.pbutton);
+
+	
+	fluxbox->removeToolbarSearch(frame.window);
+
+	fluxbox->removeToolbarSearch(frame.workspace_label);
+	fluxbox->removeToolbarSearch(frame.window_label);
+	fluxbox->removeToolbarSearch(frame.clock);
+	fluxbox->removeToolbarSearch(frame.psbutton);
+	fluxbox->removeToolbarSearch(frame.nsbutton);
+	fluxbox->removeToolbarSearch(frame.pwbutton);
+	fluxbox->removeToolbarSearch(frame.nwbutton);
+	
+	XDestroyWindow(display, frame.workspace_label);
+	XDestroyWindow(display, frame.window_label);
+	XDestroyWindow(display, frame.clock);
+
+	XDestroyWindow(display, frame.window);
+
+	delete hide_timer;
+	delete clock_timer;
+	delete toolbarmenu;
+	if (iconbar)
+		delete iconbar; 
+}
+
+void Toolbar::addIcon(FluxboxWindow *w) {
+	if (iconbar)
+		Fluxbox::instance()->saveToolbarSearch(iconbar->addIcon(w), this);
+}
+
+void Toolbar::delIcon(FluxboxWindow *w) {
+	if (iconbar)
+		Fluxbox::instance()->removeToolbarSearch(iconbar->delIcon(w));
+}
+		
+void Toolbar::reconfigure(void) {
+	frame.bevel_w = screen->getBevelWidth();
+	frame.width = screen->getWidth() * screen->getToolbarWidthPercent() / 100;
+	
+	I18n *i18n = I18n::instance();
+	
+	if (i18n->multibyte())
+		frame.height =
+			screen->getToolbarStyle()->font.set_extents->max_ink_extent.height;
+	else
+		frame.height = screen->getToolbarStyle()->font.fontstruct->ascent +
+			 screen->getToolbarStyle()->font.fontstruct->descent;
+	frame.button_w = frame.height;
+	frame.height += 2;
+	frame.label_h = frame.height;
+	frame.height += (frame.bevel_w * 2);
+	
+	switch (screen->getToolbarPlacement()) {
+	case TopLeft:
+		frame.x = 0;
+		frame.y = 0;
+		frame.x_hidden = 0;
+		frame.y_hidden = screen->getBevelWidth() - screen->getBorderWidth()
+										 - frame.height;
+		break;
+
+	case BottomLeft:
+		frame.x = 0;
+		frame.y = screen->getHeight() - frame.height - screen->getBorderWidth2x();
+		frame.x_hidden = 0;
+		frame.y_hidden = screen->getHeight() - screen->getBevelWidth()
+										 - screen->getBorderWidth();
+		break;
+
+	case TopCenter:
+		frame.x = (screen->getWidth() - frame.width) / 2;
+		frame.y = 0;
+		frame.x_hidden = frame.x;
+		frame.y_hidden = screen->getBevelWidth() - screen->getBorderWidth()
+										 - frame.height;
+		break;
+
+	case BottomCenter:
+	default:
+		frame.x = (screen->getWidth() - frame.width) / 2;
+		frame.y = screen->getHeight() - frame.height - screen->getBorderWidth2x();
+		frame.x_hidden = frame.x;
+		frame.y_hidden = screen->getHeight() - screen->getBevelWidth()
+										 - screen->getBorderWidth();
+		break;
+
+	case TopRight:
+		frame.x = screen->getWidth() - frame.width - screen->getBorderWidth2x();
+		frame.y = 0;
+		frame.x_hidden = frame.x;
+		frame.y_hidden = screen->getBevelWidth() - screen->getBorderWidth()
+										 - frame.height;
+		break;
+
+	case BottomRight:
+		frame.x = screen->getWidth() - frame.width - screen->getBorderWidth2x();
+		frame.y = screen->getHeight() - frame.height - screen->getBorderWidth2x();
+		frame.x_hidden = frame.x;
+		frame.y_hidden = screen->getHeight() - screen->getBevelWidth()
+										 - screen->getBorderWidth();
+		break;
+	}
+
+#ifdef		HAVE_STRFTIME
+	time_t ttmp = time(NULL);
+	struct tm *tt = 0;
+
+	if (ttmp != -1) {
+		tt = localtime(&ttmp);
+		if (tt) {
+			char t[1024], *time_string = (char *) 0;
+			int len = strftime(t, 1024, screen->getStrftimeFormat(), tt);
+
+			time_string = new char[len + 1];
+
+			memset(time_string, '0', len);
+			*(time_string + len) = '\0';
+
+			if (i18n->multibyte()) {
+	XRectangle ink, logical;
+	XmbTextExtents(screen->getToolbarStyle()->font.set, time_string, len,
+					 &ink, &logical);
+	frame.clock_w = logical.width;
+			} else
+	frame.clock_w = XTextWidth(screen->getToolbarStyle()->font.fontstruct,
+					 time_string, len);
+			
+			frame.clock_w += (frame.bevel_w * 4);
+			
+			delete [] time_string;
+		} else
+			frame.clock_w = 0;
+	} else
+		frame.clock_w = 0;
+#else // !HAVE_STRFTIME
+	frame.clock_w =
+		XTextWidth(screen->getToolbarStyle()->font.fontstruct,
+				 i18n->getMessage(
+#ifdef		NLS
+				ToolbarSet, ToolbarNoStrftimeLength,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"00:00000"),
+				 strlen(i18n->getMessage(
+#ifdef		NLS
+							 ToolbarSet, ToolbarNoStrftimeLength,
+#else // !NLS
+							 0, 0,
+#endif // NLS
+							 "00:00000"))) + (frame.bevel_w * 4);
+#endif // HAVE_STRFTIME
+
+	int i;
+	unsigned int w = 0;
+	frame.workspace_label_w = 0;
+
+	for (i = 0; i < screen->getCount(); i++) {
+		if (i18n->multibyte()) {
+			XRectangle ink, logical;
+			XmbTextExtents(screen->getToolbarStyle()->font.set,
+				 screen->getWorkspace(i)->getName(),
+				 strlen(screen->getWorkspace(i)->getName()),
+				 &ink, &logical);
+			w = logical.width;
+		} else
+			w = XTextWidth(screen->getToolbarStyle()->font.fontstruct,
+				 screen->getWorkspace(i)->getName(),
+				 strlen(screen->getWorkspace(i)->getName()));
+
+		w += (frame.bevel_w * 4);
+
+		if (w > frame.workspace_label_w) frame.workspace_label_w = w;
+	}
+
+	if (frame.workspace_label_w < frame.clock_w)
+		frame.workspace_label_w = frame.clock_w;
+	else if (frame.workspace_label_w > frame.clock_w)
+		frame.clock_w = frame.workspace_label_w;
+
+	frame.window_label_w =
+		(frame.width - (frame.clock_w + (frame.button_w * 4) +
+										frame.workspace_label_w + (frame.bevel_w * 8) + 6));
+
+	if (hidden)
+		XMoveResizeWindow(display, frame.window, frame.x_hidden, frame.y_hidden,
+					frame.width, frame.height);
+	else
+		XMoveResizeWindow(display, frame.window, frame.x, frame.y,
+					frame.width, frame.height);
+
+	XMoveResizeWindow(display, frame.workspace_label, frame.bevel_w,
+				frame.bevel_w, frame.workspace_label_w,
+										frame.label_h);
+	XMoveResizeWindow(display, frame.psbutton, (frame.bevel_w * 2) +
+										frame.workspace_label_w + 1, frame.bevel_w + 1,
+										frame.button_w, frame.button_w);
+	XMoveResizeWindow(display ,frame.nsbutton, (frame.bevel_w * 3) +
+										frame.workspace_label_w + frame.button_w + 2,
+										frame.bevel_w + 1, frame.button_w, frame.button_w);
+	XMoveResizeWindow(display, frame.window_label, (frame.bevel_w * 4) +
+										(frame.button_w * 2) + frame.workspace_label_w + 3,
+				frame.bevel_w, frame.window_label_w, frame.label_h);
+	XMoveResizeWindow(display, frame.pwbutton, (frame.bevel_w * 5) +
+										(frame.button_w * 2) + frame.workspace_label_w +
+										frame.window_label_w + 4, frame.bevel_w + 1,
+										frame.button_w, frame.button_w);
+	XMoveResizeWindow(display, frame.nwbutton, (frame.bevel_w * 6) +
+										(frame.button_w * 3) + frame.workspace_label_w +
+										frame.window_label_w + 5, frame.bevel_w + 1,
+										frame.button_w, frame.button_w);
+	XMoveResizeWindow(display, frame.clock, frame.width - frame.clock_w -
+				frame.bevel_w, frame.bevel_w, frame.clock_w,
+				frame.label_h);
+
+	Pixmap tmp = frame.base;
+	BTexture *texture = &(screen->getToolbarStyle()->toolbar);
+	if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+		frame.base = None;
+		XSetWindowBackground(display, frame.window,
+			 texture->getColor()->getPixel());
+	} else {
+		frame.base =
+			image_ctrl->renderImage(frame.width, frame.height, texture);
+		XSetWindowBackgroundPixmap(display, frame.window, frame.base);
+	}
+	if (tmp) image_ctrl->removeImage(tmp);
+
+	tmp = frame.label;
+	texture = &(screen->getToolbarStyle()->window);
+	if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+		frame.label = None;
+		XSetWindowBackground(display, frame.window_label,
+			 texture->getColor()->getPixel());
+	} else {
+		frame.label =
+			image_ctrl->renderImage(frame.window_label_w, frame.label_h, texture);
+		XSetWindowBackgroundPixmap(display, frame.window_label, frame.label);
+	}
+	if (tmp) image_ctrl->removeImage(tmp);
+
+	tmp = frame.wlabel;
+	texture = &(screen->getToolbarStyle()->label);
+	if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+		frame.wlabel = None;
+		XSetWindowBackground(display, frame.workspace_label,
+			 texture->getColor()->getPixel());
+	} else {
+		frame.wlabel =
+			image_ctrl->renderImage(frame.workspace_label_w, frame.label_h, texture);
+		XSetWindowBackgroundPixmap(display, frame.workspace_label, frame.wlabel);
+	}
+	if (tmp) image_ctrl->removeImage(tmp);
+
+	tmp = frame.clk;
+	texture = &(screen->getToolbarStyle()->clock);
+	if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+		frame.clk = None;
+		XSetWindowBackground(display, frame.clock,
+			 texture->getColor()->getPixel());
+	} else {
+		frame.clk =
+			image_ctrl->renderImage(frame.clock_w, frame.label_h, texture);
+		XSetWindowBackgroundPixmap(display, frame.clock, frame.clk);
+	}
+	if (tmp) image_ctrl->removeImage(tmp);
+
+	tmp = frame.button;
+	texture = &(screen->getToolbarStyle()->button);
+	if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+		frame.button = None;
+
+		frame.button_pixel = texture->getColor()->getPixel();
+		XSetWindowBackground(display, frame.psbutton, frame.button_pixel);
+		XSetWindowBackground(display, frame.nsbutton, frame.button_pixel);
+		XSetWindowBackground(display, frame.pwbutton, frame.button_pixel);
+		XSetWindowBackground(display, frame.nwbutton, frame.button_pixel);
+	} else {
+		frame.button =
+			image_ctrl->renderImage(frame.button_w, frame.button_w, texture);
+
+		XSetWindowBackgroundPixmap(display, frame.psbutton, frame.button);
+		XSetWindowBackgroundPixmap(display, frame.nsbutton, frame.button);
+		XSetWindowBackgroundPixmap(display, frame.pwbutton, frame.button);
+		XSetWindowBackgroundPixmap(display, frame.nwbutton, frame.button);
+	}
+	if (tmp) image_ctrl->removeImage(tmp);
+
+	tmp = frame.pbutton;
+	texture = &(screen->getToolbarStyle()->pressed);
+	if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+		frame.pbutton = None;
+		frame.pbutton_pixel = texture->getColor()->getPixel();
+	} else
+		frame.pbutton =
+			image_ctrl->renderImage(frame.button_w, frame.button_w, texture);
+	if (tmp) image_ctrl->removeImage(tmp);
+
+	XSetWindowBorder(display, frame.window,
+			 screen->getBorderColor()->getPixel());
+	XSetWindowBorderWidth(display, frame.window, screen->getBorderWidth());
+
+	XClearWindow(display, frame.window);
+	XClearWindow(display, frame.workspace_label);
+	XClearWindow(display, frame.window_label);
+	XClearWindow(display, frame.clock);
+	XClearWindow(display, frame.psbutton);
+	XClearWindow(display, frame.nsbutton);
+	XClearWindow(display, frame.pwbutton);
+	XClearWindow(display, frame.nwbutton);
+	
+	redrawWindowLabel();
+	redrawWorkspaceLabel();
+	redrawPrevWorkspaceButton();
+	redrawNextWorkspaceButton();
+	redrawPrevWindowButton();
+	redrawNextWindowButton();
+	checkClock(True);
+
+	toolbarmenu->reconfigure();
+
+	//iconbar, no iconbar?
+	if (Fluxbox::instance()->useIconBar()) {
+		if (!iconbar) {
+			iconbar = new IconBar(screen, frame.window_label);
+			if (screen->getIconCount()) {
+				LinkedListIterator it(screen->getIconList());		
+				for(; it.current(); it++)
+					addIcon(it.current());
+			}
+			
+		} else 
+			iconbar->reconfigure();
+	} else {
+		if (iconbar) {
+			LinkedListIterator it(screen->getIconList());
+			for (; it.current(); it++)
+				delIcon(it.current());
+			delete iconbar;
+			iconbar = 0;
+		}
+	}
+}
+
+
+#ifdef		HAVE_STRFTIME
+void Toolbar::checkClock(Bool redraw) {
+#else // !HAVE_STRFTIME
+void Toolbar::checkClock(Bool redraw, Bool date) {
+#endif // HAVE_STRFTIME
+	time_t tmp = 0;
+	struct tm *tt = 0;
+
+	if ((tmp = time(NULL)) != -1) {
+		if (! (tt = localtime(&tmp))) {
+			cerr<<__FILE__<<"("<<__LINE__<<"): ! localtime(&tmp)"<tm_min != frame.minute || tt->tm_hour != frame.hour) {
+			frame.hour = tt->tm_hour;
+			frame.minute = tt->tm_min;
+			XClearWindow(display, frame.clock);
+			redraw = True;
+		}
+	} else
+		cerr<<__FILE__<<"("<<__LINE__<<"): time(null)<0"<getStrftimeFormat(), tt))
+			return;
+#else // !HAVE_STRFTIME
+		char t[9];
+		if (date) {
+			// format the date... with special consideration for y2k ;)
+			if (screen->getDateFormat() == Blackbox::B_EuropeanDate)
+				sprintf(t,
+		i18n->getMessage(
+#ifdef		NLS
+				 ToolbarSet, ToolbarNoStrftimeDateFormatEu,
+#else // !NLS
+				 0, 0,
+#endif // NLS
+				 "%02d.%02d.%02d"),
+		tt->tm_mday, tt->tm_mon + 1,
+								(tt->tm_year >= 100) ? tt->tm_year - 100 : tt->tm_year);
+			else
+				sprintf(t,
+		i18n->getMessage(
+#ifdef		NLS
+				 ToolbarSet, ToolbarNoStrftimeDateFormat,
+#else // !NLS
+				 0, 0,
+#endif // NLS
+				 "%02d/%02d/%02d"),
+		tt->tm_mon + 1, tt->tm_mday,
+								(tt->tm_year >= 100) ? tt->tm_year - 100 : tt->tm_year);
+		} else {
+			if (screen->isClock24Hour())
+	sprintf(t,
+		i18n->getMessage(
+#ifdef		NLS
+				 ToolbarSet, ToolbarNoStrftimeTimeFormat24,
+#else // !NLS
+				 0, 0,
+#endif // NLS
+				 "	%02d:%02d "),
+		frame.hour, frame.minute);
+			else
+	sprintf(t,
+		i18n->getMessage(
+#ifdef		NLS
+				 ToolbarSet, ToolbarNoStrftimeTimeFormat12,
+#else // !NLS
+				 0, 0,
+#endif // NLS
+				 "%02d:%02d %sm"),
+		((frame.hour > 12) ? frame.hour - 12 :
+		 ((frame.hour == 0) ? 12 : frame.hour)), frame.minute,
+		((frame.hour >= 12) ?
+		 i18n->getMessage(
+#ifdef		NLS
+					ToolbarSet, ToolbarNoStrftimeTimeFormatP,
+#else // !NLS
+					0, 0,
+#endif // NLS
+					"p") :
+		 i18n->getMessage(
+#ifdef		NLS
+					ToolbarSet, ToolbarNoStrftimeTimeFormatA,
+#else // !NLS
+					0, 0,
+#endif // NLS
+					"a")));
+		}
+#endif // HAVE_STRFTIME
+
+		int dx = (frame.bevel_w * 2), dlen = strlen(t);
+		unsigned int l;
+		I18n *i18n = I18n::instance();
+		
+		if (i18n->multibyte()) {
+			XRectangle ink, logical;
+			XmbTextExtents(screen->getToolbarStyle()->font.set,
+				 t, dlen, &ink, &logical);
+			l = logical.width;
+		} else
+			l = XTextWidth(screen->getToolbarStyle()->font.fontstruct, t, dlen);
+		
+		l += (frame.bevel_w * 4);
+		
+		if (l > frame.clock_w) {
+			for (; dlen >= 0; dlen--) {
+				if (i18n->multibyte()) {
+					XRectangle ink, logical;
+					XmbTextExtents(screen->getToolbarStyle()->font.set,
+						t, dlen, &ink, &logical);
+					l = logical.width;
+				} else
+					l = XTextWidth(screen->getToolbarStyle()->font.fontstruct, t, dlen);
+				l += (frame.bevel_w * 4);
+	
+				if (l < frame.clock_w)
+					break;
+			}
+
+		}
+
+		switch (screen->getToolbarStyle()->font.justify) {
+		case FFont::Right:
+			dx += frame.clock_w - l;
+			break;
+
+		case FFont::Center:
+			dx += (frame.clock_w - l) / 2;
+			break;
+		default:
+			break;
+		}
+
+		if (i18n->multibyte()) {
+			XmbDrawString(display, frame.clock,
+				screen->getToolbarStyle()->font.set,
+				screen->getToolbarStyle()->c_text_gc, dx, 1 -
+				screen->getToolbarStyle()->font.set_extents->max_ink_extent.y,
+				t, dlen);
+		} else {
+			XDrawString(display, frame.clock,
+				screen->getToolbarStyle()->c_text_gc, dx,
+				screen->getToolbarStyle()->font.fontstruct->ascent + 1, t, dlen);
+		}
+	}
+}
+
+
+void Toolbar::redrawWindowLabel(Bool redraw) {
+	if (Fluxbox::instance()->getFocusedWindow()) {
+		if (redraw)
+			XClearWindow(display, frame.window_label);
+
+		FluxboxWindow *foc = Fluxbox::instance()->getFocusedWindow();
+		if (foc->getScreen() != screen)
+			return;
+
+		int dx = (frame.bevel_w * 2), dlen = strlen(*foc->getTitle());
+		unsigned int l;
+		I18n *i18n = I18n::instance();
+		
+		if (i18n->multibyte()) {
+			XRectangle ink, logical;
+			XmbTextExtents(screen->getToolbarStyle()->font.set, *foc->getTitle(), dlen,
+				 &ink, &logical);
+			l = logical.width;
+		} else
+			l = XTextWidth(screen->getToolbarStyle()->font.fontstruct, *foc->getTitle(), dlen);
+		
+		l += (frame.bevel_w * 4);
+
+		if (l > frame.window_label_w) {
+			for (; dlen >= 0; dlen--) {
+				if (i18n->multibyte()) {
+					XRectangle ink, logical;
+					XmbTextExtents(screen->getToolbarStyle()->font.set,
+						 *foc->getTitle(), dlen, &ink, &logical);
+					l = logical.width;
+				} else
+					l = XTextWidth(screen->getToolbarStyle()->font.fontstruct, *foc->getTitle(), dlen);
+	
+				l += (frame.bevel_w * 4);
+	
+				if (l < frame.window_label_w)
+					break;
+			}
+		}
+		switch (screen->getToolbarStyle()->font.justify) {
+		case FFont::Right:
+			dx += frame.window_label_w - l;
+			break;
+
+		case FFont::Center:
+			dx += (frame.window_label_w - l) / 2;
+			break;
+		default:
+			break;
+		}
+
+		if (i18n->multibyte())
+			XmbDrawString(display, frame.window_label,
+				screen->getToolbarStyle()->font.set,
+				screen->getToolbarStyle()->w_text_gc, dx, 1 -
+				screen->getToolbarStyle()->font.set_extents->max_ink_extent.y,
+				*foc->getTitle(), dlen);
+		else
+			XDrawString(display, frame.window_label,
+			screen->getToolbarStyle()->w_text_gc, dx,
+			screen->getToolbarStyle()->font.fontstruct->ascent	+ 1,
+			*foc->getTitle(), dlen);
+	} else
+		XClearWindow(display, frame.window_label);
+}
+ 
+ 
+void Toolbar::redrawWorkspaceLabel(Bool redraw) {
+	if (screen->getCurrentWorkspace()->getName()) {
+		
+		if (redraw)
+			XClearWindow(display, frame.workspace_label);
+	/*	DrawString(
+					display, frame.label, screen->getToolbarStyle()->l_text_gc, 
+					&screen->getToolbarStyle()->font,
+					frame.workspace_label_w, frame.width,
+				frame.bevel_w, 
+				const_cast(screen->getCurrentWorkspace()->getName()));*/
+		
+		int dx = (frame.bevel_w * 2), dlen =
+						strlen(screen->getCurrentWorkspace()->getName());
+		unsigned int l;
+		I18n *i18n = I18n::instance();
+		
+		
+		if (i18n->multibyte()) {
+			XRectangle ink, logical;
+			XmbTextExtents(screen->getToolbarStyle()->font.set,
+						screen->getCurrentWorkspace()->getName(), dlen,
+						&ink, &logical);
+			l = logical.width;
+		} else
+			l = XTextWidth(screen->getToolbarStyle()->font.fontstruct,
+					screen->getCurrentWorkspace()->getName(), dlen);
+		
+		l += (frame.bevel_w * 4);
+		
+		if (l > frame.workspace_label_w) {
+			for (; dlen >= 0; dlen--) {
+				if (i18n->multibyte()) {
+					XRectangle ink, logical;
+					XmbTextExtents(screen->getToolbarStyle()->font.set,
+						screen->getCurrentWorkspace()->getName(), dlen,
+						&ink, &logical);
+						l = logical.width;
+				} else {
+					l = XTextWidth(screen->getWindowStyle()->font.fontstruct,
+							screen->getCurrentWorkspace()->getName(), dlen);
+				}
+				
+				l += (frame.bevel_w * 4);
+	
+				if (l < frame.workspace_label_w)
+					break;
+			}
+		}
+		
+		switch (screen->getToolbarStyle()->font.justify) {
+		case FFont::Right:
+			dx += frame.workspace_label_w - l;
+			break;
+
+		case FFont::Center:
+			dx += (frame.workspace_label_w - l) / 2;
+			break;
+		default:
+			break;
+		}
+
+		if (i18n->multibyte()) {
+			XmbDrawString(display, frame.workspace_label,
+				screen->getToolbarStyle()->font.set,
+				screen->getToolbarStyle()->l_text_gc, dx, 1 -
+				screen->getToolbarStyle()->font.set_extents->max_ink_extent.y,
+				(char *) screen->getCurrentWorkspace()->getName(), dlen);
+		} else {
+			XDrawString(display, frame.workspace_label,
+				screen->getToolbarStyle()->l_text_gc, dx,
+				screen->getToolbarStyle()->font.fontstruct->ascent + 1,
+				(char *) screen->getCurrentWorkspace()->getName(), dlen);
+		}
+	}
+}
+
+
+void Toolbar::redrawPrevWorkspaceButton(Bool pressed, Bool redraw) {
+	if (redraw) {
+		if (pressed) {
+			if (frame.pbutton)
+	XSetWindowBackgroundPixmap(display, frame.psbutton, frame.pbutton);
+			else
+	XSetWindowBackground(display, frame.psbutton, frame.pbutton_pixel);
+		} else {
+			if (frame.button)
+				XSetWindowBackgroundPixmap(display, frame.psbutton, frame.button);
+			else
+	XSetWindowBackground(display, frame.psbutton, frame.button_pixel);
+		}
+		XClearWindow(display, frame.psbutton);
+	}
+
+	int hh = frame.button_w / 2, hw = frame.button_w / 2;
+
+	XPoint pts[3];
+	pts[0].x = hw - 2; pts[0].y = hh;
+	pts[1].x = 4; pts[1].y = 2;
+	pts[2].x = 0; pts[2].y = -4;
+
+	XFillPolygon(display, frame.psbutton, screen->getToolbarStyle()->b_pic_gc,
+							 pts, 3, Convex, CoordModePrevious);
+}
+
+
+void Toolbar::redrawNextWorkspaceButton(Bool pressed, Bool redraw) {
+	if (redraw) {
+		if (pressed) {
+			if (frame.pbutton)
+	XSetWindowBackgroundPixmap(display, frame.nsbutton, frame.pbutton);
+			else
+	XSetWindowBackground(display, frame.nsbutton, frame.pbutton_pixel);
+		} else {
+			if (frame.button)
+				XSetWindowBackgroundPixmap(display, frame.nsbutton, frame.button);
+			else
+	XSetWindowBackground(display, frame.nsbutton, frame.button_pixel);
+		}
+		XClearWindow(display, frame.nsbutton);
+	}
+
+	int hh = frame.button_w / 2, hw = frame.button_w / 2;
+
+	XPoint pts[3];
+	pts[0].x = hw - 2; pts[0].y = hh - 2;
+	pts[1].x = 4; pts[1].y =	2;
+	pts[2].x = -4; pts[2].y = 2;
+
+	XFillPolygon(display, frame.nsbutton, screen->getToolbarStyle()->b_pic_gc,
+							 pts, 3, Convex, CoordModePrevious);
+}
+
+
+void Toolbar::redrawPrevWindowButton(Bool pressed, Bool redraw) {
+	if (redraw) {
+		if (pressed) {
+			if (frame.pbutton)
+	XSetWindowBackgroundPixmap(display, frame.pwbutton, frame.pbutton);
+			else
+	XSetWindowBackground(display, frame.pwbutton, frame.pbutton_pixel);
+		} else {
+			if (frame.button)
+				XSetWindowBackgroundPixmap(display, frame.pwbutton, frame.button);
+			else
+	XSetWindowBackground(display, frame.pwbutton, frame.button_pixel);
+		}
+		XClearWindow(display, frame.pwbutton);
+	}
+
+	int hh = frame.button_w / 2, hw = frame.button_w / 2;
+
+	XPoint pts[3];
+	pts[0].x = hw - 2; pts[0].y = hh;
+	pts[1].x = 4; pts[1].y = 2;
+	pts[2].x = 0; pts[2].y = -4;
+
+	XFillPolygon(display, frame.pwbutton, screen->getToolbarStyle()->b_pic_gc,
+							 pts, 3, Convex, CoordModePrevious);
+}
+
+
+void Toolbar::redrawNextWindowButton(Bool pressed, Bool redraw) {
+	if (redraw) {
+		if (pressed) {
+			if (frame.pbutton)
+	XSetWindowBackgroundPixmap(display, frame.nwbutton, frame.pbutton);
+			else
+	XSetWindowBackground(display, frame.nwbutton, frame.pbutton_pixel);
+		} else {
+			if (frame.button)
+				XSetWindowBackgroundPixmap(display, frame.nwbutton, frame.button);
+			else
+	XSetWindowBackground(display, frame.nwbutton, frame.button_pixel);
+		}
+		XClearWindow(display, frame.nwbutton);
+	}
+
+	int hh = frame.button_w / 2, hw = frame.button_w / 2;
+
+	XPoint pts[3];
+	pts[0].x = hw - 2; pts[0].y = hh - 2;
+	pts[1].x = 4; pts[1].y =	2;
+	pts[2].x = -4; pts[2].y = 2;
+
+	XFillPolygon(display, frame.nwbutton, screen->getToolbarStyle()->b_pic_gc,
+							 pts, 3, Convex, CoordModePrevious);
+}
+
+
+void Toolbar::edit(void) {
+	Window window;
+	int foo;
+
+	editing = True;	//mark for editing
+	
+	//workspace labe already got intput focus ?
+	if (XGetInputFocus(display, &window, &foo) &&
+			window == frame.workspace_label)
+		return;
+
+	//set input focus to workspace label
+	XSetInputFocus(display, frame.workspace_label,
+					((screen->isSloppyFocus() || screen->isSemiSloppyFocus()) ?
+						RevertToPointerRoot : RevertToParent), CurrentTime);
+
+	XClearWindow(display, frame.workspace_label);	//clear workspace text
+
+	fluxbox->setNoFocus(True);
+	if (fluxbox->getFocusedWindow())	//disable focus on current focused window
+		fluxbox->getFocusedWindow()->setFocusFlag(False);
+
+	XDrawRectangle(display, frame.workspace_label,
+								 screen->getWindowStyle()->l_text_focus_gc,
+								 frame.workspace_label_w / 2, 0, 1,
+								 frame.label_h - 1);
+}
+
+
+void Toolbar::buttonPressEvent(XButtonEvent *be) {
+	FluxboxWindow *fluxboxwin=0;
+	if (be->button == 1) {
+		if (be->window == frame.psbutton)
+			redrawPrevWorkspaceButton(True, True);
+		else if (be->window == frame.nsbutton)
+			redrawNextWorkspaceButton(True, True);
+		else if (be->window == frame.pwbutton)
+			redrawPrevWindowButton(True, True);
+		else if (be->window == frame.nwbutton)
+			redrawNextWindowButton(True, True);
+		else if ( iconbar ) {
+			if ( (fluxboxwin = iconbar->findWindow(be->window)) )
+				fluxboxwin->deiconify();
+		}
+#ifndef	 HAVE_STRFTIME
+		else if (be->window == frame.clock) {
+			XClearWindow(display, frame.clock);
+			checkClock(True, True);
+		}
+#endif // HAVE_STRFTIME
+		else if (! on_top) {
+			Window w[1] = { frame.window };
+			screen->raiseWindows(w, 1);
+		}
+	} else if (be->button == 2 && (! on_top)) {
+		XLowerWindow(display, frame.window);
+	} else if (be->button == 3) {
+		if (! toolbarmenu->isVisible()) {
+			int x, y;
+
+			x = be->x_root - (toolbarmenu->getWidth() / 2);
+			y = be->y_root - (toolbarmenu->getHeight() / 2);
+
+			if (x < 0)
+				x = 0;
+			else if (x + toolbarmenu->getWidth() > screen->getWidth())
+				x = screen->getWidth() - toolbarmenu->getWidth();
+
+			if (y < 0)
+				y = 0;
+			else if (y + toolbarmenu->getHeight() > screen->getHeight())
+				y = screen->getHeight() - toolbarmenu->getHeight();
+
+			toolbarmenu->move(x, y);
+			toolbarmenu->show();
+		} else
+			toolbarmenu->hide();
+			
+	} 
+	
+}
+
+
+void Toolbar::buttonReleaseEvent(XButtonEvent *re) {
+	if (re->button == 1) {
+		if (re->window == frame.psbutton) {
+			redrawPrevWorkspaceButton(False, True);
+
+			if (re->x >= 0 && re->x < (signed) frame.button_w &&
+					re->y >= 0 && re->y < (signed) frame.button_w)
+			 screen->prevWorkspace();
+		} else if (re->window == frame.nsbutton) {
+			redrawNextWorkspaceButton(False, True);
+
+			if (re->x >= 0 && re->x < (signed) frame.button_w &&
+					re->y >= 0 && re->y < (signed) frame.button_w)
+				screen->nextWorkspace();
+		} else if (re->window == frame.pwbutton) {
+			redrawPrevWindowButton(False, True);
+
+			if (re->x >= 0 && re->x < (signed) frame.button_w &&
+					re->y >= 0 && re->y < (signed) frame.button_w)
+				screen->prevFocus();
+		} else if (re->window == frame.nwbutton) {
+			redrawNextWindowButton(False, True);
+
+			if (re->x >= 0 && re->x < (signed) frame.button_w &&
+					re->y >= 0 && re->y < (signed) frame.button_w)
+				screen->nextFocus();
+		} else if (re->window == frame.window_label)
+			screen->raiseFocus();
+#ifndef	 HAVE_STRFTIME
+		else if (re->window == frame.clock) {
+			XClearWindow(display, frame.clock);
+			checkClock(True);
+		}
+#endif // HAVE_STRFTIME
+	} else if (re->button == 4) //mousewheel scroll up
+		screen->nextWorkspace();
+	else if (re->button == 5)	//mousewheel scroll down
+		screen->prevWorkspace();
+}
+
+
+void Toolbar::enterNotifyEvent(XCrossingEvent *) {
+	if (! do_auto_hide)
+		return;
+
+	if (hidden) {
+		if (! hide_timer->isTiming()) hide_timer->start();
+	} else {
+		if (hide_timer->isTiming()) hide_timer->stop();
+	}
+}
+
+void Toolbar::leaveNotifyEvent(XCrossingEvent *) {
+	if (! do_auto_hide)
+		return;
+
+	if (hidden) {
+		if (hide_timer->isTiming()) hide_timer->stop();
+	} else if (! toolbarmenu->isVisible()) {
+		if (! hide_timer->isTiming()) hide_timer->start();
+	}
+}
+
+
+void Toolbar::exposeEvent(XExposeEvent *ee) {
+	if (ee->window == frame.clock) checkClock(True);
+	else if (ee->window == frame.workspace_label && (! editing))
+		redrawWorkspaceLabel();
+	else if (ee->window == frame.window_label) redrawWindowLabel();
+	else if (ee->window == frame.psbutton) redrawPrevWorkspaceButton();
+	else if (ee->window == frame.nsbutton) redrawNextWorkspaceButton();
+	else if (ee->window == frame.pwbutton) redrawPrevWindowButton();
+	else if (ee->window == frame.nwbutton) redrawNextWindowButton();
+	else if (iconbar)//try iconbar
+		iconbar->exposeEvent(ee);
+}
+
+
+void Toolbar::keyPressEvent(XKeyEvent *ke) {
+	if (ke->window == frame.workspace_label && editing) {
+		fluxbox->grab();
+
+		if (! new_workspace_name) {
+			new_workspace_name = new char[1024];
+			new_name_pos = new_workspace_name;
+
+			if (! new_workspace_name) return;
+		}
+
+		KeySym ks;
+		char keychar[1];
+		XLookupString(ke, keychar, 1, &ks, 0);
+
+		if (ks == XK_Return || ks == XK_Escape) {
+			*(new_name_pos) = 0;
+
+			editing = False;
+			
+			fluxbox->setNoFocus(False);
+			if (fluxbox->getFocusedWindow()) {
+				fluxbox->getFocusedWindow()->setInputFocus();
+				fluxbox->getFocusedWindow()->setFocusFlag(True);
+			} else
+				XSetInputFocus(display, PointerRoot, None, CurrentTime);
+
+			// check to make sure that new_name[0] != 0... otherwise we have a null
+			// workspace name which causes serious problems, especially for the
+			// Blackbox::LoadRC() method.
+			if (*new_workspace_name) {
+				if (ks == XK_Return)	//change workspace name if keypress = Return
+					screen->getCurrentWorkspace()->setName(new_workspace_name);
+				screen->getCurrentWorkspace()->getMenu()->hide();
+				screen->getWorkspacemenu()->
+				remove(screen->getCurrentWorkspace()->getWorkspaceID() + 2);
+				screen->getWorkspacemenu()->
+				insert(screen->getCurrentWorkspace()->getName(),
+				screen->getCurrentWorkspace()->getMenu(),
+				screen->getCurrentWorkspace()->getWorkspaceID() + 1);
+				screen->getWorkspacemenu()->update();
+			}
+
+			delete [] new_workspace_name;
+			new_workspace_name = new_name_pos = 0;
+
+			reconfigure();
+		} else if (! (ks == XK_Shift_L || ks == XK_Shift_R ||
+			ks == XK_Control_L || ks == XK_Control_R ||
+			ks == XK_Caps_Lock || ks == XK_Shift_Lock ||
+			ks == XK_Meta_L || ks == XK_Meta_R ||
+			ks == XK_Alt_L || ks == XK_Alt_R ||
+			ks == XK_Super_L || ks == XK_Super_R ||
+			ks == XK_Hyper_L || ks == XK_Hyper_R)) {
+			if (ks == XK_BackSpace) {
+				if (new_name_pos != new_workspace_name) {
+					*(--new_name_pos) = 0;
+				} else {
+					*new_workspace_name = 0;
+				}			
+			} else {
+				*(new_name_pos++) = *keychar;
+				*(new_name_pos) = 0;
+			}
+
+			XClearWindow(display, frame.workspace_label);
+			int l = strlen(new_workspace_name), tw, x;
+			I18n *i18n = I18n::instance();
+			
+			if (i18n->multibyte()) {
+				XRectangle ink, logical;
+				XmbTextExtents(screen->getToolbarStyle()->font.set,
+					new_workspace_name, l, &ink, &logical);
+				tw = logical.width;
+			} else
+				tw = XTextWidth(screen->getToolbarStyle()->font.fontstruct,
+				new_workspace_name, l);
+			
+				x = (frame.workspace_label_w - tw) / 2;
+
+			if (x < (signed) frame.bevel_w) x = frame.bevel_w;
+
+			if (i18n->multibyte())
+				XmbDrawString(display, frame.workspace_label,
+					screen->getWindowStyle()->font.set,
+					screen->getWindowStyle()->l_text_focus_gc, x, 1 -
+					screen->getWindowStyle()->font.set_extents->max_ink_extent.y,
+					new_workspace_name, l);
+			else
+				XDrawString(display, frame.workspace_label,
+					screen->getWindowStyle()->l_text_focus_gc, x,
+					screen->getToolbarStyle()->font.fontstruct->ascent + 1,
+					new_workspace_name, l);
+			
+			XDrawRectangle(display, frame.workspace_label,
+				screen->getWindowStyle()->l_text_focus_gc, x + tw, 0, 1,
+				frame.label_h - 1);
+		}
+		
+		fluxbox->ungrab();
+	}
+}
+
+
+void Toolbar::timeout(void) {
+	checkClock(True);
+
+	timeval now;
+	gettimeofday(&now, 0);
+	clock_timer->setTimeout((60 - (now.tv_sec % 60)) * 1000);
+}
+
+
+void Toolbar::HideHandler::timeout(void) {
+	toolbar->hidden = ! toolbar->hidden;
+	if (toolbar->hidden)
+		XMoveWindow(toolbar->display, toolbar->frame.window,
+		toolbar->frame.x_hidden, toolbar->frame.y_hidden);
+	else
+		XMoveWindow(toolbar->display, toolbar->frame.window,
+		toolbar->frame.x, toolbar->frame.y);
+}
+
+
+Toolbarmenu::Toolbarmenu(Toolbar *tb) : Basemenu(tb->screen) {
+	toolbar = tb;
+	I18n *i18n = I18n::instance();
+	
+	setLabel(i18n->getMessage(
+#ifdef		NLS
+				ToolbarSet, ToolbarToolbarTitle,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Toolbar"));
+	setInternalMenu();
+
+	placementmenu = new Placementmenu(this);
+
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementTitle,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Placement"),
+				placementmenu);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonAlwaysOnTop,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Always on top"),
+				1);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonAutoHide,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Auto hide"),
+				2);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				ToolbarSet, ToolbarEditWkspcName,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Edit current workspace name"),
+				3);
+
+	update();
+
+	if (toolbar->isOnTop())
+		setItemSelected(1, True);
+	if (toolbar->doAutoHide())
+		setItemSelected(2, True);
+}
+
+
+Toolbarmenu::~Toolbarmenu(void) {
+	delete placementmenu;
+}
+
+
+void Toolbarmenu::itemSelected(int button, int index) {
+	if (button == 1) {
+		BasemenuItem *item = find(index);
+		if (! item) return;
+
+		switch (item->function()) {
+		case 1: // always on top
+			{
+			Bool change = ((toolbar->isOnTop()) ? False : True);
+			toolbar->on_top = change;
+				setItemSelected(1, change);
+
+			if (toolbar->isOnTop()) toolbar->screen->raiseWindows((Window *) 0, 0);
+			break;
+			}
+
+		case 2: // auto hide
+			{
+	Bool change = ((toolbar->doAutoHide()) ?	False : True);
+	toolbar->do_auto_hide = change;
+	setItemSelected(2, change);
+
+#ifdef		SLIT
+	toolbar->screen->getSlit()->reposition();
+#endif // SLIT
+	break;
+			}
+
+		case 3: // edit current workspace name
+			toolbar->edit();	//set edit mode
+			hide();	//dont show menu while editing name
+
+			break;
+		}
+	}
+}
+
+
+void Toolbarmenu::internal_hide(void) {
+	Basemenu::internal_hide();
+	if (toolbar->doAutoHide() && ! toolbar->isEditing())
+		toolbar->hide_handler.timeout();
+}
+
+
+void Toolbarmenu::reconfigure(void) {
+	placementmenu->reconfigure();
+
+	Basemenu::reconfigure();
+}
+
+
+Toolbarmenu::Placementmenu::Placementmenu(Toolbarmenu *tm)
+	: Basemenu(tm->toolbar->screen) {
+	toolbarmenu = tm;
+	I18n *i18n = I18n::instance();
+	
+	setLabel(i18n->getMessage(
+#ifdef		NLS
+					ToolbarSet, ToolbarToolbarPlacement,
+#else // !NLS
+					0, 0,
+#endif // NLS
+					"Toolbar Placement"));
+	setInternalMenu();
+	setMinimumSublevels(3);
+
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementTopLeft,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Top Left"),
+				Toolbar::TopLeft);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementBottomLeft,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Bottom Left"),
+				Toolbar::BottomLeft);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementTopCenter,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Top Center"),
+				Toolbar::TopCenter);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementBottomCenter,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Bottom Center"),
+				Toolbar::BottomCenter);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementTopRight,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Top Right"),
+				Toolbar::TopRight);
+	insert(i18n->getMessage(
+#ifdef		NLS
+				CommonSet, CommonPlacementBottomRight,
+#else // !NLS
+				0, 0,
+#endif // NLS
+				"Bottom Right"),
+	Toolbar::BottomRight);
+
+	update();
+}
+
+
+void Toolbarmenu::Placementmenu::itemSelected(int button, int index) {
+	if (button == 1) {
+		BasemenuItem *item = find(index);
+		if (! item)
+			return;
+
+		toolbarmenu->toolbar->screen->saveToolbarPlacement(item->function());
+		hide();
+		toolbarmenu->toolbar->reconfigure();
+
+#ifdef		SLIT
+		// reposition the slit as well to make sure it doesn't intersect the
+		// toolbar
+		toolbarmenu->toolbar->screen->getSlit()->reposition();
+#endif // SLIT
+
+	}
+}
diff --git a/src/Toolbar.hh b/src/Toolbar.hh
new file mode 100644
index 00000000..d6e19db5
--- /dev/null
+++ b/src/Toolbar.hh
@@ -0,0 +1,163 @@
+// Toolbar.hh for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef   _TOOLBAR_HH_
+#define   _TOOLBAR_HH_
+
+#include 
+
+
+
+
+#include "Basemenu.hh"
+#include "LinkedList.hh"
+#include "Timer.hh"
+#include "IconBar.hh"
+
+
+// forward declaration
+class Toolbar;
+
+class Toolbarmenu : public Basemenu {
+private:
+  class Placementmenu : public Basemenu {
+  private:
+    Toolbarmenu *toolbarmenu;
+
+  protected:
+    virtual void itemSelected(int, int);
+
+  public:
+    Placementmenu(Toolbarmenu *);
+  };
+
+  Toolbar *toolbar;
+  Placementmenu *placementmenu;
+
+  friend class Placementmenu;
+  friend class Toolbar;
+
+
+protected:
+  virtual void itemSelected(int, int);
+  virtual void internal_hide(void);
+
+public:
+  Toolbarmenu(Toolbar *);
+  ~Toolbarmenu(void);
+
+  inline Basemenu *getPlacementmenu(void) { return placementmenu; }
+
+  void reconfigure(void);
+};
+
+
+class Toolbar : public TimeoutHandler {
+private:
+  Bool on_top, editing, hidden, do_auto_hide;
+  Display *display;
+
+  struct frame {
+    unsigned long button_pixel, pbutton_pixel;
+    Pixmap base, label, wlabel, clk, button, pbutton;
+    Window window, workspace_label, window_label, clock, psbutton, nsbutton,
+      pwbutton, nwbutton;
+
+    int x, y, x_hidden, y_hidden, hour, minute, grab_x, grab_y;
+    unsigned int width, height, window_label_w, workspace_label_w, clock_w,
+      button_w, bevel_w, label_h;
+  } frame;
+
+  class HideHandler : public TimeoutHandler {
+  public:
+    Toolbar *toolbar;
+
+    virtual void timeout(void);
+  } hide_handler;
+
+  Fluxbox *fluxbox;
+  BImageControl *image_ctrl;
+  BScreen *screen;
+  BTimer *clock_timer, *hide_timer;
+  Toolbarmenu *toolbarmenu;
+	class IconBar *iconbar;
+	
+  char *new_workspace_name, *new_name_pos;
+
+  friend class HideHandler;
+  friend class Toolbarmenu;
+  friend class Toolbarmenu::Placementmenu;
+
+
+public:
+  Toolbar(BScreen *);
+  virtual ~Toolbar(void);
+	void addIcon(FluxboxWindow *w);
+	void delIcon(FluxboxWindow *w);
+	
+  inline Toolbarmenu *getMenu(void) { return toolbarmenu; }
+	//inline Window getWindowLabel(void) { return frame.window_label; }
+  inline const Bool &isEditing(void) const { return editing; }
+  inline const Bool &isOnTop(void) const { return on_top; }
+  inline const Bool &isHidden(void) const { return hidden; }
+  inline const Bool &doAutoHide(void) const { return do_auto_hide; }
+
+  inline const Window &getWindowID(void) const { return frame.window; }
+
+  inline const unsigned int &getWidth(void) const { return frame.width; }
+  inline const unsigned int &getHeight(void) const { return frame.height; }
+  inline const unsigned int &getExposedHeight(void) const
+  { return ((do_auto_hide) ? frame.bevel_w : frame.height); }
+  inline const int &getX(void) const
+  { return ((hidden) ? frame.x_hidden : frame.x); }
+  inline const int &getY(void) const
+  { return ((hidden) ? frame.y_hidden : frame.y); }
+
+  void buttonPressEvent(XButtonEvent *);
+  void buttonReleaseEvent(XButtonEvent *);
+  void enterNotifyEvent(XCrossingEvent *);
+  void leaveNotifyEvent(XCrossingEvent *);
+  void exposeEvent(XExposeEvent *);
+  void keyPressEvent(XKeyEvent *);
+
+  void redrawWindowLabel(Bool = False);
+  void redrawWorkspaceLabel(Bool = False);
+  void redrawPrevWorkspaceButton(Bool = False, Bool = False);
+  void redrawNextWorkspaceButton(Bool = False, Bool = False);
+  void redrawPrevWindowButton(Bool = False, Bool = False);
+  void redrawNextWindowButton(Bool = False, Bool = False);
+  void edit(void);
+  void reconfigure(void);
+
+#ifdef    HAVE_STRFTIME
+  void checkClock(Bool = False);
+#else //  HAVE_STRFTIME
+  void checkClock(Bool = False, Bool = False);
+#endif // HAVE_STRFTIME
+
+  virtual void timeout(void);
+
+  enum { TopLeft = 1, BottomLeft, TopCenter,
+         BottomCenter, TopRight, BottomRight };
+};
+
+
+#endif // __Toolbar_hh
diff --git a/src/Window.cc b/src/Window.cc
new file mode 100644
index 00000000..a2aacf41
--- /dev/null
+++ b/src/Window.cc
@@ -0,0 +1,3312 @@
+// Window.cc for fluxbox
+// Copyright (c) 2001	Henrik Kinnunen (fluxgen@linuxmail.org)
+
+// Window.cc for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.	IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// stupid macros needed to access some functions in version 2 of the GNU C
+// library
+#ifndef	 _GNU_SOURCE
+#define	 _GNU_SOURCE
+#endif // _GNU_SOURCE
+
+#ifdef		HAVE_CONFIG_H
+#	include "../config.h"
+#endif // HAVE_CONFIG_H
+
+#include "i18n.hh"
+#include "fluxbox.hh"
+#include "Icon.hh"
+#include "Screen.hh"
+#include "Toolbar.hh"
+#include "Window.hh"
+#include "Windowmenu.hh"
+#include "Workspace.hh"
+
+
+#ifdef		SLIT
+#	include "Slit.hh"
+#endif // SLIT
+
+#include 
+#include 
+
+#ifdef		STDC_HEADERS
+#	include 
+#endif // STDC_HEADERS
+
+#ifdef		DEBUG
+#	ifdef		HAVE_STDIO_H
+#		include 
+#	endif // HAVE_STDIO_H
+#endif // DEBUG
+
+#include "misc.hh"
+
+using namespace std;
+
+FluxboxWindow::FluxboxWindow(Window w, BScreen *s) {
+
+#ifdef		DEBUG
+	fprintf(stderr,
+		I18n::instance()->
+		getMessage(
+#	ifdef		NLS
+				WindowSet, WindowCreating,
+#	else // !NLS
+				0, 0,
+#	endif // NLS
+				"FluxboxWindow::FluxboxWindow(): creating 0x%lx\n"),
+		w);
+#endif // DEBUG
+
+	Fluxbox *fluxbox = Fluxbox::instance();
+	display = fluxbox->getXDisplay();
+	
+	moving = resizing = shaded = maximized = visible = iconic = false;
+	transient = focused = stuck = modal =	send_focus_message = managed = false;
+
+	blackbox_attrib.workspace = workspace_number = window_number = -1;
+
+	blackbox_attrib.flags = blackbox_attrib.attrib = blackbox_attrib.stack = 0l;
+	blackbox_attrib.premax_x = blackbox_attrib.premax_y = 0;
+	blackbox_attrib.premax_w = blackbox_attrib.premax_h = 0;
+	//use tab as default
+	decorations.tab = true;
+	client.window = w;
+	tab = 0;
+	frame.window = frame.plate = frame.title = frame.handle = None;
+	frame.right_grip = frame.left_grip = None;
+
+	frame.utitle = frame.ftitle = frame.uhandle = frame.fhandle = None;
+	frame.ulabel = frame.flabel = frame.ubutton = frame.fbutton = None;
+	frame.pbutton = frame.ugrip = frame.fgrip = None;
+	
+	//get decorations
+	vector dir = fluxbox->getTitlebarLeft();
+	for (char c=0; c<2; c++) {
+		for (unsigned int i=0; igetTitlebarRight();
+	}
+	
+	decorations.menu = true;	//override menu option
+	
+	decorations.titlebar = decorations.border = decorations.handle = true;
+	functions.resize = functions.move = functions.iconify = functions.maximize = true;
+	functions.close = decorations.close = false;
+
+	client.wm_hint_flags = client.normal_hint_flags = 0;
+	client.transient_for = client.transient = 0;
+	client.title = 0;
+	client.title_len = 0;
+	client.icon_title = 0;
+	client.mwm_hint = (MwmHints *) 0;
+	client.blackbox_hint = (BlackboxHints *) 0;
+
+	windowmenu = 0;
+	lastButtonPressTime = 0;
+	timer = 0;
+	screen = 0;
+	image_ctrl = 0;
+
+	fluxbox->grab();
+	if (! validateClient()) 
+		return;
+
+	// fetch client size and placement
+	XWindowAttributes wattrib;
+	if ((! XGetWindowAttributes(display, client.window, &wattrib)) ||
+			(! wattrib.screen) || wattrib.override_redirect) {
+#ifdef		DEBUG
+		fprintf(stderr,
+						I18n::instance()->
+			getMessage(
+#	ifdef		NLS
+					 WindowSet, WindowXGetWindowAttributesFail,
+#	else // !NLS
+					 0, 0,
+#	endif // NLS
+					 "FluxboxWindow::FluxboxWindow(): XGetWindowAttributes "
+					 "failed\n"));
+#endif // DEBUG
+
+		delete this;
+
+		fluxbox->ungrab();
+		return;
+	}
+
+	if (s)
+		screen = s;
+	else
+		screen = fluxbox->searchScreen(RootWindowOfScreen(wattrib.screen));
+
+	if (! screen) {
+#ifdef		DEBUG
+		fprintf(stderr,
+			I18n::instance()->
+			getMessage(
+#	ifdef		NLS
+					WindowSet, WindowCannotFindScreen,
+#	else // !NLS
+					0, 0,
+#	endif // NLS
+					"FluxboxWindow::FluxboxWindow(): can't find screen\n"
+					"	for root window 0x%lx\n"),
+			RootWindowOfScreen(wattrib.screen));
+#endif // DEBUG
+		delete this;
+
+		fluxbox->ungrab();
+		return;
+	}
+
+	image_ctrl = screen->getImageControl();
+
+	client.x = wattrib.x;
+	client.y = wattrib.y;
+	client.width = wattrib.width;
+	client.height = wattrib.height;
+	client.old_bw = wattrib.border_width;
+
+	timer = new BTimer(fluxbox, this);
+	timer->setTimeout(fluxbox->getAutoRaiseDelay());
+	timer->fireOnce(true);
+
+	getBlackboxHints();
+	if (! client.blackbox_hint)
+		getMWMHints();
+
+	// get size, aspect, minimum/maximum size and other hints set by the
+	// client
+	getWMProtocols();
+	getWMHints();
+	getWMNormalHints();
+
+#ifdef		SLIT
+	if (client.initial_state == WithdrawnState) {
+		screen->getSlit()->addClient(client.window);
+		delete this;
+
+		fluxbox->ungrab();
+		return;
+	}
+#endif // SLIT
+
+	managed = true;
+	fluxbox->saveWindowSearch(client.window, this);
+
+	// determine if this is a transient window
+	Window win;
+	if (XGetTransientForHint(display, client.window, &win)) {	
+		if (win && (win != client.window)) {
+			FluxboxWindow *tr;
+			if ((tr = fluxbox->searchWindow(win))) {
+				
+				while (tr->client.transient) 
+					tr = tr->client.transient;
+				
+				client.transient_for = tr;
+				tr->client.transient = this;
+				stuck = client.transient_for->stuck;
+				transient = true;
+			} else if (win == client.window_group) {
+				if ((tr = fluxbox->searchGroup(win, this))) {
+					
+					while (tr->client.transient) 
+						tr = tr->client.transient;
+					
+					client.transient_for = tr;
+					tr->client.transient = this;
+					stuck = client.transient_for->stuck;
+					transient = true;
+				}
+			}
+		}
+
+		if (win == screen->getRootWindow()) modal = true;
+	}
+
+	// adjust the window decorations based on transience and window sizes
+	if (transient) {
+		decorations.maximize = decorations.handle =
+			decorations.border = functions.maximize = false;
+	}	
+	
+	if ((client.normal_hint_flags & PMinSize) &&
+			(client.normal_hint_flags & PMaxSize) &&
+			client.max_width <= client.min_width &&
+			client.max_height <= client.min_height) {
+		decorations.maximize = decorations.handle =
+			functions.resize = functions.maximize = false;
+			decorations.tab = false; //no tab for this window
+	}
+
+	upsize();
+
+	bool place_window = true;
+	if (fluxbox->isStartup() || transient ||
+			client.normal_hint_flags & (PPosition|USPosition)) {
+		setGravityOffsets();
+
+		if ((fluxbox->isStartup()) ||
+				(frame.x >= 0 &&
+				(signed) (frame.y + frame.y_border) >= 0 &&
+				frame.x <= (signed) screen->getWidth() &&
+				frame.y <= (signed) screen->getHeight()))
+			place_window = false;
+			
+	}
+
+	frame.window = createToplevelWindow(frame.x, frame.y, frame.width,
+							frame.height,
+							screen->getBorderWidth());	//create frame window
+	
+	fluxbox->saveWindowSearch(frame.window, this);	//save frame window
+
+	frame.plate = createChildWindow(frame.window); //Create plate window
+	fluxbox->saveWindowSearch(frame.plate, this);	//save plate window
+
+	if (decorations.titlebar) {	//have titlebar decorations?
+		frame.title = createChildWindow(frame.window); //create titlebar win
+		fluxbox->saveWindowSearch(frame.title, this);	//save titlebar win
+		frame.label = createChildWindow(frame.title); //create label win in titlebar
+		fluxbox->saveWindowSearch(frame.label, this);	//save label win
+	}
+
+	if (decorations.handle) {	//have handle decorations ?
+		frame.handle = createChildWindow(frame.window); //create handle win
+		fluxbox->saveWindowSearch(frame.handle, this);	//save handle win
+
+		frame.left_grip = // create left handle
+			createChildWindow(frame.handle, fluxbox->getLowerLeftAngleCursor());
+		fluxbox->saveWindowSearch(frame.left_grip, this); //save left handle
+
+		frame.right_grip = // create right handle
+			createChildWindow(frame.handle, fluxbox->getLowerRightAngleCursor());
+		fluxbox->saveWindowSearch(frame.right_grip, this); //save right handle
+	}
+
+	associateClientWindow();
+
+	if (! (screen->isSloppyFocus() || screen->isSemiSloppyFocus())) {
+		XGrabButton(display, Button1, AnyModifier, 
+				frame.plate, True, ButtonPressMask,
+				GrabModeSync, GrabModeSync, None, None);		
+		XUngrabButton(display, Button1, Mod1Mask|Mod2Mask|Mod3Mask, frame.plate);
+		
+	} else 
+		XUngrabButton(display, Button1, AnyModifier, frame.plate);
+	
+	XGrabButton(display, Button1, Mod1Mask, frame.window, True,
+				ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
+				GrabModeAsync, None, fluxbox->getMoveCursor());
+
+	//----grab with "all" modifiers
+	grabButton(display, Button1, frame.window, fluxbox->getMoveCursor());
+	
+	XGrabButton(display, Button2, Mod1Mask, frame.window, True,
+				ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, None);	
+		
+	XGrabButton(display, Button3, Mod1Mask, frame.window, True,
+				ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
+				GrabModeAsync, None, fluxbox->getLowerRightAngleCursor());
+	
+	//---grab with "all" modifiers
+	grabButton(display, Button3, frame.window, fluxbox->getLowerRightAngleCursor());
+				
+	positionWindows();
+
+	//use tab? delayed this so that tabs wont "flicker" when creating windows
+	if (decorations.tab && fluxbox->useTabs())
+		tab = new Tab(this, 0, 0);
+
+	XRaiseWindow(display, frame.plate);
+	XMapSubwindows(display, frame.plate);
+	if (decorations.titlebar)
+		XMapSubwindows(display, frame.title);
+	
+	XMapSubwindows(display, frame.window);
+
+	if (decorations.menu)
+		windowmenu = new Windowmenu(this);
+
+	decorate();
+
+	if (workspace_number < 0 || workspace_number >= screen->getCount())
+		screen->getCurrentWorkspace()->addWindow(this, place_window);
+	else
+		screen->getWorkspace(workspace_number)->addWindow(this, place_window);
+
+	configure(frame.x, frame.y, frame.width, frame.height);
+
+	if (shaded) {
+		shaded = false;
+		shade();
+	}
+
+	if (maximized && functions.maximize) {
+		int m = maximized;
+		maximized = false;
+
+		maximize(m);
+	}
+
+	setFocusFlag(false);
+/*
+#ifdef GNOME
+	//tell the creator of this window that we are a gnome compilant windowmanager
+	{
+	XChangeProperty(display, screen->getRootWindow(),
+			screen->getBaseDisplay()->getGnomeSupportingWMCheckAtom(),
+			XA_CARDINAL, 32,
+      PropModeReplace, (unsigned char *)&client.window, 1);	
+  XChangeProperty(display, client.window, 
+			screen->getBaseDisplay()->getGnomeSupportingWMCheckAtom(),
+			XA_CARDINAL, 32, PropModeReplace,
+		 	(unsigned char *)&client.window, 1);
+	}
+#endif
+*/
+	fluxbox->ungrab();
+	#ifdef DEBUG
+	fprintf(stderr, "%s(%d): FluxboxWindow(this=%p)\n", __FILE__, __LINE__, this);
+	#endif
+}
+
+
+FluxboxWindow::~FluxboxWindow(void) {
+	Fluxbox *fluxbox = Fluxbox::instance();
+	
+	
+	if (moving || resizing) {
+		screen->hideGeometry();
+		XUngrabPointer(display, CurrentTime);
+	}
+	
+	if (workspace_number != -1 && window_number != -1)
+		screen->getWorkspace(workspace_number)->removeWindow(this);
+	else if (iconic)
+		screen->removeIcon(this);
+	
+	if (timer) {
+		if (timer->isTiming()) timer->stop();
+		delete timer;
+	}
+
+	if (windowmenu)
+		delete windowmenu;
+
+	if (client.title)
+		delete [] client.title;
+
+	if (client.icon_title)
+		delete [] client.icon_title;
+
+	if (tab)
+		delete tab;	
+	
+	if (client.mwm_hint)
+		XFree(client.mwm_hint);
+
+	if (client.blackbox_hint)
+		XFree(client.blackbox_hint);		
+
+	
+	if (client.window_group)
+		fluxbox->removeGroupSearch(client.window_group);
+
+	if (transient && client.transient_for)
+		client.transient_for->client.transient = client.transient;
+	if (client.transient)
+		client.transient->client.transient_for = client.transient_for;
+	
+	while ( !buttonlist.empty()) {	//destroy all buttons on titlebar
+		fluxbox->removeWindowSearch(buttonlist.back().win);
+		XDestroyWindow(display, buttonlist.back().win);
+		buttonlist.pop_back();
+	}
+ 
+	if (frame.title) {
+		if (frame.ftitle)
+			image_ctrl->removeImage(frame.ftitle);
+
+		if (frame.utitle)
+			image_ctrl->removeImage(frame.utitle);
+
+		if (frame.flabel)
+			image_ctrl->removeImage(frame.flabel);
+
+		if( frame.ulabel)
+			image_ctrl->removeImage(frame.ulabel);
+
+		fluxbox->removeWindowSearch(frame.label);
+		fluxbox->removeWindowSearch(frame.title);
+		XDestroyWindow(display, frame.label);
+		XDestroyWindow(display, frame.title);
+	}
+
+	if (frame.handle) {
+		if (frame.fhandle)
+			image_ctrl->removeImage(frame.fhandle);
+
+		if (frame.uhandle)
+			image_ctrl->removeImage(frame.uhandle);
+
+		if (frame.fgrip)
+			image_ctrl->removeImage(frame.fgrip);
+
+		if (frame.ugrip)
+			image_ctrl->removeImage(frame.ugrip);
+
+		fluxbox->removeWindowSearch(frame.handle);
+		fluxbox->removeWindowSearch(frame.right_grip);
+		fluxbox->removeWindowSearch(frame.left_grip);
+		XDestroyWindow(display, frame.right_grip);
+		XDestroyWindow(display, frame.left_grip);
+		XDestroyWindow(display, frame.handle);
+	}
+
+	if (frame.fbutton)
+		image_ctrl->removeImage(frame.fbutton);
+
+	if (frame.ubutton)
+		image_ctrl->removeImage(frame.ubutton);
+
+	if (frame.pbutton)
+		image_ctrl->removeImage(frame.pbutton);
+
+	
+	if (frame.plate) {		//NOTE 
+		fluxbox->removeWindowSearch(frame.plate);
+		XDestroyWindow(display, frame.plate);
+	}
+
+	if (frame.window) {
+		fluxbox->removeWindowSearch(frame.window);
+		XDestroyWindow(display, frame.window);
+	}
+
+	if (managed) {
+		fluxbox->removeWindowSearch(client.window);
+		screen->removeNetizen(client.window);
+	}
+	//TODO: Move this to Workspace::removeWindow
+	if (client.transient_for)	
+		fluxbox->setFocusedWindow(client.transient_for);	
+	#ifdef DEBUG	
+	fprintf(stderr, "%s(%d): ~FluxboxWindow(this=%p) done\n", __FILE__, __LINE__, this);
+	#endif
+}
+
+
+Window FluxboxWindow::createToplevelWindow(int x, int y, unsigned int width,
+							unsigned int height,
+							unsigned int borderwidth)
+{
+	XSetWindowAttributes attrib_create;
+	unsigned long create_mask = CWBackPixmap | CWBorderPixel | CWColormap |
+															CWOverrideRedirect | CWEventMask;
+
+	attrib_create.background_pixmap = None;
+	attrib_create.colormap = screen->getColormap();
+	attrib_create.override_redirect = True;
+	attrib_create.event_mask = ButtonPressMask | ButtonReleaseMask |
+														 ButtonMotionMask | EnterWindowMask;
+
+	return (XCreateWindow(display, screen->getRootWindow(), x, y, width, height,
+			borderwidth, screen->getDepth(), InputOutput,
+			screen->getVisual(), create_mask,
+			&attrib_create));
+}
+
+
+Window FluxboxWindow::createChildWindow(Window parent, Cursor cursor) {
+	XSetWindowAttributes attrib_create;
+	unsigned long create_mask = CWBackPixmap | CWBorderPixel |
+															CWEventMask;
+
+	attrib_create.background_pixmap = None;
+	attrib_create.event_mask = ButtonPressMask | ButtonReleaseMask |
+														 ButtonMotionMask | ExposureMask |
+														 EnterWindowMask | LeaveWindowMask;
+
+	if (cursor) {
+		create_mask |= CWCursor;
+		attrib_create.cursor = cursor;
+	}
+
+	return (XCreateWindow(display, parent, 0, 0, 1, 1, 0,
+			screen->getDepth(), InputOutput, screen->getVisual(),
+			create_mask, &attrib_create));
+}
+
+
+void FluxboxWindow::associateClientWindow(void) {
+	XSetWindowBorderWidth(display, client.window, 0);
+	getWMName();
+	getWMIconName();
+
+	XChangeSaveSet(display, client.window, SetModeInsert);
+	XSetWindowAttributes attrib_set;
+
+	XSelectInput(display, frame.plate, NoEventMask);
+	XReparentWindow(display, client.window, frame.plate, 0, 0);
+	XSelectInput(display, frame.plate, SubstructureRedirectMask);
+
+	XFlush(display);
+
+	attrib_set.event_mask = PropertyChangeMask | StructureNotifyMask |
+													FocusChangeMask;
+	attrib_set.do_not_propagate_mask = ButtonPressMask | ButtonReleaseMask |
+																		 ButtonMotionMask;
+
+	XChangeWindowAttributes(display, client.window, CWEventMask|CWDontPropagate,
+													&attrib_set);
+
+#ifdef		SHAPE
+	if (Fluxbox::instance()->hasShapeExtensions()) {
+		XShapeSelectInput(display, client.window, ShapeNotifyMask);
+
+		int foo;
+		unsigned int ufoo;
+
+		XShapeQueryExtents(display, client.window, &frame.shaped, &foo, &foo,
+							&ufoo, &ufoo, &foo, &foo, &foo, &ufoo, &ufoo);
+
+		if (frame.shaped) {
+			XShapeCombineShape(display, frame.window, ShapeBounding,
+						frame.mwm_border_w, frame.y_border +
+						frame.mwm_border_w, client.window,
+						ShapeBounding, ShapeSet);
+
+			int num = 1;
+			XRectangle xrect[2];
+			xrect[0].x = xrect[0].y = 0;
+			xrect[0].width = frame.width;
+			xrect[0].height = frame.y_border;
+
+			if (decorations.handle) {
+				xrect[1].x = 0;
+				xrect[1].y = frame.y_handle;
+				xrect[1].width = frame.width;
+				xrect[1].height = frame.handle_h + screen->getBorderWidth();
+				num++;
+			}
+
+			XShapeCombineRectangles(display, frame.window, ShapeBounding, 0, 0,
+					xrect, num, ShapeUnion, Unsorted);
+		}
+	}
+#endif // SHAPE
+	//create the buttons
+	if (decorations.iconify) 
+		createButton(Fluxbox::Minimize, FluxboxWindow::iconifyPressed_cb, FluxboxWindow::iconifyButton_cb, FluxboxWindow::iconifyDraw_cb);			
+	if (decorations.maximize)
+		createButton(Fluxbox::Maximize, FluxboxWindow::maximizePressed_cb, FluxboxWindow::maximizeButton_cb, 
+				FluxboxWindow::maximizeDraw_cb);
+	if (decorations.close) 
+		createButton(Fluxbox::Close, FluxboxWindow::closePressed_cb, 
+				FluxboxWindow::closeButton_cb, FluxboxWindow::closeDraw_cb);		
+	if (decorations.sticky)
+		createButton(Fluxbox::Stick, FluxboxWindow::stickyPressed_cb, 
+				FluxboxWindow::stickyButton_cb, FluxboxWindow::stickyDraw_cb);
+
+	if (decorations.menu)//TODO
+		createButton(Fluxbox::Menu, 0, 0, 0);
+
+	if (decorations.shade)
+		createButton(Fluxbox::Shade, 0, FluxboxWindow::shadeButton_cb, FluxboxWindow::shadeDraw_cb);
+
+	if (frame.ubutton) {
+		for (unsigned int i=0; idecorate();
+
+	Pixmap tmp = frame.fbutton;
+	BTexture *texture = &(screen->getWindowStyle()->b_focus);
+	if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+		frame.fbutton = None;
+		frame.fbutton_pixel = texture->getColor()->getPixel();
+	} else
+		frame.fbutton =
+			image_ctrl->renderImage(frame.button_w, frame.button_h, texture);
+	if (tmp) image_ctrl->removeImage(tmp);
+
+	tmp = frame.ubutton;
+	texture = &(screen->getWindowStyle()->b_unfocus);
+	if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+		frame.ubutton = None;
+		frame.ubutton_pixel = texture->getColor()->getPixel();
+	} else
+		frame.ubutton =
+			image_ctrl->renderImage(frame.button_w, frame.button_h, texture);
+	if (tmp) image_ctrl->removeImage(tmp);
+
+	tmp = frame.pbutton;
+	texture = &(screen->getWindowStyle()->b_pressed);
+	if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+		frame.pbutton = None;
+		frame.pbutton_pixel = texture->getColor()->getPixel();
+	} else
+		frame.pbutton =
+			image_ctrl->renderImage(frame.button_w, frame.button_h, texture);
+	if (tmp) image_ctrl->removeImage(tmp);
+
+	if (decorations.titlebar) {
+		tmp = frame.ftitle;
+		texture = &(screen->getWindowStyle()->t_focus);
+		if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+			frame.ftitle = None;
+			frame.ftitle_pixel = texture->getColor()->getPixel();
+		} else
+			frame.ftitle =
+				image_ctrl->renderImage(frame.width, frame.title_h, texture);
+		
+		if (tmp) 
+			image_ctrl->removeImage(tmp);
+
+		tmp = frame.utitle;
+		texture = &(screen->getWindowStyle()->t_unfocus);
+		if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+			frame.utitle = None;
+			frame.utitle_pixel = texture->getColor()->getPixel();
+		} else
+			frame.utitle =
+				image_ctrl->renderImage(frame.width, frame.title_h, texture);
+		if (tmp) image_ctrl->removeImage(tmp);
+
+		XSetWindowBorder(display, frame.title,
+										 screen->getBorderColor()->getPixel());
+
+		decorateLabel();
+		
+	}
+
+	if (decorations.border) {
+		frame.fborder_pixel = screen->getWindowStyle()->f_focus.getPixel();
+		frame.uborder_pixel = screen->getWindowStyle()->f_unfocus.getPixel();
+	}
+
+	if (decorations.handle) {
+		tmp = frame.fhandle;
+		texture = &(screen->getWindowStyle()->h_focus);
+		if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+			frame.fhandle = None;
+			frame.fhandle_pixel = texture->getColor()->getPixel();
+		} else
+			frame.fhandle =
+				image_ctrl->renderImage(frame.width, frame.handle_h, texture);
+		if (tmp) image_ctrl->removeImage(tmp);
+
+		tmp = frame.uhandle;
+		texture = &(screen->getWindowStyle()->h_unfocus);
+		if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+			frame.uhandle = None;
+			frame.uhandle_pixel = texture->getColor()->getPixel();
+		} else
+			frame.uhandle =
+				image_ctrl->renderImage(frame.width, frame.handle_h, texture);
+		if (tmp)
+			image_ctrl->removeImage(tmp);
+
+		tmp = frame.fgrip;
+		texture = &(screen->getWindowStyle()->g_focus);
+		if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+			frame.fgrip = None;
+			frame.fgrip_pixel = texture->getColor()->getPixel();
+		} else
+			frame.fgrip =
+				image_ctrl->renderImage(frame.grip_w, frame.grip_h, texture);
+		if (tmp)
+			image_ctrl->removeImage(tmp);
+
+		tmp = frame.ugrip;
+		texture = &(screen->getWindowStyle()->g_unfocus);
+		if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+			frame.ugrip = None;
+			frame.ugrip_pixel = texture->getColor()->getPixel();
+		} else
+			frame.ugrip =
+				image_ctrl->renderImage(frame.grip_w, frame.grip_h, texture);
+		if (tmp) image_ctrl->removeImage(tmp);
+
+		XSetWindowBorder(display, frame.handle,
+										 screen->getBorderColor()->getPixel());
+		XSetWindowBorder(display, frame.left_grip,
+										 screen->getBorderColor()->getPixel());
+		XSetWindowBorder(display, frame.right_grip,
+										 screen->getBorderColor()->getPixel());
+	}
+		
+	XSetWindowBorder(display, frame.window,
+									 screen->getBorderColor()->getPixel());
+}
+
+
+void FluxboxWindow::decorateLabel(void) {
+	Pixmap tmp = frame.flabel;
+	BTexture *texture = &(screen->getWindowStyle()->l_focus);
+	if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+		frame.flabel = None;
+		frame.flabel_pixel = texture->getColor()->getPixel();		
+	} else
+		frame.flabel = image_ctrl->renderImage(frame.label_w, frame.label_h, texture);
+			
+	if (tmp) image_ctrl->removeImage(tmp);
+
+	tmp = frame.ulabel;
+	texture = &(screen->getWindowStyle()->l_unfocus);
+	if (texture->getTexture() == (BImage_Flat | BImage_Solid)) {
+		frame.ulabel = None;
+		frame.ulabel_pixel = texture->getColor()->getPixel();
+	} else
+		frame.ulabel = image_ctrl->renderImage(frame.label_w, frame.label_h, texture);
+		
+	if (tmp) image_ctrl->removeImage(tmp);
+}
+
+void FluxboxWindow::createButton(int type, ButtonEventProc pressed, ButtonEventProc released, ButtonDrawProc draw) {
+	Button b;
+	b.win = createChildWindow(frame.title);
+	Fluxbox::instance()->saveWindowSearch(b.win, this);
+	b.type = type;
+	b.used = true;
+	b.draw = draw;
+	b.pressed = pressed;
+	b.released = released;
+	buttonlist.push_back(b);
+}
+
+Window FluxboxWindow::findTitleButton(int type) {
+	for (unsigned int i=0; istick();
+	FluxboxWindow::stickyDraw_cb(t, be->window, false);
+}
+
+void FluxboxWindow::stickyPressed_cb(FluxboxWindow *t, XButtonEvent *be) {
+	FluxboxWindow::stickyDraw_cb(t, be->window, true);
+}
+
+void FluxboxWindow::iconifyButton_cb(FluxboxWindow *t, XButtonEvent *be) {
+	t->iconify();
+	FluxboxWindow::iconifyDraw_cb(t, be->window, false);
+}
+
+void FluxboxWindow::iconifyPressed_cb(FluxboxWindow *t, XButtonEvent *be) {
+	t->screen->getWorkspace(t->workspace_number)->lowerWindow(t);
+	FluxboxWindow::iconifyDraw_cb(t, be->window, true);
+}
+
+void FluxboxWindow::maximizeButton_cb(FluxboxWindow *t, XButtonEvent *be) {
+ FluxboxWindow::maximizeDraw_cb(t, be->window, false);
+ t->maximize(be->button); 
+}
+
+void FluxboxWindow::maximizePressed_cb(FluxboxWindow *t, XButtonEvent *be) {
+ FluxboxWindow::maximizeDraw_cb(t, be->window, true); 
+}
+
+void FluxboxWindow::closeButton_cb(FluxboxWindow *t, XButtonEvent *be) {
+	t->close();
+	FluxboxWindow::closeDraw_cb(t, be->window, false);
+}
+
+void FluxboxWindow::closePressed_cb(FluxboxWindow *t, XButtonEvent *be) {
+	FluxboxWindow::closeDraw_cb(t, be->window, true);
+}
+
+void FluxboxWindow::shadeButton_cb(FluxboxWindow *t, XButtonEvent *be) {
+	FluxboxWindow::shadeDraw_cb(t, be->window, false);
+	t->shade();
+	if (t->tab)
+		t->tab->shade();
+}
+
+void FluxboxWindow::stickyDraw_cb(FluxboxWindow *t, Window w, bool pressed) {
+	t->drawButtonBase(w, pressed);
+	if (t->stuck) {
+		XFillRectangle(t->display, w, 
+								((t->focused) ? t->screen->getWindowStyle()->b_pic_focus_gc :
+					t->screen->getWindowStyle()->b_pic_unfocus_gc),
+					t->frame.button_w/2-t->frame.button_w/4, t->frame.button_h/2-t->frame.button_h/4,
+					t->frame.button_w/2, t->frame.button_h/2);
+	} else {
+		XFillRectangle(t->display, w, 
+								((t->focused) ? t->screen->getWindowStyle()->b_pic_focus_gc :
+					t->screen->getWindowStyle()->b_pic_unfocus_gc),
+					t->frame.button_w/2, t->frame.button_h/2,
+					t->frame.button_w/5, t->frame.button_h/5);
+	}
+}
+
+void FluxboxWindow::iconifyDraw_cb(FluxboxWindow *t, Window w, bool pressed) {
+	t->drawButtonBase(w, pressed);
+	XDrawRectangle(t->display, w,
+			((t->focused) ? t->screen->getWindowStyle()->b_pic_focus_gc :
+			t->screen->getWindowStyle()->b_pic_unfocus_gc),
+			2, t->frame.button_h - 5, t->frame.button_w - 5, 2);
+
+}
+
+void FluxboxWindow::maximizeDraw_cb(FluxboxWindow *t, Window w, bool pressed) {
+	t->drawButtonBase(w, pressed);
+	XDrawRectangle(t->display, w,
+		((t->focused) ? t->screen->getWindowStyle()->b_pic_focus_gc :
+			t->screen->getWindowStyle()->b_pic_unfocus_gc),
+			2, 2, t->frame.button_w - 5, t->frame.button_h - 5);
+	XDrawLine(t->display, w,
+			((t->focused) ? t->screen->getWindowStyle()->b_pic_focus_gc :
+				t->screen->getWindowStyle()->b_pic_unfocus_gc),
+			2, 3, t->frame.button_w - 3, 3);
+}
+
+void FluxboxWindow::closeDraw_cb(FluxboxWindow *t, Window w, bool pressed) {
+	t->drawButtonBase(w, pressed);
+	XDrawLine(t->display, w,
+			((t->focused) ? t->screen->getWindowStyle()->b_pic_focus_gc :
+				t->screen->getWindowStyle()->b_pic_unfocus_gc), 2, 2,
+				t->frame.button_w - 3, t->frame.button_h - 3);
+	XDrawLine(t->display, w,
+			((t->focused) ? t->screen->getWindowStyle()->b_pic_focus_gc :
+				t->screen->getWindowStyle()->b_pic_unfocus_gc), 2,
+				t->frame.button_h - 3,
+				t->frame.button_w - 3, 2);
+}
+
+void FluxboxWindow::shadeDraw_cb(FluxboxWindow *t, Window w, bool pressed) {
+	t->drawButtonBase(w, pressed);
+}
+
+void FluxboxWindow::grabButton(Display *display, unsigned int button, 
+				Window window, Cursor cursor) {
+
+	//numlock
+	XGrabButton(display, button, Mod1Mask|Mod2Mask, window, True,
+				ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
+				GrabModeAsync, None, cursor);
+	//scrolllock
+	XGrabButton(display, button, Mod1Mask|Mod5Mask, window, True,
+				ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
+				GrabModeAsync, None, cursor);
+	
+	//capslock
+	XGrabButton(display, button, Mod1Mask|LockMask, window, True,
+				ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
+				GrabModeAsync, None, cursor);
+
+	//capslock+numlock
+	XGrabButton(display, Button1, Mod1Mask|LockMask|Mod2Mask, window, True,
+				ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
+				GrabModeAsync, None, cursor);
+
+	//capslock+scrolllock
+	XGrabButton(display, button, Mod1Mask|LockMask|Mod5Mask, window, True,
+				ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
+				GrabModeAsync, None, cursor);
+	
+	//capslock+numlock+scrolllock
+	XGrabButton(display, button, Mod1Mask|LockMask|Mod2Mask|Mod5Mask, window, True,
+				ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
+				GrabModeAsync, None, cursor);
+
+	//numlock+scrollLock
+	XGrabButton(display, button, Mod1Mask|Mod2Mask|Mod5Mask, window, True,
+				ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
+				GrabModeAsync, None, cursor);
+	
+}
+
+void FluxboxWindow::drawButtonBase(Window w, bool pressed) {
+	if (! pressed) {
+		if (focused) {
+			if (frame.fbutton)
+				XSetWindowBackgroundPixmap(display, w, frame.fbutton);
+			else
+				XSetWindowBackground(display, w, frame.fbutton_pixel);
+		} else {
+			if (frame.ubutton)
+				XSetWindowBackgroundPixmap(display, w, frame.ubutton);
+			else
+				XSetWindowBackground(display, w, frame.ubutton_pixel);
+		}
+	} else {
+		if (frame.pbutton)
+			XSetWindowBackgroundPixmap(display, w, frame.pbutton);
+		else
+			XSetWindowBackground(display, w, frame.pbutton_pixel);
+	}
+	XClearWindow(display, w);
+
+}
+
+void FluxboxWindow::positionButtons(bool redecorate_label) {
+	unsigned int bw = frame.button_w + frame.bevel_w + 1,
+		by = frame.bevel_w + 1, lx = by, lw = frame.width - by;	
+	Fluxbox *fluxbox = Fluxbox::instance();
+	vector left = fluxbox->getTitlebarLeft();
+	vector right = fluxbox->getTitlebarRight();
+
+	//left side buttons
+	for (unsigned int i=0; i=0; i--) {
+		Window w = findTitleButton(right[i]);	//get window of button
+		if (w) {
+			XMoveResizeWindow(display, w, bx, by,
+					frame.button_w, frame.button_h);
+			XMapWindow(display, w);
+			XClearWindow(display, w);
+			bx -= bw;
+			lw -= bw;
+		}
+	}
+	
+	//Draw the label
+	frame.label_w = lw - by;
+	XMoveResizeWindow(display, frame.label, lx, frame.bevel_w,
+										frame.label_w, frame.label_h);
+	if (redecorate_label) 
+		decorateLabel();
+	if (tab) {
+		tab->setPosition();
+		tab->draw(false);
+	}
+	redrawLabel();
+	redrawAllButtons();
+}
+
+
+void FluxboxWindow::reconfigure(void) {
+	upsize();
+	
+	if (Fluxbox::instance()->useTabs()) {
+		//no tab and we allowed to use tab? then create it 
+		if (!tab && decorations.tab) {			
+			tab = new Tab(this, 0, 0);		
+			if (current_state == IconicState)
+				tab->iconify();
+			else if (current_state == WithdrawnState)
+				tab->withdraw();
+		}
+	}	else {		
+		if (tab) { //got a tab? then destroy it
+			delete tab;
+			tab=0;
+		}
+	}
+	
+	client.x = frame.x + frame.mwm_border_w + screen->getBorderWidth();
+	client.y = frame.y + frame.y_border + frame.mwm_border_w +
+			 screen->getBorderWidth();
+
+	if (client.title) {
+		if (I18n::instance()->multibyte()) {
+			XRectangle ink, logical;
+			XmbTextExtents(screen->getWindowStyle()->font.set,
+					client.title, client.title_len, &ink, &logical);
+			client.title_text_w = logical.width;
+		} else {
+			client.title_text_w = XTextWidth(screen->getWindowStyle()->font.fontstruct,
+					client.title, client.title_len);
+		}
+
+		client.title_text_w += (frame.bevel_w * 4);
+	}
+
+		
+	positionWindows();
+	decorate();
+
+				
+	XClearWindow(display, frame.window);
+	setFocusFlag(focused);
+
+	configure(frame.x, frame.y, frame.width, frame.height);
+
+	if (! (screen->isSloppyFocus() || screen->isSemiSloppyFocus())) {
+		XGrabButton(display, Button1, AnyModifier, frame.plate, True, ButtonPressMask,
+				GrabModeSync, GrabModeSync, None, None);
+		XUngrabButton(display, Button1, Mod1Mask|Mod2Mask|Mod3Mask, frame.plate);
+	} else		
+		XUngrabButton(display, Button1, AnyModifier, frame.plate);
+
+	if (windowmenu) {
+		windowmenu->move(windowmenu->getX(), frame.y + frame.title_h);
+		windowmenu->reconfigure();
+	}
+		
+	
+}
+
+
+void FluxboxWindow::positionWindows(void) {
+	XResizeWindow(display, frame.window, frame.width,
+							((shaded) ? frame.title_h : frame.height));
+	XSetWindowBorderWidth(display, frame.window, screen->getBorderWidth());
+	XSetWindowBorderWidth(display, frame.plate, screen->getFrameWidth() *
+			decorations.border);
+	XMoveResizeWindow(display, frame.plate, 0, frame.y_border,
+								client.width, client.height);
+	XMoveResizeWindow(display, client.window, 0, 0, client.width, client.height);
+
+	if (decorations.titlebar) {
+		XSetWindowBorderWidth(display, frame.title, screen->getBorderWidth());
+		XMoveResizeWindow(display, frame.title, -screen->getBorderWidth(),
+					-screen->getBorderWidth(), frame.width, frame.title_h);
+
+		positionButtons();
+	} else if (frame.title)
+		XUnmapWindow(display, frame.title);
+
+	if (decorations.handle) {
+		XSetWindowBorderWidth(display, frame.handle, screen->getBorderWidth());
+		XSetWindowBorderWidth(display, frame.left_grip, screen->getBorderWidth());
+		XSetWindowBorderWidth(display, frame.right_grip, screen->getBorderWidth());
+
+		XMoveResizeWindow(display, frame.handle, -screen->getBorderWidth(),
+											frame.y_handle - screen->getBorderWidth(),
+								frame.width, frame.handle_h);
+		XMoveResizeWindow(display, frame.left_grip, -screen->getBorderWidth(),
+						-screen->getBorderWidth(), frame.grip_w, frame.grip_h);
+		XMoveResizeWindow(display, frame.right_grip,
+						frame.width - frame.grip_w - screen->getBorderWidth(),
+						-screen->getBorderWidth(), frame.grip_w, frame.grip_h);
+		XMapSubwindows(display, frame.handle);
+	} else if (frame.handle)
+		XUnmapWindow(display, frame.handle);
+	if (tab)
+		tab->setPosition();
+}
+
+
+void FluxboxWindow::getWMName(void) {
+	if (client.title) {
+		delete [] client.title;
+		client.title = 0;
+	}
+
+	XTextProperty text_prop;
+	char **list;
+	int num;
+	I18n *i18n = I18n::instance();
+	
+	if (XGetWMName(display, client.window, &text_prop)) {
+		if (text_prop.value && text_prop.nitems > 0) {
+			if (text_prop.encoding != XA_STRING) {
+				
+				text_prop.nitems = strlen((char *) text_prop.value);
+				
+				if ((XmbTextPropertyToTextList(display, &text_prop,
+							&list, &num) == Success) &&
+						(num > 0) && *list) {
+					client.title = bstrdup(*list);
+					XFreeStringList(list);
+				} else
+					client.title = bstrdup((char *) text_prop.value);
+					
+			} else
+				client.title = bstrdup((char *) text_prop.value);
+
+			XFree((char *) text_prop.value);
+		} else
+			client.title = bstrdup(i18n->getMessage(
+#ifdef		NLS
+									WindowSet, WindowUnnamed,
+#else // !NLS
+									0, 0,
+#endif //
+									"Unnamed"));
+	} else {
+		client.title = bstrdup(i18n->getMessage(
+#ifdef		NLS
+							WindowSet, WindowUnnamed,
+#else // !NLS
+							0, 0,
+#endif //
+							"Unnamed"));
+	}
+	
+	client.title_len = strlen(client.title);
+
+	if (i18n->multibyte()) {
+		XRectangle ink, logical;
+		XmbTextExtents(screen->getWindowStyle()->font.set,
+				client.title, client.title_len, &ink, &logical);
+		client.title_text_w = logical.width;
+	} else {
+		client.title_len = strlen(client.title);
+		client.title_text_w = XTextWidth(screen->getWindowStyle()->font.fontstruct,
+							client.title, client.title_len);
+	}
+
+	client.title_text_w += (frame.bevel_w * 4);
+}
+
+
+void FluxboxWindow::getWMIconName(void) {
+	if (client.icon_title) {
+		delete [] client.icon_title;
+		client.icon_title = (char *) 0;
+	}
+
+	XTextProperty text_prop;
+	char **list;
+	int num;
+
+	if (XGetWMIconName(display, client.window, &text_prop)) {
+		if (text_prop.value && text_prop.nitems > 0) {
+			if (text_prop.encoding != XA_STRING) {
+				text_prop.nitems = strlen((char *) text_prop.value);
+
+				if ((XmbTextPropertyToTextList(display, &text_prop,
+						&list, &num) == Success) &&
+						(num > 0) && *list) {
+					client.icon_title = bstrdup(*list);
+					XFreeStringList(list);
+				} else
+					client.icon_title = bstrdup((char *) text_prop.value);
+			} else
+				client.icon_title = bstrdup((char *) text_prop.value);
+
+			XFree((char *) text_prop.value);
+		} else
+				client.icon_title = bstrdup(client.title);
+	} else
+		client.icon_title = bstrdup(client.title);
+}
+
+
+void FluxboxWindow::getWMProtocols(void) {
+	Atom *proto;
+	int num_return = 0;
+	Fluxbox *fluxbox = Fluxbox::instance();
+	
+	if (XGetWMProtocols(display, client.window, &proto, &num_return)) {
+		for (int i = 0; i < num_return; ++i) {
+			if (proto[i] == fluxbox->getWMDeleteAtom())
+				functions.close = decorations.close = true;
+			else if (proto[i] == fluxbox->getWMTakeFocusAtom())
+				send_focus_message = true;
+			else if (proto[i] == fluxbox->getFluxboxStructureMessagesAtom())
+				screen->addNetizen(new Netizen(screen, client.window));
+		}
+
+		XFree(proto);
+	}
+}
+
+
+void FluxboxWindow::getWMHints(void) {
+	XWMHints *wmhint = XGetWMHints(display, client.window);
+	if (! wmhint) {
+		visible = true;
+		iconic = false;
+		focus_mode = F_Passive;
+		client.window_group = None;
+		client.initial_state = NormalState;
+	} else {
+		client.wm_hint_flags = wmhint->flags;
+		if (wmhint->flags & InputHint) {
+			if (wmhint->input == true) {
+				if (send_focus_message)
+					focus_mode = F_LocallyActive;
+				else
+					focus_mode = F_Passive;
+			} else {
+				if (send_focus_message)
+					focus_mode = F_GloballyActive;
+				else
+					focus_mode = F_NoInput;
+			}
+		} else
+			focus_mode = F_Passive;
+
+		if (wmhint->flags & StateHint)
+			client.initial_state = wmhint->initial_state;
+		else
+			client.initial_state = NormalState;
+
+		if (wmhint->flags & WindowGroupHint) {
+			if (! client.window_group) {
+				client.window_group = wmhint->window_group;
+				Fluxbox::instance()->saveGroupSearch(client.window_group, this);
+			}
+		} else
+			client.window_group = None;
+
+		XFree(wmhint);
+	}
+}
+
+
+void FluxboxWindow::getWMNormalHints(void) {
+	long icccm_mask;
+	XSizeHints sizehint;
+	if (! XGetWMNormalHints(display, client.window, &sizehint, &icccm_mask)) {
+		client.min_width = client.min_height =
+			client.base_width = client.base_height =
+			client.width_inc = client.height_inc = 1;
+		client.max_width = screen->getWidth();
+		client.max_height = screen->getHeight();
+		client.min_aspect_x = client.min_aspect_y =
+			client.max_aspect_x = client.max_aspect_y = 1;
+		client.win_gravity = NorthWestGravity;
+	} else {
+		client.normal_hint_flags = sizehint.flags;
+
+		if (sizehint.flags & PMinSize) {
+			client.min_width = sizehint.min_width;
+			client.min_height = sizehint.min_height;
+		} else
+			client.min_width = client.min_height = 1;
+
+		if (sizehint.flags & PMaxSize) {
+			client.max_width = sizehint.max_width;
+			client.max_height = sizehint.max_height;
+		} else {
+			client.max_width = screen->getWidth();
+			client.max_height = screen->getHeight();
+		}
+
+		if (sizehint.flags & PResizeInc) {
+			client.width_inc = sizehint.width_inc;
+			client.height_inc = sizehint.height_inc;
+		} else
+			client.width_inc = client.height_inc = 1;
+
+		if (sizehint.flags & PAspect) {
+			client.min_aspect_x = sizehint.min_aspect.x;
+			client.min_aspect_y = sizehint.min_aspect.y;
+			client.max_aspect_x = sizehint.max_aspect.x;
+			client.max_aspect_y = sizehint.max_aspect.y;
+		} else
+			client.min_aspect_x = client.min_aspect_y =
+	client.max_aspect_x = client.max_aspect_y = 1;
+
+		if (sizehint.flags & PBaseSize) {
+			client.base_width = sizehint.base_width;
+			client.base_height = sizehint.base_height;
+		} else
+			client.base_width = client.base_height = 0;
+
+		if (sizehint.flags & PWinGravity)
+			client.win_gravity = sizehint.win_gravity;
+		else
+			client.win_gravity = NorthWestGravity;
+	}
+}
+
+
+void FluxboxWindow::getMWMHints(void) {
+	int format;
+	Atom atom_return;
+	unsigned long num, len;
+	Fluxbox *fluxbox = Fluxbox::instance();
+	if (XGetWindowProperty(display, client.window,
+												 fluxbox->getMotifWMHintsAtom(), 0,
+												 PropMwmHintsElements, false,
+												 fluxbox->getMotifWMHintsAtom(), &atom_return,
+												 &format, &num, &len,
+												 (unsigned char **) &client.mwm_hint) == Success &&
+			client.mwm_hint)
+		if (num == PropMwmHintsElements) {
+			if (client.mwm_hint->flags & MwmHintsDecorations)
+				if (client.mwm_hint->decorations & MwmDecorAll)
+					decorations.titlebar = decorations.handle = decorations.border =
+						decorations.iconify = decorations.maximize =
+						decorations.close = decorations.menu = true;
+				else {
+					decorations.titlebar = decorations.handle = decorations.border =
+						decorations.iconify = decorations.maximize =
+						decorations.close = decorations.menu = false;
+
+					if (client.mwm_hint->decorations & MwmDecorBorder)
+						decorations.border = true;
+					if (client.mwm_hint->decorations & MwmDecorHandle)
+						decorations.handle = true;
+					if (client.mwm_hint->decorations & MwmDecorTitle)
+						decorations.titlebar = true;
+					if (client.mwm_hint->decorations & MwmDecorMenu)
+						decorations.menu = true;
+					if (client.mwm_hint->decorations & MwmDecorIconify)
+						decorations.iconify = true;
+					if (client.mwm_hint->decorations & MwmDecorMaximize)
+						decorations.maximize = true;
+				}
+
+			if (client.mwm_hint->flags & MwmHintsFunctions)
+				if (client.mwm_hint->functions & MwmFuncAll)
+					functions.resize = functions.move = functions.iconify =
+						functions.maximize = functions.close = true;
+				else {
+					functions.resize = functions.move = functions.iconify =
+						functions.maximize = functions.close = false;
+
+					if (client.mwm_hint->functions & MwmFuncResize)
+						functions.resize = true;
+					if (client.mwm_hint->functions & MwmFuncMove)
+						functions.move = true;
+					if (client.mwm_hint->functions & MwmFuncIconify)
+						functions.iconify = true;
+					if (client.mwm_hint->functions & MwmFuncMaximize)
+						functions.maximize = true;
+					if (client.mwm_hint->functions & MwmFuncClose)
+						functions.close = true;
+				}
+		}
+}
+
+
+void FluxboxWindow::getBlackboxHints(void) {
+	int format;
+	Atom atom_return;
+	unsigned long num, len;
+	Fluxbox *fluxbox = Fluxbox::instance();
+	
+	if (XGetWindowProperty(display, client.window,
+												 fluxbox->getFluxboxHintsAtom(), 0,
+												 PropBlackboxHintsElements, false,
+												 fluxbox->getFluxboxHintsAtom(), &atom_return,
+												 &format, &num, &len,
+												 (unsigned char **) &client.blackbox_hint) == Success &&
+			client.blackbox_hint)
+		if (num == PropBlackboxHintsElements) {
+			if (client.blackbox_hint->flags & AttribShaded)
+				shaded = (client.blackbox_hint->attrib & AttribShaded);
+
+			if ((client.blackbox_hint->flags & AttribMaxHoriz) &&
+					(client.blackbox_hint->flags & AttribMaxVert))
+				maximized = ((client.blackbox_hint->attrib &
+											(AttribMaxHoriz | AttribMaxVert)) ?	1 : 0);
+			else if (client.blackbox_hint->flags & AttribMaxVert)
+				maximized = ((client.blackbox_hint->attrib & AttribMaxVert) ? 2 : 0);
+			else if (client.blackbox_hint->flags & AttribMaxHoriz)
+				maximized = ((client.blackbox_hint->attrib & AttribMaxHoriz) ? 3 : 0);
+
+			if (client.blackbox_hint->flags & AttribOmnipresent)
+				stuck = (client.blackbox_hint->attrib & AttribOmnipresent);
+
+			if (client.blackbox_hint->flags & AttribWorkspace)
+				workspace_number = client.blackbox_hint->workspace;
+
+
+			if (client.blackbox_hint->flags & AttribDecoration) {
+				switch (client.blackbox_hint->decoration) {
+				case DecorNone:
+					decorations.titlebar = decorations.border = decorations.handle =
+						decorations.iconify = decorations.maximize =
+						decorations.menu = false;
+					functions.resize = functions.move = functions.iconify =
+						functions.maximize = false;
+
+					break;
+
+				default:
+				case DecorNormal:
+					decorations.titlebar = decorations.border = decorations.handle =
+						decorations.iconify = decorations.maximize =
+						decorations.menu = true;
+					functions.resize = functions.move = functions.iconify =
+						functions.maximize = true;
+
+					break;
+
+				case DecorTiny:
+					decorations.titlebar = decorations.iconify = decorations.menu =
+						functions.move = functions.iconify = true;
+					decorations.border = decorations.handle = decorations.maximize =
+						functions.resize = functions.maximize = false;
+
+					break;
+
+				case DecorTool:
+					decorations.titlebar = decorations.menu = functions.move = true;
+					decorations.iconify = decorations.border = decorations.handle =
+						decorations.maximize = functions.resize = functions.maximize =
+						functions.iconify = false;
+
+					break;
+				}
+
+				reconfigure();
+			}
+		}
+}
+
+
+void FluxboxWindow::configure(int dx, int dy,
+							 unsigned int dw, unsigned int dh) {
+	bool send_event = (frame.x != dx || frame.y != dy);
+
+	if ((dw != frame.width) || (dh != frame.height)) {
+		if ((((signed) frame.width) + dx) < 0) dx = 0;
+		if ((((signed) frame.height) + dy) < 0) dy = 0;
+
+		frame.x = dx;
+		frame.y = dy;
+		frame.width = dw;
+		frame.height = dh;
+
+		downsize();
+
+#ifdef		SHAPE
+		if (Fluxbox::instance()->hasShapeExtensions() && frame.shaped) {
+			XShapeCombineShape(display, frame.window, ShapeBounding,
+ 						 frame.mwm_border_w, frame.y_border +
+			 frame.mwm_border_w, client.window,
+			 ShapeBounding, ShapeSet);
+
+			int num = 1;
+			XRectangle xrect[2];
+			xrect[0].x = xrect[0].y = 0;
+			xrect[0].width = frame.width;
+			xrect[0].height = frame.y_border;
+
+			if (decorations.handle) {
+				xrect[1].x = 0;
+				xrect[1].y = frame.y_handle;
+				xrect[1].width = frame.width;
+				xrect[1].height = frame.handle_h + screen->getBorderWidth();
+				num++;
+			}
+
+			XShapeCombineRectangles(display, frame.window, ShapeBounding, 0, 0,
+						xrect, num, ShapeUnion, Unsorted);
+		}
+#endif // SHAPE
+
+		XMoveResizeWindow(display, frame.window, frame.x, frame.y,
+							frame.width, frame.height);
+		positionWindows();
+		decorate();
+		setFocusFlag(focused);
+		redrawAllButtons();
+		shaded = false;
+	} else {
+		frame.x = dx;
+		frame.y = dy;
+
+		XMoveWindow(display, frame.window, frame.x, frame.y);
+		//move the tab and the chain		
+		if (tab)
+			tab->setPosition();
+		
+		if (! moving) send_event = true;
+	}
+
+	if (send_event && ! moving) {
+		client.x = dx + frame.mwm_border_w + screen->getBorderWidth();
+		client.y = dy + frame.y_border + frame.mwm_border_w +
+							 screen->getBorderWidth();
+
+		XEvent event;
+		event.type = ConfigureNotify;
+
+		event.xconfigure.display = display;
+		event.xconfigure.event = client.window;
+		event.xconfigure.window = client.window;
+		event.xconfigure.x = client.x;
+		event.xconfigure.y = client.y;
+		event.xconfigure.width = client.width;
+		event.xconfigure.height = client.height;
+		event.xconfigure.border_width = client.old_bw;
+		event.xconfigure.above = frame.window;
+		event.xconfigure.override_redirect = false;
+
+		XSendEvent(display, client.window, True, NoEventMask, &event);
+
+		screen->updateNetizenConfigNotify(&event);
+	}
+}
+
+
+bool FluxboxWindow::setInputFocus(void) {
+	if (((signed) (frame.x + frame.width)) < 0) {
+		if (((signed) (frame.y + frame.y_border)) < 0)
+			configure(screen->getBorderWidth(), screen->getBorderWidth(),
+								frame.width, frame.height);
+		else if (frame.y > (signed) screen->getHeight())
+			configure(screen->getBorderWidth(), screen->getHeight() - frame.height,
+								frame.width, frame.height);
+		else
+			configure(screen->getBorderWidth(), frame.y + screen->getBorderWidth(),
+								frame.width, frame.height);
+	} else if (frame.x > (signed) screen->getWidth()) {
+		if (((signed) (frame.y + frame.y_border)) < 0)
+			configure(screen->getWidth() - frame.width, screen->getBorderWidth(),
+								frame.width, frame.height);
+		else if (frame.y > (signed) screen->getHeight())
+			configure(screen->getWidth() - frame.width,
+					screen->getHeight() - frame.height, frame.width, frame.height);
+		else
+			configure(screen->getWidth() - frame.width,
+								frame.y + screen->getBorderWidth(), frame.width, frame.height);
+	}
+
+	Fluxbox *fluxbox = Fluxbox::instance();
+	
+	fluxbox->grab();
+	if (! validateClient()) return false;
+
+	bool ret = false;
+
+	if (client.transient && modal)
+		ret = client.transient->setInputFocus();
+	else {
+		if (! focused) {
+			if (focus_mode == F_LocallyActive || focus_mode == F_Passive)
+				XSetInputFocus(display, client.window,
+											RevertToPointerRoot, CurrentTime);
+			else
+				XSetInputFocus(display, screen->getRootWindow(),
+											RevertToNone, CurrentTime);
+
+			fluxbox->setFocusedWindow(this);
+			
+			if (send_focus_message) {
+				XEvent ce;
+				ce.xclient.type = ClientMessage;
+				ce.xclient.message_type = fluxbox->getWMProtocolsAtom();
+				ce.xclient.display = display;
+				ce.xclient.window = client.window;
+				ce.xclient.format = 32;
+				ce.xclient.data.l[0] = fluxbox->getWMTakeFocusAtom();
+				ce.xclient.data.l[1] = fluxbox->getLastTime();
+				ce.xclient.data.l[2] = 0l;
+				ce.xclient.data.l[3] = 0l;
+				ce.xclient.data.l[4] = 0l;
+				XSendEvent(display, client.window, false, NoEventMask, &ce);
+			}
+
+			if ((screen->isSloppyFocus() || screen->isSemiSloppyFocus())
+					&& screen->doAutoRaise())
+				timer->start();
+
+			ret = true;
+		}
+	}
+
+	fluxbox->ungrab();
+
+	return ret;
+}
+
+//------------ setTab --------------
+// Enables or disables the tab on the window
+//----------------------------------
+void FluxboxWindow::setTab(bool flag) {
+	if (flag) {
+		if (!tab)
+			tab = new Tab(this, 0, 0);
+	} else if (tab) {
+		delete tab;
+		tab = 0;		
+	}	
+	decorations.tab = flag;
+}
+
+void FluxboxWindow::iconify(void) {
+	if (iconic) return;
+
+	if (windowmenu)
+		windowmenu->hide();
+
+	setState(IconicState);
+
+	XSelectInput(display, client.window, NoEventMask);
+	XUnmapWindow(display, client.window);
+	XSelectInput(display, client.window,
+					PropertyChangeMask | StructureNotifyMask | FocusChangeMask);
+
+	XUnmapWindow(display, frame.window);
+	visible = false;
+	iconic = true;
+	
+	screen->getWorkspace(workspace_number)->removeWindow(this);
+
+	if (transient && client.transient_for) {
+		if (! client.transient_for->iconic)
+			client.transient_for->iconify();
+	}
+	screen->addIcon(this);
+
+	if (tab) //if this window got a tab then iconify it too
+		tab->iconify();
+		
+	if (client.transient)
+		if (! client.transient->iconic)
+			client.transient->iconify();
+}
+
+
+void FluxboxWindow::deiconify(bool reassoc, bool raise) {
+	if (iconic || reassoc)
+		screen->reassociateWindow(this, -1, false);
+	else if (workspace_number != screen->getCurrentWorkspace()->getWorkspaceID())
+		return;
+
+	setState(NormalState);
+
+	XSelectInput(display, client.window, NoEventMask);
+	XMapWindow(display, client.window);
+	XSelectInput(display, client.window,
+							 PropertyChangeMask | StructureNotifyMask | FocusChangeMask);
+
+	XMapSubwindows(display, frame.window);
+	XMapWindow(display, frame.window);
+
+	if (iconic && screen->doFocusNew()) setInputFocus();
+
+	visible = true;
+	iconic = false;
+
+	if (reassoc && client.transient) client.transient->deiconify(true, false);
+	
+	if (tab)
+		tab->deiconify();
+			
+	if (raise) {		
+		screen->getWorkspace(workspace_number)->raiseWindow(this);
+		if (tab)
+			tab->raise();
+	}
+}
+
+
+void FluxboxWindow::close(void) {
+	Fluxbox *fluxbox = Fluxbox::instance();
+	XEvent ce;
+	ce.xclient.type = ClientMessage;
+	ce.xclient.message_type = fluxbox->getWMProtocolsAtom();
+	ce.xclient.display = display;
+	ce.xclient.window = client.window;
+	ce.xclient.format = 32;
+	ce.xclient.data.l[0] = fluxbox->getWMDeleteAtom();
+	ce.xclient.data.l[1] = CurrentTime;
+	ce.xclient.data.l[2] = 0l;
+	ce.xclient.data.l[3] = 0l;
+	ce.xclient.data.l[4] = 0l;
+	XSendEvent(display, client.window, false, NoEventMask, &ce);
+}
+
+
+void FluxboxWindow::withdraw(void) {
+	visible = false;
+	iconic = false;
+
+	setState(WithdrawnState);
+	XUnmapWindow(display, frame.window);
+
+	XSelectInput(display, client.window, NoEventMask);
+	XUnmapWindow(display, client.window);
+	XSelectInput(display, client.window,
+				PropertyChangeMask | StructureNotifyMask | FocusChangeMask);
+
+	if (windowmenu)
+		windowmenu->hide();
+	
+	if (tab)
+		tab->withdraw();
+}
+
+
+void FluxboxWindow::maximize(unsigned int button) {
+	if (! maximized) {
+		int dx, dy;
+		unsigned int dw, dh;
+
+		blackbox_attrib.premax_x = frame.x;
+		blackbox_attrib.premax_y = frame.y;
+		blackbox_attrib.premax_w = frame.width;
+		blackbox_attrib.premax_h = frame.height;
+
+		dw = screen->getWidth();
+		dw -= screen->getBorderWidth2x();
+		dw -= frame.mwm_border_w * 2;
+		dw -= client.base_width;
+
+		dh = screen->getHeight();
+		dh -= screen->getBorderWidth2x();
+		dh -= frame.mwm_border_w * 2;
+		dh -= ((frame.handle_h + screen->getBorderWidth()) * decorations.handle);
+		dh -= client.base_height;
+		dh -= frame.y_border;
+
+		if (! screen->doFullMax())
+			dh -= screen->getToolbar()->getExposedHeight() +
+						screen->getBorderWidth();
+
+		if (dw < client.min_width) dw = client.min_width;
+		if (dh < client.min_height) dh = client.min_height;
+		if (dw > client.max_width) dw = client.max_width;
+		if (dh > client.max_height) dh = client.max_height;
+
+		dw -= (dw % client.width_inc);
+		dw += client.base_width;
+		dh -= (dh % client.height_inc);
+		dh += client.base_height;
+
+		dw += frame.mwm_border_w * 2;
+
+		dh += frame.y_border;
+		dh += (frame.handle_h + screen->getBorderWidth());
+		dh += frame.mwm_border_w * 2;
+
+		dx = ((screen->getWidth() - dw) / 2) - screen->getBorderWidth();
+
+		if (screen->doFullMax()) {
+			dy = ((screen->getHeight() - dh) / 2) - screen->getBorderWidth();
+		} else {
+			dy = (((screen->getHeight() - screen->getToolbar()->getExposedHeight())
+			 - dh) / 2) - screen->getBorderWidth();
+
+			switch (screen->getToolbarPlacement()) {
+			case Toolbar::TopLeft:
+			case Toolbar::TopCenter:
+			case Toolbar::TopRight:
+				dy += screen->getToolbar()->getExposedHeight() +
+						screen->getBorderWidth();
+				break;
+			}
+		}
+
+		if (decorations.tab && Fluxbox::instance()->useTabs()) { // Want to se the tabs
+			switch(screen->getTabPlacement()) {			
+			case Tab::PTop:
+				dy += Fluxbox::instance()->getTabHeight(); 
+				dh -= Fluxbox::instance()->getTabHeight() + screen->getBorderWidth();
+				break;
+			case Tab::PLeft:
+				if (screen->isTabRotateVertical()) {
+					dx += Fluxbox::instance()->getTabHeight();
+					dw -= Fluxbox::instance()->getTabHeight();
+				} else {
+					dx += Fluxbox::instance()->getTabWidth();
+					dw -= Fluxbox::instance()->getTabWidth();
+				}	
+				break;
+			case Tab::PRight:
+				if (screen->isTabRotateVertical())
+					dw -= Fluxbox::instance()->getTabHeight();
+				else
+					dw -= Fluxbox::instance()->getTabWidth();	
+				break;
+			case Tab::PBottom:
+				dh -= Fluxbox::instance()->getTabHeight() + screen->getBorderWidth();
+				break;
+			default:
+				dy += Fluxbox::instance()->getTabHeight();
+				dh -= Fluxbox::instance()->getTabHeight() + screen->getBorderWidth();
+				break;
+			}
+		}
+
+		if (button == 2) { //expand max width
+			dw = frame.width;
+			dx = frame.x;
+		} else if (button == 3) { //expand max height
+			dh = frame.height;
+			dy = frame.y;
+		}
+
+		switch(button) {
+		case 1:
+			blackbox_attrib.flags |= AttribMaxHoriz | AttribMaxVert;
+			blackbox_attrib.attrib |= AttribMaxHoriz | AttribMaxVert;
+
+			break;
+
+		case 2:
+			blackbox_attrib.flags |= AttribMaxVert;
+			blackbox_attrib.attrib |= AttribMaxVert;
+
+			break;
+
+		case 3:
+			blackbox_attrib.flags |= AttribMaxHoriz;
+			blackbox_attrib.attrib |= AttribMaxHoriz;
+
+			break;
+		}
+
+		if (shaded) {
+			blackbox_attrib.flags ^= AttribShaded;
+			blackbox_attrib.attrib ^= AttribShaded;
+			shaded = false;
+		}
+
+		maximized = true;
+
+		configure(dx, dy, dw, dh);
+		if (tab)
+			tab->raise();
+		screen->getWorkspace(workspace_number)->raiseWindow(this);
+		setState(current_state);
+	} else {
+		maximized = false;
+
+		blackbox_attrib.flags &= ! (AttribMaxHoriz | AttribMaxVert);
+		blackbox_attrib.attrib &= ! (AttribMaxHoriz | AttribMaxVert);
+
+		configure(blackbox_attrib.premax_x, blackbox_attrib.premax_y,
+				blackbox_attrib.premax_w, blackbox_attrib.premax_h);
+
+		blackbox_attrib.premax_x = blackbox_attrib.premax_y = 0;
+		blackbox_attrib.premax_w = blackbox_attrib.premax_h = 0;
+
+		redrawAllButtons();
+		setState(current_state);
+	}
+	if (tab) //resize all the windows in the tab group
+		tab->resize();
+}
+
+
+void FluxboxWindow::setWorkspace(int n) {
+	workspace_number = n;
+
+	blackbox_attrib.flags |= AttribWorkspace;
+	blackbox_attrib.workspace = workspace_number;
+}
+
+
+void FluxboxWindow::shade(void) {
+	if (decorations.titlebar)
+		if (shaded) {
+			XResizeWindow(display, frame.window, frame.width, frame.height);
+			shaded = false;
+			blackbox_attrib.flags ^= AttribShaded;
+			blackbox_attrib.attrib ^= AttribShaded;
+
+			setState(NormalState);
+		} else {
+			XResizeWindow(display, frame.window, frame.width, frame.title_h);
+			shaded = true;
+			blackbox_attrib.flags |= AttribShaded;
+			blackbox_attrib.attrib |= AttribShaded;
+
+			setState(IconicState);
+		}
+}
+
+
+void FluxboxWindow::stick(void) {
+
+	if (tab) //if it got a tab then do tab's stick on all of the objects in the list
+		tab->stick(); //this window will stick too.
+	else if (stuck) {
+		blackbox_attrib.flags ^= AttribOmnipresent;
+		blackbox_attrib.attrib ^= AttribOmnipresent;
+
+		stuck = false;
+
+		if (! iconic)
+			screen->reassociateWindow(this, -1, true);
+
+		
+	} else {
+		stuck = true;
+
+		blackbox_attrib.flags |= AttribOmnipresent;
+		blackbox_attrib.attrib |= AttribOmnipresent;
+
+	}
+	
+	setState(current_state);
+}
+
+
+void FluxboxWindow::setFocusFlag(bool focus) {
+	focused = focus;
+
+	if (decorations.titlebar) {
+		if (focused) {
+			if (frame.ftitle)
+				XSetWindowBackgroundPixmap(display, frame.title, frame.ftitle);
+			else
+				XSetWindowBackground(display, frame.title, frame.ftitle_pixel);
+		} else {
+			if (frame.utitle)
+				XSetWindowBackgroundPixmap(display, frame.title, frame.utitle);
+			else
+				XSetWindowBackground(display, frame.title, frame.utitle_pixel);
+		}
+		XClearWindow(display, frame.title);
+		
+		redrawLabel();
+		redrawAllButtons();
+	}
+
+	if (decorations.handle) {
+		if (focused) {
+			if (frame.fhandle)
+				XSetWindowBackgroundPixmap(display, frame.handle, frame.fhandle);
+			else
+				XSetWindowBackground(display, frame.handle, frame.fhandle_pixel);
+
+			if (frame.fgrip) {
+				XSetWindowBackgroundPixmap(display, frame.right_grip, frame.fgrip);
+				XSetWindowBackgroundPixmap(display, frame.left_grip, frame.fgrip);
+			} else {
+				XSetWindowBackground(display, frame.right_grip, frame.fgrip_pixel);
+				XSetWindowBackground(display, frame.left_grip, frame.fgrip_pixel);
+			}
+		} else {
+			if (frame.uhandle)
+				XSetWindowBackgroundPixmap(display, frame.handle, frame.uhandle);
+			else
+				XSetWindowBackground(display, frame.handle, frame.uhandle_pixel);
+
+			if (frame.ugrip) {
+				XSetWindowBackgroundPixmap(display, frame.right_grip, frame.ugrip);
+				XSetWindowBackgroundPixmap(display, frame.left_grip, frame.ugrip);
+			} else {
+				XSetWindowBackground(display, frame.right_grip, frame.ugrip_pixel);
+				XSetWindowBackground(display, frame.left_grip, frame.ugrip_pixel);
+			}
+		}
+		XClearWindow(display, frame.handle);
+		XClearWindow(display, frame.right_grip);
+		XClearWindow(display, frame.left_grip);
+	}
+	
+	if (tab)
+		tab->focus();
+	
+	if (decorations.border) {
+		if (focused)
+			XSetWindowBorder(display, frame.plate, frame.fborder_pixel);
+		else
+			XSetWindowBorder(display, frame.plate, frame.uborder_pixel);
+	}
+
+	if ((screen->isSloppyFocus() || screen->isSemiSloppyFocus()) &&
+			screen->doAutoRaise())
+		timer->stop();
+}
+
+
+void FluxboxWindow::installColormap(bool install) {
+	Fluxbox *fluxbox = Fluxbox::instance();
+	fluxbox->grab();
+	if (! validateClient()) return;
+
+	int i = 0, ncmap = 0;
+	Colormap *cmaps = XListInstalledColormaps(display, client.window, &ncmap);
+	XWindowAttributes wattrib;
+	if (cmaps) {
+		if (XGetWindowAttributes(display, client.window, &wattrib)) {
+			if (install) {
+				// install the window's colormap
+				for (i = 0; i < ncmap; i++) {
+					if (*(cmaps + i) == wattrib.colormap) {
+						// this window is using an installed color map... do not install
+						install = false;
+						break; //end for-loop (we dont need to check more)
+					}
+				}
+				// otherwise, install the window's colormap
+				if (install)
+					XInstallColormap(display, wattrib.colormap);
+			} else {				
+				for (i = 0; i < ncmap; i++) // uninstall the window's colormap
+					if (*(cmaps + i) == wattrib.colormap)						
+						XUninstallColormap(display, wattrib.colormap); // we found the colormap to uninstall
+			}
+		}
+
+		XFree(cmaps);
+	}
+
+	fluxbox->ungrab();
+}
+
+
+void FluxboxWindow::setState(unsigned long new_state) {
+	current_state = new_state;
+	Fluxbox *fluxbox = Fluxbox::instance();
+	unsigned long state[2];
+	state[0] = (unsigned long) current_state;
+	state[1] = (unsigned long) None;
+	XChangeProperty(display, client.window, fluxbox->getWMStateAtom(),
+			fluxbox->getWMStateAtom(), 32, PropModeReplace,
+			(unsigned char *) state, 2);
+
+	XChangeProperty(display, client.window, fluxbox->getFluxboxAttributesAtom(),
+					fluxbox->getFluxboxAttributesAtom(), 32, PropModeReplace,
+					(unsigned char *) &blackbox_attrib, PropBlackboxAttributesElements);
+}
+
+
+bool FluxboxWindow::getState(void) {
+	current_state = 0;
+
+	Atom atom_return;
+	bool ret = false;
+	int foo;
+	unsigned long *state, ulfoo, nitems;
+	Fluxbox *fluxbox = Fluxbox::instance();
+	if ((XGetWindowProperty(display, client.window, fluxbox->getWMStateAtom(),
+				0l, 2l, false, fluxbox->getWMStateAtom(),
+				&atom_return, &foo, &nitems, &ulfoo,
+				(unsigned char **) &state) != Success) ||
+			(! state)) {
+			fluxbox->ungrab();
+			return false;
+	}
+
+	if (nitems >= 1) {
+		current_state = static_cast(state[0]);
+		ret = true;
+	}
+
+	XFree(static_cast(state));
+
+	return ret;
+}
+
+
+void FluxboxWindow::setGravityOffsets(void) {
+	// translate x coordinate
+	switch (client.win_gravity) {
+		// handle Westward gravity
+	case NorthWestGravity:
+	case WestGravity:
+	case SouthWestGravity:
+	default:
+		frame.x = client.x;
+			break;
+
+		// handle Eastward gravity
+	case NorthEastGravity:
+	case EastGravity:
+	case SouthEastGravity:
+		frame.x = (client.x + client.width) - frame.width;
+		break;
+
+		// no x translation desired - default
+	case StaticGravity:
+	case ForgetGravity:
+	case CenterGravity:
+		frame.x = client.x - frame.mwm_border_w + screen->getBorderWidth();
+	}
+
+	// translate y coordinate
+	switch (client.win_gravity) {
+		// handle Northbound gravity
+	case NorthWestGravity:
+	case NorthGravity:
+	case NorthEastGravity:
+	default:
+		frame.y = client.y;
+		break;
+
+		// handle Southbound gravity
+	case SouthWestGravity:
+	case SouthGravity:
+	case SouthEastGravity:
+		frame.y = (client.y + client.height) - frame.height;
+		break;
+
+		// no y translation desired - default
+	case StaticGravity:
+	case ForgetGravity:
+	case CenterGravity:
+		frame.y = client.y - frame.y_border - frame.mwm_border_w -
+			screen->getBorderWidth();
+		break;
+	}
+}
+
+
+void FluxboxWindow::restoreAttributes(void) {
+	if (! getState()) current_state = NormalState;
+
+	Atom atom_return;
+	int foo;
+	unsigned long ulfoo, nitems;
+	Fluxbox *fluxbox = Fluxbox::instance();
+	
+	BlackboxAttributes *net;
+	if (XGetWindowProperty(display, client.window,
+			 fluxbox->getFluxboxAttributesAtom(), 0l,
+			 PropBlackboxAttributesElements, false,
+			 fluxbox->getFluxboxAttributesAtom(), &atom_return, &foo,
+			 &nitems, &ulfoo, (unsigned char **) &net) ==
+			Success && net && nitems == PropBlackboxAttributesElements) {
+		blackbox_attrib.flags = net->flags;
+		blackbox_attrib.attrib = net->attrib;
+		blackbox_attrib.workspace = net->workspace;
+		blackbox_attrib.stack = net->stack;
+		blackbox_attrib.premax_x = net->premax_x;
+		blackbox_attrib.premax_y = net->premax_y;
+		blackbox_attrib.premax_w = net->premax_w;
+		blackbox_attrib.premax_h = net->premax_h;
+
+		XFree(static_cast(net));
+	} else
+		return;
+
+	if (blackbox_attrib.flags & AttribShaded &&
+			blackbox_attrib.attrib & AttribShaded) {
+		int save_state =
+			((current_state == IconicState) ? NormalState : current_state);
+
+		shaded = false;
+		shade();
+		if (tab)
+			tab->shade();
+			
+		current_state = save_state;
+	}
+
+	if (((int) blackbox_attrib.workspace != screen->getCurrentWorkspaceID()) &&
+			((int) blackbox_attrib.workspace < screen->getCount())) {
+		screen->reassociateWindow(this, blackbox_attrib.workspace, true);
+
+		if (current_state == NormalState) current_state = WithdrawnState;
+	} else if (current_state == WithdrawnState)
+		current_state = NormalState;
+
+	if (blackbox_attrib.flags & AttribOmnipresent &&
+			blackbox_attrib.attrib & AttribOmnipresent) {
+		stuck = false;
+		stick();
+
+		current_state = NormalState;
+	}
+
+	if ((blackbox_attrib.flags & AttribMaxHoriz) ||
+			(blackbox_attrib.flags & AttribMaxVert)) {
+		int x = blackbox_attrib.premax_x, y = blackbox_attrib.premax_y;
+		unsigned int w = blackbox_attrib.premax_w, h = blackbox_attrib.premax_h;
+		maximized = false;
+
+		int m;
+		if ((blackbox_attrib.flags & AttribMaxHoriz) &&
+				(blackbox_attrib.flags & AttribMaxVert))
+			m = ((blackbox_attrib.attrib & (AttribMaxHoriz | AttribMaxVert)) ?
+					 1 : 0);
+		else if (blackbox_attrib.flags & AttribMaxVert)
+			m = ((blackbox_attrib.attrib & AttribMaxVert) ? 2 : 0);
+		else if (blackbox_attrib.flags & AttribMaxHoriz)
+			m = ((blackbox_attrib.attrib & AttribMaxHoriz) ? 3 : 0);
+		else
+			m = 0;
+
+		if (m) maximize(m);
+
+		blackbox_attrib.premax_x = x;
+		blackbox_attrib.premax_y = y;
+		blackbox_attrib.premax_w = w;
+		blackbox_attrib.premax_h = h;
+	}
+
+	setState(current_state);
+}
+
+
+void FluxboxWindow::restoreGravity(void) {
+	// restore x coordinate
+	switch (client.win_gravity) {
+		// handle Westward gravity
+	case NorthWestGravity:
+	case WestGravity:
+	case SouthWestGravity:
+	default:
+		client.x = frame.x;
+		break;
+
+		// handle Eastward gravity
+	case NorthEastGravity:
+	case EastGravity:
+	case SouthEastGravity:
+		client.x = (frame.x + frame.width) - client.width;
+		break;
+	}
+
+	// restore y coordinate
+	switch (client.win_gravity) {
+		// handle Northbound gravity
+	case NorthWestGravity:
+	case NorthGravity:
+	case NorthEastGravity:
+	default:
+		client.y = frame.y;
+		break;
+
+		// handle Southbound gravity
+	case SouthWestGravity:
+	case SouthGravity:
+	case SouthEastGravity:
+		client.y = (frame.y + frame.height) - client.height;
+		break;
+	}
+}
+
+
+void FluxboxWindow::redrawLabel(void) {
+	if (focused) {
+		if (frame.flabel)
+			XSetWindowBackgroundPixmap(display, frame.label, frame.flabel);
+		else
+			XSetWindowBackground(display, frame.label, frame.flabel_pixel);
+	} else {
+		if (frame.ulabel)
+			XSetWindowBackgroundPixmap(display, frame.label, frame.ulabel);
+		else
+			XSetWindowBackground(display, frame.label, frame.ulabel_pixel);
+	}
+	
+	GC gc = ((focused) ? screen->getWindowStyle()->l_text_focus_gc :
+			 screen->getWindowStyle()->l_text_unfocus_gc);
+	
+	DrawString(display, frame.label, gc,
+			&screen->getWindowStyle()->font, 
+			client.title_text_w, frame.label_w,
+			frame.bevel_w, client.title);
+	
+
+}
+
+
+void FluxboxWindow::redrawAllButtons(void) {
+	for (unsigned int i=0; iwindow == client.window) {
+#ifdef		DEBUG
+		fprintf(stderr,
+			I18n::instance()->getMessage(
+#ifdef		NLS
+					 WindowSet, WindowMapRequest,
+#else // !NLS
+					 0, 0,
+#endif // NLS
+					 "FluxboxWindow::mapRequestEvent() for 0x%lx\n"),
+						client.window);
+#endif // DEBUG
+		Fluxbox *fluxbox = Fluxbox::instance();
+		
+		fluxbox->grab();
+		if (! validateClient()) return;
+
+		bool get_state_ret = getState();
+		if (! (get_state_ret && fluxbox->isStartup())) {
+			if ((client.wm_hint_flags & StateHint) &&
+					(! (current_state == NormalState || current_state == IconicState)))
+				current_state = client.initial_state;
+			else
+				current_state = NormalState;
+		} else if (iconic)
+			current_state = NormalState;
+
+		switch (current_state) {
+		case IconicState:
+			iconify();
+
+			break;
+
+		case WithdrawnState:
+			withdraw();
+
+			break;
+
+		case NormalState:
+		case InactiveState:
+		case ZoomState:
+		default:
+			deiconify(false);
+
+			break;
+		}
+
+		fluxbox->ungrab();
+	}
+}
+
+
+void FluxboxWindow::mapNotifyEvent(XMapEvent *ne) {
+	
+	if ((ne->window == client.window) && (! ne->override_redirect) && (visible)) {
+		Fluxbox *fluxbox = Fluxbox::instance();
+		fluxbox->grab();
+		if (! validateClient())
+			return;
+
+		if (decorations.titlebar)
+			positionButtons();
+
+		setState(NormalState);		
+			
+		redrawAllButtons();
+
+		if (transient || screen->doFocusNew())
+			setInputFocus();
+		else
+			setFocusFlag(false);			
+		
+
+		visible = true;
+		iconic = false;
+
+		fluxbox->ungrab();
+	}
+}
+
+
+void FluxboxWindow::unmapNotifyEvent(XUnmapEvent *ue) {
+	if (ue->window == client.window) {
+#ifdef		DEBUG
+		fprintf(stderr,
+			I18n::instance()->getMessage(
+#ifdef		NLS
+					 WindowSet, WindowUnmapNotify,
+#else // !NLS
+					 0, 0,
+#endif // NLS
+					 "FluxboxWindow::unmapNotifyEvent() for 0x%lx\n"),
+						client.window);
+#endif // DEBUG
+
+		Fluxbox *fluxbox = Fluxbox::instance();
+		fluxbox->grab();
+		if (! validateClient()) return;
+
+		XChangeSaveSet(display, client.window, SetModeDelete);
+		XSelectInput(display, client.window, NoEventMask);
+
+		XDeleteProperty(display, client.window, fluxbox->getWMStateAtom());
+		XDeleteProperty(display, client.window, fluxbox->getFluxboxAttributesAtom());
+
+		XUnmapWindow(display, frame.window);
+		XUnmapWindow(display, client.window);
+
+		XEvent dummy;
+		if (! XCheckTypedWindowEvent(display, client.window, ReparentNotify,
+				 &dummy)) {
+#ifdef		DEBUG
+			fprintf(stderr,
+				I18n::instance()->getMessage(
+#ifdef		NLS
+						 WindowSet, WindowUnmapNotifyReparent,
+#else // !NLS
+						 0, 0,
+#endif // NLS
+						 "FluxboxWindow::unmapNotifyEvent(): reparent 0x%lx to "
+						 "root.\n"), client.window);
+#endif // DEBUG
+
+			restoreGravity();
+			XReparentWindow(display, client.window, screen->getRootWindow(),
+				client.x, client.y);
+		}
+
+		XFlush(display);
+
+		fluxbox->ungrab();
+
+		delete this;
+	}
+}
+
+
+void FluxboxWindow::destroyNotifyEvent(XDestroyWindowEvent *de) {
+	if (de->window == client.window) {
+		#ifdef DEBUG
+		fprintf(stderr,"%s(%d): DestroyNotifyEvent this=%p\n", __FILE__, __LINE__, this);
+		#endif
+		XUnmapWindow(display, frame.window);		
+		delete this;
+	}
+}
+
+
+void FluxboxWindow::propertyNotifyEvent(Atom atom) {
+ 	Fluxbox *fluxbox = Fluxbox::instance();
+	fluxbox->grab();
+	if (! validateClient()) return;
+
+	switch(atom) {
+	case XA_WM_CLASS:
+	case XA_WM_CLIENT_MACHINE:
+	case XA_WM_COMMAND:
+		break;
+
+	case XA_WM_TRANSIENT_FOR:
+		// determine if this is a transient window
+		Window win;
+		if (XGetTransientForHint(display, client.window, &win)) {
+			if (win && (win != client.window))
+				if ((client.transient_for = fluxbox->searchWindow(win))) {
+					client.transient_for->client.transient = this;
+					stuck = client.transient_for->stuck;
+					transient = true;
+				} else if (win == client.window_group) {
+		//jr This doesn't look quite right...
+					if ((client.transient_for = fluxbox->searchGroup(win, this))) {
+						client.transient_for->client.transient = this;
+						stuck = client.transient_for->stuck;
+						transient = true;
+					}
+				}
+
+			if (win == screen->getRootWindow()) modal = true;
+		}
+
+		// adjust the window decorations based on transience
+		if (transient)
+			decorations.maximize = decorations.handle =
+				decorations.border = functions.maximize = false;
+
+		reconfigure();
+
+		break;
+
+	case XA_WM_HINTS:
+		getWMHints();
+		break;
+
+	case XA_WM_ICON_NAME:
+		getWMIconName();
+		if (iconic) screen->iconUpdate();
+		break;
+
+	case XA_WM_NAME:
+		getWMName();
+
+		if (decorations.titlebar)
+			redrawLabel();
+
+		if (! iconic)
+			screen->getWorkspace(workspace_number)->update();
+
+		break;
+
+	case XA_WM_NORMAL_HINTS: {
+		getWMNormalHints();
+
+		if ((client.normal_hint_flags & PMinSize) &&
+				(client.normal_hint_flags & PMaxSize)) {
+			if (client.max_width <= client.min_width &&
+					client.max_height <= client.min_height)
+				decorations.maximize = decorations.handle =
+			functions.resize = functions.maximize = false;
+			else
+				decorations.maximize = decorations.handle =
+			functions.resize = functions.maximize = true;
+		}
+
+		int x = frame.x, y = frame.y;
+		unsigned int w = frame.width, h = frame.height;
+
+		upsize();
+
+		if ((x != frame.x) || (y != frame.y) ||
+				(w != frame.width) || (h != frame.height))
+			reconfigure();
+
+		break; 
+	}
+
+	default:
+		if (atom == fluxbox->getWMProtocolsAtom()) {
+			getWMProtocols();
+	
+		}
+
+		break;
+	}
+
+	fluxbox->ungrab();
+}
+
+
+void FluxboxWindow::exposeEvent(XExposeEvent *ee) {
+	if (frame.label == ee->window && decorations.titlebar)
+		redrawLabel();
+	else 
+		redrawAllButtons();
+
+}
+
+
+void FluxboxWindow::configureRequestEvent(XConfigureRequestEvent *cr) {
+	if (cr->window == client.window) {
+		Fluxbox *fluxbox = Fluxbox::instance();
+		fluxbox->grab();
+		if (! validateClient())
+			return;
+
+		int cx = frame.x, cy = frame.y;
+		unsigned int cw = frame.width, ch = frame.height;
+
+		if (cr->value_mask & CWBorderWidth)
+			client.old_bw = cr->border_width;
+
+		if (cr->value_mask & CWX)
+			cx = cr->x - frame.mwm_border_w - screen->getBorderWidth();
+
+		if (cr->value_mask & CWY)
+			cy = cr->y - frame.y_border - frame.mwm_border_w -
+				screen->getBorderWidth();
+
+		if (cr->value_mask & CWWidth)
+			cw = cr->width + (frame.mwm_border_w * 2);
+
+		if (cr->value_mask & CWHeight)
+			ch = cr->height + frame.y_border + (frame.mwm_border_w * 2) +
+				(screen->getBorderWidth() * decorations.handle) + frame.handle_h;
+
+		if (frame.x != cx || frame.y != cy ||
+			frame.width != cw || frame.height != ch) {
+			configure(cx, cy, cw, ch);
+			if (tab)
+				tab->resize();
+		}
+		if (cr->value_mask & CWStackMode) {
+			switch (cr->detail) {
+			case Above:
+			case TopIf:
+			default:
+				if (iconic)
+					deiconify();
+//!!TODO check this and the line below..
+//				if (tab)
+//					tab->raise();
+				screen->getWorkspace(workspace_number)->raiseWindow(this);
+				break;
+
+			case Below:
+			case BottomIf:
+				if (iconic)
+					deiconify();
+
+//				if (tab)
+//					tab->raise();
+				screen->getWorkspace(workspace_number)->lowerWindow(this);
+				break;
+			}
+		}
+
+		fluxbox->ungrab();
+	}
+}
+
+
+void FluxboxWindow::buttonPressEvent(XButtonEvent *be) {
+	Fluxbox *fluxbox = Fluxbox::instance();
+	fluxbox->grab();
+	
+	if (! validateClient())	
+		return;
+
+		
+	if (be->button == 1 || (be->button == 3 && be->state == Mod1Mask)) {
+		if ((! focused) && (! screen->isSloppyFocus()))	 //check focus
+			setInputFocus(); 
+		
+		//Redraw buttons
+		for (unsigned int i=0; iwindow == buttonlist[i].win && buttonlist[i].draw)
+					buttonlist[i].draw(this, be->window, true);
+		}
+		
+		if (frame.plate == be->window) {
+			
+			if (windowmenu && windowmenu->isVisible()) //hide menu if its visible
+				windowmenu->hide();
+			//raise tab first, if there is any, so the focus on windows get 
+			//right and dont "hide" the tab behind other windows
+			if (tab)
+				tab->raise();
+			
+			screen->getWorkspace(workspace_number)->raiseWindow(this);
+
+			XAllowEvents(display, ReplayPointer, be->time);
+			
+		} else {
+			if (frame.title == be->window || frame.label == be->window) {
+				if (((be->time - lastButtonPressTime) <=
+			 		fluxbox->getDoubleClickInterval()) ||
+			 	 			(be->state & ControlMask)) {
+					lastButtonPressTime = 0;
+					shade();
+					if (tab) //shade windows in the tablist too
+						tab->shade();
+				} else
+					lastButtonPressTime = be->time;
+			}
+			
+			/*
+			if (be->window == frame.title)
+				fprintf(stderr, "title\n");
+			else if (be->window == frame.label)
+				fprintf(stderr, "label\n");
+			else if (be->window == frame.plate)
+				fprintf(stderr, "plate\n");
+			else if (be->window == frame.handle)
+				fprintf(stderr, "handle\n");
+			else if (be->window == frame.window)
+				fprintf(stderr, "window\n");
+			else
+					fprintf(stderr, "unknown window\n");					
+			*/
+			
+			frame.grab_x = be->x_root - frame.x - screen->getBorderWidth();
+			frame.grab_y = be->y_root - frame.y - screen->getBorderWidth();
+
+			if (windowmenu && windowmenu->isVisible())
+				windowmenu->hide();
+			//raise tab first if there is any
+			if (tab)
+				tab->raise();
+			screen->getWorkspace(workspace_number)->raiseWindow(this);
+		}
+	/*} else if (be->button == 2 && (be->window != frame.iconify_button) &&
+													(be->window != frame.close_button)) {
+		screen->getWorkspace(workspace_number)->lowerWindow(this);
+	*/		
+	} else if (windowmenu && be->button == 3 &&
+				(frame.title == be->window || frame.label == be->window ||
+				frame.handle == be->window || frame.window == be->window)) {
+		int mx = 0, my = 0;
+
+		if (frame.title == be->window || frame.label == be->window) {
+			mx = be->x_root - (windowmenu->getWidth() / 2);
+			my = frame.y + frame.title_h;
+		} else if (frame.handle == be->window) {
+			mx = be->x_root - (windowmenu->getWidth() / 2);
+			my = frame.y + frame.y_handle - windowmenu->getHeight();
+		} else {
+			bool buttonproc=false;
+			
+			if (buttonproc)
+				mx = be->x_root - (windowmenu->getWidth() / 2);
+
+			if (be->y <= (signed) frame.bevel_w)
+				my = frame.y + frame.y_border;
+			else
+				my = be->y_root - (windowmenu->getHeight() / 2);
+		}
+
+		if (mx > (signed) (frame.x + frame.width - windowmenu->getWidth()))
+			mx = frame.x + frame.width - windowmenu->getWidth();
+		if (mx < frame.x)
+			mx = frame.x;
+
+		if (my > (signed) (frame.y + frame.y_handle - windowmenu->getHeight()))
+			my = frame.y + frame.y_handle - windowmenu->getHeight();
+		if (my < (signed) (frame.y + ((decorations.titlebar) ? frame.title_h :
+							frame.y_border)))
+			my = frame.y +
+			((decorations.titlebar) ? frame.title_h : frame.y_border);
+
+		if (windowmenu) {
+			if (! windowmenu->isVisible()) { // if not window menu is visible then show it
+				windowmenu->move(mx, my);
+				windowmenu->show();		
+				XRaiseWindow(display, windowmenu->getWindowID());
+				XRaiseWindow(display, windowmenu->getSendToMenu()->getWindowID());
+				XRaiseWindow(display, windowmenu->getSendGroupToMenu()->getWindowID());
+			} else //else hide menu
+				windowmenu->hide(); 
+		}
+		
+	} else if (be->button == 4) { //scroll to tab right
+		if (tab && tab->next()) {
+			tab->next()->getWindow()->setInputFocus();
+			screen->getWorkspace(workspace_number)->raiseWindow(tab->next()->getWindow());
+		}
+	} else if (be->button == 5) { //scroll to tab left
+		if (tab && tab->prev()) {
+			tab->prev()->getWindow()->setInputFocus();
+			screen->getWorkspace(workspace_number)->raiseWindow(tab->prev()->getWindow());
+		}
+	}
+	
+	fluxbox->ungrab();
+}
+
+
+void FluxboxWindow::buttonReleaseEvent(XButtonEvent *re) {
+	Fluxbox *fluxbox = Fluxbox::instance();
+	fluxbox->grab();
+
+	if (! validateClient())
+		return;
+
+	if (moving) {
+		moving = false;
+						
+		fluxbox->maskWindowEvents(0, (FluxboxWindow *) 0);
+
+		if (! screen->doOpaqueMove()) {
+			XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(),
+		 		 frame.move_x, frame.move_y, frame.resize_w,
+			 	 frame.resize_h);
+
+			configure(frame.move_x, frame.move_y, frame.width, frame.height);
+			fluxbox->ungrab();
+		} else
+			configure(frame.x, frame.y, frame.width, frame.height);
+
+		screen->hideGeometry();
+		XUngrabPointer(display, CurrentTime);
+	} else if (resizing) {
+		XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(),
+			frame.resize_x, frame.resize_y,
+			frame.resize_w, frame.resize_h);
+
+		screen->hideGeometry();
+
+		if (re->window == frame.left_grip)
+			left_fixsize();
+		else
+			right_fixsize();
+
+		resizing = false;
+		configure(frame.resize_x, frame.resize_y,
+				frame.resize_w - screen->getBorderWidth2x(),
+				frame.resize_h - screen->getBorderWidth2x());
+	
+		if (tab)
+			tab->resize();
+			
+		fluxbox->ungrab();
+		XUngrabPointer(display, CurrentTime);
+	} else if (re->window == frame.window) {
+		if (re->button == 2 && re->state == Mod1Mask)
+			XUngrabPointer(display, CurrentTime);
+	} else {
+		if ((re->x >= 0) && ((unsigned) re->x <= frame.button_w) &&
+			(re->y >= 0) && ((unsigned) re->y <= frame.button_h)) {
+			for (unsigned int i=0; iwindow == buttonlist[i].win &&
+						buttonlist[i].released) {
+					buttonlist[i].released(this, re);	
+					break;					
+				}
+			}
+		} 
+		redrawAllButtons();
+	}
+
+	fluxbox->ungrab();
+}
+
+
+void FluxboxWindow::motionNotifyEvent(XMotionEvent *me) {
+	Fluxbox *fluxbox = Fluxbox::instance();
+	if ((me->state & Button1Mask) && functions.move &&
+			(frame.title == me->window || frame.label == me->window ||
+			 frame.handle == me->window || frame.window == me->window)) {
+			 
+		if (! moving) {
+			XGrabPointer(display, me->window, False, Button1MotionMask |
+								ButtonReleaseMask, GrabModeAsync, GrabModeAsync,
+								None, fluxbox->getMoveCursor(), CurrentTime);
+
+			if (windowmenu && windowmenu->isVisible())
+				windowmenu->hide();
+
+			moving = true;
+
+			fluxbox->maskWindowEvents(client.window, this);
+
+			if (! screen->doOpaqueMove()) {
+				fluxbox->grab();
+
+				frame.move_x = frame.x;
+				frame.move_y = frame.y;
+				frame.resize_w = frame.width + screen->getBorderWidth2x();
+				frame.resize_h = ((shaded) ? frame.title_h : frame.height) +
+						screen->getBorderWidth2x();
+
+				screen->showPosition(frame.x, frame.y);
+
+				XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(),
+				frame.move_x, frame.move_y,
+					frame.resize_w, frame.resize_h);
+			}
+		} else {
+			int dx = me->x_root - frame.grab_x, dy = me->y_root - frame.grab_y;
+
+			dx -= screen->getBorderWidth();
+			dy -= screen->getBorderWidth();
+
+			if (screen->getEdgeSnapThreshold()) {
+				int drx = screen->getWidth() - (dx + frame.snap_w);
+
+				if (dx > 0 && dx < drx && dx < screen->getEdgeSnapThreshold()) 
+					dx = 0;
+				else if (drx > 0 && drx < screen->getEdgeSnapThreshold())
+					dx = screen->getWidth() - frame.snap_w;
+
+				int dtty, dbby, dty, dby;
+				switch (screen->getToolbarPlacement()) {
+				case Toolbar::TopLeft:
+				case Toolbar::TopCenter:
+				case Toolbar::TopRight:
+					dtty = screen->getToolbar()->getExposedHeight() +
+							screen->getBorderWidth();
+					dbby = screen->getHeight();
+					break;
+
+				default:
+					dtty = 0;
+					dbby = screen->getToolbar()->getY();
+					break;
+				}
+
+				dty = dy - dtty;
+				dby = dbby - (dy + frame.snap_h);
+
+				if (dy > 0 && dty < screen->getEdgeSnapThreshold())
+					dy = dtty;
+				else if (dby > 0 && dby < screen->getEdgeSnapThreshold())
+					dy = dbby - frame.snap_h;
+			}
+
+			if (! screen->doOpaqueMove()) {
+				XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(),
+						frame.move_x, frame.move_y, frame.resize_w,
+						frame.resize_h);
+
+				frame.move_x = dx;
+				frame.move_y = dy;
+
+				XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(),
+					 frame.move_x, frame.move_y, frame.resize_w,
+					 frame.resize_h);
+			} else
+				configure(dx, dy, frame.width, frame.height);
+
+				screen->showPosition(dx, dy);
+		}
+	} else if (functions.resize &&
+			(((me->state & Button1Mask) && (me->window == frame.right_grip ||
+							 me->window == frame.left_grip)) ||
+									 me->window == frame.window)) {
+		bool left = (me->window == frame.left_grip);
+
+		if (! resizing) {
+				XGrabPointer(display, me->window, false, ButtonMotionMask |
+					ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None,
+						((left) ? fluxbox->getLowerLeftAngleCursor() :
+						fluxbox->getLowerRightAngleCursor()),
+						CurrentTime);
+
+			resizing = true;
+
+			fluxbox->grab();
+
+			int gx, gy;
+			frame.grab_x = me->x - screen->getBorderWidth();
+			frame.grab_y = me->y - screen->getBorderWidth2x();
+			frame.resize_x = frame.x;
+			frame.resize_y = frame.y;
+			frame.resize_w = frame.width + screen->getBorderWidth2x();
+			frame.resize_h = frame.height + screen->getBorderWidth2x();
+
+			if (left)
+				left_fixsize(&gx, &gy);
+			else
+				right_fixsize(&gx, &gy);
+
+			screen->showGeometry(gx, gy);
+
+			XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(),
+				frame.resize_x, frame.resize_y,
+				frame.resize_w, frame.resize_h);
+		} else if (resizing) {
+			XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(),
+				frame.resize_x, frame.resize_y,
+				frame.resize_w, frame.resize_h);
+
+			int gx, gy;
+
+			frame.resize_h = frame.height + (me->y - frame.grab_y);
+			if (frame.resize_h < 1)
+				frame.resize_h = 1;
+
+			if (left) {
+				frame.resize_x = me->x_root - frame.grab_x;
+				if (frame.resize_x > (signed) (frame.x + frame.width))
+					frame.resize_x = frame.resize_x + frame.width - 1;
+
+				left_fixsize(&gx, &gy);
+			} else {
+				frame.resize_w = frame.width + (me->x - frame.grab_x);
+				if (frame.resize_w < 1)
+					frame.resize_w = 1;
+
+				right_fixsize(&gx, &gy);
+			}
+
+			XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(),
+					frame.resize_x, frame.resize_y,
+					frame.resize_w, frame.resize_h);
+
+			screen->showGeometry(gx, gy);
+		}
+	}
+}
+
+
+#ifdef		SHAPE
+void FluxboxWindow::shapeEvent(XShapeEvent *) {
+	Fluxbox *fluxbox = Fluxbox::instance();
+	if (fluxbox->hasShapeExtensions()) {
+		if (frame.shaped) {			
+			fluxbox->grab();
+			if (! validateClient())
+				return;
+			XShapeCombineShape(display, frame.window, ShapeBounding,
+				frame.mwm_border_w, frame.y_border +
+				frame.mwm_border_w, client.window,
+				ShapeBounding, ShapeSet);
+
+			int num = 1;
+			XRectangle xrect[2];
+			xrect[0].x = xrect[0].y = 0;
+			xrect[0].width = frame.width;
+			xrect[0].height = frame.y_border;
+
+			if (decorations.handle) {
+				xrect[1].x = 0;
+				xrect[1].y = frame.y_handle;
+				xrect[1].width = frame.width;
+				xrect[1].height = frame.handle_h + screen->getBorderWidth();
+				num++;
+			}
+
+			XShapeCombineRectangles(display, frame.window, ShapeBounding, 0, 0,
+					xrect, num, ShapeUnion, Unsorted);
+			fluxbox->ungrab();
+		}
+	}
+}
+#endif // SHAPE
+
+
+bool FluxboxWindow::validateClient(void) {
+	XSync(display, false);
+
+	XEvent e;
+	if (XCheckTypedWindowEvent(display, client.window, DestroyNotify, &e) ||
+			XCheckTypedWindowEvent(display, client.window, UnmapNotify, &e)) {
+		XPutBackEvent(display, &e);
+		Fluxbox::instance()->ungrab();
+
+		return false;
+	}
+
+	return true;
+}
+
+
+void FluxboxWindow::restore(void) {
+	XChangeSaveSet(display, client.window, SetModeDelete);
+	XSelectInput(display, client.window, NoEventMask);
+
+	restoreGravity();
+
+	XUnmapWindow(display, frame.window);
+	XUnmapWindow(display, client.window);
+
+	XSetWindowBorderWidth(display, client.window, client.old_bw);
+	XReparentWindow(display, client.window, screen->getRootWindow(),
+									client.x, client.y);
+	XMapWindow(display, client.window);
+		
+	XFlush(display);
+}
+
+
+void FluxboxWindow::timeout(void) {
+	if (tab)
+		tab->raise();
+	screen->getWorkspace(workspace_number)->raiseWindow(this);
+}
+
+
+void FluxboxWindow::changeBlackboxHints(BlackboxHints *net) {
+	if ((net->flags & AttribShaded) &&
+			((blackbox_attrib.attrib & AttribShaded) !=
+			(net->attrib & AttribShaded)))
+		shade();
+
+	if ((net->flags & (AttribMaxVert | AttribMaxHoriz)) &&
+			((blackbox_attrib.attrib & (AttribMaxVert | AttribMaxHoriz)) !=
+				(net->attrib & (AttribMaxVert | AttribMaxHoriz)))) {
+		if (maximized) {
+			maximize(0);
+		} else {
+			int m = 0;
+
+			if ((net->flags & AttribMaxHoriz) && (net->flags & AttribMaxVert))
+				m = ((net->attrib & (AttribMaxHoriz | AttribMaxVert)) ?	1 : 0);
+			else if (net->flags & AttribMaxVert)
+				m = ((net->attrib & AttribMaxVert) ? 2 : 0);
+			else if (net->flags & AttribMaxHoriz)
+				m = ((net->attrib & AttribMaxHoriz) ? 3 : 0);
+
+			maximize(m);
+		}
+	}
+
+	if ((net->flags & AttribOmnipresent) &&
+			((blackbox_attrib.attrib & AttribOmnipresent) !=
+			(net->attrib & AttribOmnipresent)))
+		stick();
+
+	if ((net->flags & AttribWorkspace) &&
+			(workspace_number != (signed) net->workspace)) {
+		screen->reassociateWindow(this, net->workspace, true);
+
+		if (screen->getCurrentWorkspaceID() != (signed) net->workspace)
+			withdraw();
+		else 
+			deiconify();
+	}
+
+	if (net->flags & AttribDecoration) {
+		switch (net->decoration) {
+		case DecorNone:
+			decorations.titlebar = decorations.border = decorations.handle =
+				decorations.iconify = decorations.maximize =
+				decorations.menu = false;
+			functions.resize = functions.move = functions.iconify =
+				functions.maximize = false;
+
+			break;
+
+		default:
+		case DecorNormal:
+			decorations.titlebar = decorations.border = decorations.handle =
+				decorations.iconify = decorations.maximize =
+				decorations.menu = true;
+			functions.resize = functions.move = functions.iconify =
+				functions.maximize = true;
+
+			break;
+
+		case DecorTiny:
+			decorations.titlebar = decorations.iconify = decorations.menu =
+				functions.move = functions.iconify = true;
+			decorations.border = decorations.handle = decorations.maximize =
+				functions.resize = functions.maximize = false;
+
+			break;
+
+		case DecorTool:
+			decorations.titlebar = decorations.menu = functions.move = true;
+			decorations.iconify = decorations.border = decorations.handle =
+				decorations.maximize = functions.resize = functions.maximize =
+				functions.iconify = false;
+
+			break;
+		}
+
+		reconfigure();
+	}
+}
+
+
+void FluxboxWindow::upsize(void) {
+	// convert client.width/height into frame sizes
+
+	frame.bevel_w = screen->getBevelWidth();
+	frame.mwm_border_w = screen->getFrameWidth() * decorations.border;
+	
+	if (I18n::instance()->multibyte()) {
+		frame.title_h = (screen->getWindowStyle()->font.set_extents->
+				max_ink_extent.height +
+				(frame.bevel_w * 2) + 2) * decorations.titlebar;
+	} else
+		frame.title_h = (screen->getWindowStyle()->font.fontstruct->ascent +
+				screen->getWindowStyle()->font.fontstruct->descent +
+				(frame.bevel_w * 2) + 2) * decorations.titlebar;
+
+	frame.label_h = (frame.title_h - (frame.bevel_w * 2)) * decorations.titlebar;
+	frame.button_w = frame.button_h = frame.label_h - 2;
+
+	frame.y_border = (frame.title_h + screen->getBorderWidth()) * decorations.titlebar;
+	frame.border_h = client.height + (frame.mwm_border_w * 2);
+
+	frame.y_handle = frame.y_border + frame.border_h +
+							(screen->getBorderWidth() * decorations.handle);
+	frame.handle_h = decorations.handle * screen->getHandleWidth();
+
+	frame.grip_w = (frame.button_h * 2) * decorations.handle;
+	frame.grip_h = screen->getHandleWidth() * decorations.handle;
+
+	frame.width = client.width + (frame.mwm_border_w * 2);
+	frame.height = frame.y_handle + frame.handle_h;
+
+	frame.snap_w = frame.width + screen->getBorderWidth2x();
+	frame.snap_h = frame.height + screen->getBorderWidth2x();
+}
+
+
+void FluxboxWindow::downsize(void) {
+	// convert frame.width/height into client sizes
+
+	frame.y_handle = frame.height - frame.handle_h;
+	frame.border_h = frame.y_handle - frame.y_border -
+							(screen->getBorderWidth() * decorations.handle);
+
+	client.x = frame.x + frame.mwm_border_w + screen->getBorderWidth();
+	client.y = frame.y + frame.y_border + frame.mwm_border_w +
+							screen->getBorderWidth();
+
+	client.width = frame.width - (frame.mwm_border_w * 2);
+	client.height = frame.height - frame.y_border -
+						(frame.mwm_border_w * 2) - frame.handle_h -
+						(screen->getBorderWidth() * decorations.handle);
+
+	frame.y_handle = frame.border_h + frame.y_border + screen->getBorderWidth();
+
+	frame.snap_w = frame.width + screen->getBorderWidth2x();
+	frame.snap_h = frame.height + screen->getBorderWidth2x();
+}
+
+
+void FluxboxWindow::right_fixsize(int *gx, int *gy) {
+	// calculate the size of the client window and conform it to the
+	// size specified by the size hints of the client window...
+	int dx = frame.resize_w - client.base_width - (frame.mwm_border_w * 2) -
+		screen->getBorderWidth2x();
+	int dy = frame.resize_h - frame.y_border - client.base_height -
+		frame.handle_h - (screen->getBorderWidth() * 3) - (frame.mwm_border_w * 2);
+
+	if (dx < (signed) client.min_width)
+		dx = client.min_width;
+	if (dy < (signed) client.min_height)
+		dy = client.min_height;
+	if ((unsigned) dx > client.max_width)
+		dx = client.max_width;
+	if ((unsigned) dy > client.max_height)
+		dy = client.max_height;
+
+	dx /= client.width_inc;
+	dy /= client.height_inc;
+
+	if (gx) *gx = dx;
+	if (gy) *gy = dy;
+
+	dx = (dx * client.width_inc) + client.base_width;
+	dy = (dy * client.height_inc) + client.base_height;
+
+	frame.resize_w = dx + (frame.mwm_border_w * 2) + screen->getBorderWidth2x();
+	frame.resize_h = dy + frame.y_border + frame.handle_h +
+								(frame.mwm_border_w * 2) +	(screen->getBorderWidth() * 3);
+}
+
+
+void FluxboxWindow::left_fixsize(int *gx, int *gy) {
+	// calculate the size of the client window and conform it to the
+	// size specified by the size hints of the client window...
+	int dx = frame.x + frame.width - frame.resize_x - client.base_width -
+		(frame.mwm_border_w * 2);
+	int dy = frame.resize_h - frame.y_border - client.base_height -
+		frame.handle_h - (screen->getBorderWidth() * 3) - (frame.mwm_border_w * 2);
+
+	if (dx < (signed) client.min_width) dx = client.min_width;
+	if (dy < (signed) client.min_height) dy = client.min_height;
+	if ((unsigned) dx > client.max_width) dx = client.max_width;
+	if ((unsigned) dy > client.max_height) dy = client.max_height;
+
+	dx /= client.width_inc;
+	dy /= client.height_inc;
+
+	if (gx) *gx = dx;
+	if (gy) *gy = dy;
+
+	dx = (dx * client.width_inc) + client.base_width;
+	dy = (dy * client.height_inc) + client.base_height;
+
+	frame.resize_w = dx + (frame.mwm_border_w * 2) + screen->getBorderWidth2x();
+	frame.resize_x = frame.x + frame.width - frame.resize_w +
+									 screen->getBorderWidth2x();
+	frame.resize_h = dy + frame.y_border + frame.handle_h +
+									 (frame.mwm_border_w * 2) + (screen->getBorderWidth() * 3);
+}
diff --git a/src/Window.hh b/src/Window.hh
new file mode 100644
index 00000000..f08acb0c
--- /dev/null
+++ b/src/Window.hh
@@ -0,0 +1,321 @@
+// Window.hh for Blackbox - an X11 Window manager
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+//
+//Changes for Fluxbox made by Henrik Kinnunen (fluxgen@linuxmail.org)
+// See LICENSE for copyright and license
+
+#ifndef   _WINDOW_HH_
+#define   _WINDOW_HH_
+
+#include 
+#include 
+
+#ifdef    SHAPE
+#  include 
+#endif // SHAPE
+
+// forward declaration
+class FluxboxWindow;
+class Tab;
+
+#include "fluxbox.hh"
+
+#include 
+#include 
+#ifndef _BASEDISPLAY_HH_
+#include "BaseDisplay.hh"
+#endif 
+#ifndef _TIMER_HH_
+#include "Timer.hh"
+#endif
+#ifndef _WINDOWMENU_HH_
+#include "Windowmenu.hh"
+#endif
+
+#define MwmHintsFunctions     (1l << 0)
+#define MwmHintsDecorations   (1l << 1)
+
+#define MwmFuncAll            (1l << 0)
+#define MwmFuncResize         (1l << 1)
+#define MwmFuncMove           (1l << 2)
+#define MwmFuncIconify        (1l << 3)
+#define MwmFuncMaximize       (1l << 4)
+#define MwmFuncClose          (1l << 5)
+
+#define MwmDecorAll           (1l << 0)
+#define MwmDecorBorder        (1l << 1)
+#define MwmDecorHandle        (1l << 2)
+#define MwmDecorTitle         (1l << 3)
+#define MwmDecorMenu          (1l << 4)
+#define MwmDecorIconify       (1l << 5)
+#define MwmDecorMaximize      (1l << 6)
+//names for buttons
+#define NAME_STICKY "sticky"
+#define NAME_MAXIMIZE "maximize"
+#define NAME_MINIMIZE "minimize"
+#define NAME_SHADE "shade"
+#define NAME_CLOSE "close"
+#define NAME_ICONIFY "iconify"
+#define NAME_MENU "menu"
+#define NAME_NONE "none"
+
+
+#define PropMwmHintsElements  3
+
+class FluxboxWindow : public TimeoutHandler {
+public:
+  FluxboxWindow(Window, BScreen * = (BScreen *) 0);
+  virtual ~FluxboxWindow(void);
+
+  inline const bool isTransient(void) const
+  { return ((transient) ? true : false); }
+  inline const bool hasTransient(void) const
+  { return ((client.transient) ? true : false); }
+  inline const bool &isFocused(void) const { return focused; }
+  inline const bool &isVisible(void) const { return visible; }
+  inline const bool &isIconic(void) const { return iconic; }
+  inline const bool &isShaded(void) const { return shaded; }
+  inline const bool &isMaximized(void) const { return maximized; }
+  inline const bool &isIconifiable(void) const { return functions.iconify; }
+  inline const bool &isMaximizable(void) const { return functions.maximize; }
+  inline const bool &isResizable(void) const { return functions.resize; }
+  inline const bool &isClosable(void) const { return functions.close; }
+  inline const bool &isStuck(void) const { return stuck; }
+  inline const bool &hasTitlebar(void) const { return decorations.titlebar; }
+	inline const bool hasTab(void) const { return (tab!=0 ? true : false); }
+	
+  inline BScreen *getScreen(void) { return screen; }
+	inline Tab *getTab(void) { return tab; }
+  inline FluxboxWindow *getTransient(void) { return client.transient; }
+  inline FluxboxWindow *getTransientFor(void) { return client.transient_for; }
+
+  inline const Window &getFrameWindow(void) const { return frame.window; }
+  inline const Window &getClientWindow(void) const { return client.window; }
+
+  inline Windowmenu *getWindowmenu(void) { return windowmenu; }
+
+  inline char **getTitle(void) { return &client.title; }
+  inline char **getIconTitle(void) { return &client.icon_title; }
+  inline const int &getXFrame(void) const { return frame.x; }
+  inline const int &getYFrame(void) const { return frame.y; }
+  inline const int &getXClient(void) const { return client.x; }
+  inline const int &getYClient(void) const { return client.y; }
+  inline const int &getWorkspaceNumber(void) const { return workspace_number; }
+  inline const int &getWindowNumber(void) const { return window_number; }
+
+  inline const unsigned int &getWidth(void) const { return frame.width; }
+  inline const unsigned int &getHeight(void) const { return frame.height; }
+  inline const unsigned int &getClientHeight(void) const
+  { return client.height; }
+  inline const unsigned int &getClientWidth(void) const
+  { return client.width; }
+  inline const unsigned int &getTitleHeight(void) const
+  { return frame.title_h; }
+
+  inline void setWindowNumber(int n) { window_number = n; }
+  
+  bool validateClient(void);
+  bool setInputFocus(void);
+	void setTab(bool flag);
+  void setFocusFlag(bool);
+  void iconify(void);
+  void deiconify(bool = true, bool = true);
+  void close(void);
+  void withdraw(void);
+  void maximize(unsigned int);
+  void shade(void);
+  void stick(void);
+  void unstick(void);
+  void reconfigure(void);
+  void installColormap(bool);
+  void restore(void);
+  void configure(int dx, int dy, unsigned int dw, unsigned int dh);
+  void setWorkspace(int n);
+  void changeBlackboxHints(BlackboxHints *);
+  void restoreAttributes(void);
+
+  void buttonPressEvent(XButtonEvent *);
+  void buttonReleaseEvent(XButtonEvent *);
+  void motionNotifyEvent(XMotionEvent *);
+  void destroyNotifyEvent(XDestroyWindowEvent *);
+  void mapRequestEvent(XMapRequestEvent *);
+  void mapNotifyEvent(XMapEvent *);
+  void unmapNotifyEvent(XUnmapEvent *);
+  void propertyNotifyEvent(Atom);
+  void exposeEvent(XExposeEvent *);
+  void configureRequestEvent(XConfigureRequestEvent *);
+
+#ifdef    SHAPE
+  void shapeEvent(XShapeEvent *);
+#endif // SHAPE
+
+  virtual void timeout(void);
+	
+	// this structure only contains 3 elements... the Motif 2.0 structure contains
+	// 5... we only need the first 3... so that is all we will define
+	typedef struct MwmHints {
+	  unsigned long flags, functions, decorations;
+	} MwmHints;
+
+private:
+  BImageControl *image_ctrl;
+	//Fluxbox *fluxbox;
+	
+  bool moving, resizing, shaded, maximized, visible, iconic, transient,
+    focused, stuck, modal, send_focus_message, managed;
+  BScreen *screen;
+  BTimer *timer;
+  Display *display;
+  BlackboxAttributes blackbox_attrib;
+
+  Time lastButtonPressTime;
+  Windowmenu *windowmenu;
+
+  int focus_mode, window_number, workspace_number;
+  unsigned long current_state;
+
+  struct _client {
+    FluxboxWindow *transient_for,  // which window are we a transient for?
+      *transient;                   // which window is our transient?
+    Window window, window_group;
+
+    char *title, *icon_title;
+    int x, y, old_bw, title_len;
+		unsigned int width, height, title_text_w,
+			min_width, min_height, max_width, max_height, width_inc, height_inc,
+			min_aspect_x, min_aspect_y, max_aspect_x, max_aspect_y,
+			base_width, base_height, win_gravity;
+		unsigned long initial_state, normal_hint_flags, wm_hint_flags;
+
+		MwmHints *mwm_hint;
+		BlackboxHints *blackbox_hint;
+	} client;
+
+	struct _decorations {
+		bool titlebar, handle, border, iconify,
+				maximize, close, menu, sticky, shade, tab;
+	} decorations;
+
+	struct _functions {
+		bool resize, move, iconify, maximize, close;
+	} functions;
+  
+	bool usetab;
+	Tab *tab;
+	//Tab is also a friend
+	friend class Tab;	
+
+	typedef void (*ButtonDrawProc)(FluxboxWindow *, Window, bool);
+	typedef void (*ButtonEventProc)(FluxboxWindow *, XButtonEvent *);
+
+  struct Button {
+    int type;
+    Window win;
+    bool used;
+    ButtonEventProc pressed;
+    ButtonEventProc released;
+    ButtonDrawProc draw;    
+  };
+	
+  std::vector