summaryrefslogtreecommitdiffstats
path: root/twin-styles/icewm
diff options
context:
space:
mode:
Diffstat (limited to 'twin-styles/icewm')
-rw-r--r--twin-styles/icewm/CMakeLists.txt35
-rw-r--r--twin-styles/icewm/Makefile.am21
-rw-r--r--twin-styles/icewm/config/CMakeLists.txt28
-rw-r--r--twin-styles/icewm/config/Makefile.am16
-rw-r--r--twin-styles/icewm/config/config.cpp271
-rw-r--r--twin-styles/icewm/config/config.h77
-rw-r--r--twin-styles/icewm/icewm-themes/CMakeLists.txt21
-rw-r--r--twin-styles/icewm/icewm-themes/Makefile.am12
-rw-r--r--twin-styles/icewm/icewm-themes/closeA.xpm69
-rw-r--r--twin-styles/icewm/icewm-themes/closeI.xpm69
-rw-r--r--twin-styles/icewm/icewm-themes/default.theme48
-rw-r--r--twin-styles/icewm/icewm-themes/depthA.xpm69
-rw-r--r--twin-styles/icewm/icewm-themes/depthI.xpm69
-rw-r--r--twin-styles/icewm/icewm-themes/maximizeA.xpm68
-rw-r--r--twin-styles/icewm/icewm-themes/maximizeI.xpm68
-rw-r--r--twin-styles/icewm/icewm-themes/menuButtonA.xpm68
-rw-r--r--twin-styles/icewm/icewm-themes/menuButtonI.xpm68
-rw-r--r--twin-styles/icewm/icewm-themes/minimizeA.xpm68
-rw-r--r--twin-styles/icewm/icewm-themes/minimizeI.xpm68
-rw-r--r--twin-styles/icewm/icewm-themes/restoreA.xpm68
-rw-r--r--twin-styles/icewm/icewm-themes/restoreI.xpm68
-rw-r--r--twin-styles/icewm/icewm-themes/rolldownA.xpm68
-rw-r--r--twin-styles/icewm/icewm-themes/rolldownI.xpm68
-rw-r--r--twin-styles/icewm/icewm-themes/rollupA.xpm68
-rw-r--r--twin-styles/icewm/icewm-themes/rollupI.xpm68
-rw-r--r--twin-styles/icewm/icewm-themes/titleAB.xpm32
-rw-r--r--twin-styles/icewm/icewm-themes/titleAJ.xpm37
-rw-r--r--twin-styles/icewm/icewm-themes/titleAM.xpm73
-rw-r--r--twin-styles/icewm/icewm-themes/titleAP.xpm73
-rw-r--r--twin-styles/icewm/icewm-themes/titleAQ.xpm37
-rw-r--r--twin-styles/icewm/icewm-themes/titleAR.xpm37
-rw-r--r--twin-styles/icewm/icewm-themes/titleAS.xpm32
-rw-r--r--twin-styles/icewm/icewm-themes/titleAT.xpm38
-rw-r--r--twin-styles/icewm/icewm-themes/titleIB.xpm32
-rw-r--r--twin-styles/icewm/icewm-themes/titleIJ.xpm37
-rw-r--r--twin-styles/icewm/icewm-themes/titleIM.xpm66
-rw-r--r--twin-styles/icewm/icewm-themes/titleIP.xpm66
-rw-r--r--twin-styles/icewm/icewm-themes/titleIQ.xpm37
-rw-r--r--twin-styles/icewm/icewm-themes/titleIR.xpm37
-rw-r--r--twin-styles/icewm/icewm-themes/titleIS.xpm32
-rw-r--r--twin-styles/icewm/icewm-themes/titleIT.xpm38
-rw-r--r--twin-styles/icewm/icewm.cpp1703
-rw-r--r--twin-styles/icewm/icewm.desktop11
-rw-r--r--twin-styles/icewm/icewm.h193
44 files changed, 4232 insertions, 0 deletions
diff --git a/twin-styles/icewm/CMakeLists.txt b/twin-styles/icewm/CMakeLists.txt
new file mode 100644
index 00000000..d59f42c9
--- /dev/null
+++ b/twin-styles/icewm/CMakeLists.txt
@@ -0,0 +1,35 @@
+#################################################
+#
+# (C) 2011 Golubev Alexander
+# fatzer2 (AT) gmail.com
+#
+# Improvements and feedback are welcome
+#
+# This file is released under GPL >= 2
+#
+#################################################
+
+add_subdirectory( config )
+add_subdirectory( icewm-themes )
+
+include_directories(
+ ${CMAKE_CURRENT_BINARY_DIR}
+ ${TDE_INCLUDE_DIR}
+ ${TQT_INCLUDE_DIRS}
+)
+
+link_directories(
+ ${TQT_LIBRARY_DIRS}
+)
+
+##### other data ################################
+
+install( FILES icewm.desktop DESTINATION ${DATA_INSTALL_DIR}/twin )
+
+##### twin3_icewm ###############################
+
+tde_add_kpart( twin3_icewm AUTOMOC
+ SOURCES icewm.cpp
+ LINK tdecorations-shared
+ DESTINATION ${PLUGIN_INSTALL_DIR}
+)
diff --git a/twin-styles/icewm/Makefile.am b/twin-styles/icewm/Makefile.am
new file mode 100644
index 00000000..e067c531
--- /dev/null
+++ b/twin-styles/icewm/Makefile.am
@@ -0,0 +1,21 @@
+INCLUDES = $(all_includes)
+
+SUBDIRS = . config icewm-themes
+
+kde_module_LTLIBRARIES = twin3_icewm.la
+
+twin3_icewm_la_SOURCES = icewm.cpp
+twin3_icewm_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module $(LIB_QT) $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx
+twin3_icewm_la_LIBADD = $(LIB_TDEUI) -ltdecorations
+
+METASOURCES = AUTO
+noinst_HEADERS = icewm.h
+
+lnkdir = $(kde_datadir)/twin/
+lnk_DATA = icewm.desktop
+
+EXTRA_DIST = $(lnk_DATA)
+
+###KMAKE-start (don't edit or delete this block)
+
+###KMAKE-end
diff --git a/twin-styles/icewm/config/CMakeLists.txt b/twin-styles/icewm/config/CMakeLists.txt
new file mode 100644
index 00000000..9e2e118d
--- /dev/null
+++ b/twin-styles/icewm/config/CMakeLists.txt
@@ -0,0 +1,28 @@
+#################################################
+#
+# (C) 2011 Golubev Alexander
+# fatzer2 (AT) gmail.com
+#
+# Improvements and feedback are welcome
+#
+# This file is released under GPL >= 2
+#
+#################################################
+
+include_directories(
+ ${CMAKE_CURRENT_BINARY_DIR}
+ ${TDE_INCLUDE_DIR}
+ ${TQT_INCLUDE_DIRS}
+)
+
+link_directories(
+ ${TQT_LIBRARY_DIRS}
+)
+
+##### twin_icewm_config (module) ################
+
+tde_add_kpart( twin_icewm_config AUTOMOC
+ SOURCES config.cpp
+ LINK tdeui-shared kio-shared
+ DESTINATION ${PLUGIN_INSTALL_DIR}
+)
diff --git a/twin-styles/icewm/config/Makefile.am b/twin-styles/icewm/config/Makefile.am
new file mode 100644
index 00000000..ca2d2552
--- /dev/null
+++ b/twin-styles/icewm/config/Makefile.am
@@ -0,0 +1,16 @@
+INCLUDES = $(all_includes)
+
+kde_module_LTLIBRARIES = twin_icewm_config.la
+
+twin_icewm_config_la_SOURCES = config.cpp
+twin_icewm_config_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module $(LIB_QT) $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx
+twin_icewm_config_la_LIBADD = $(LIB_TDEUI) $(LIB_KIO)
+
+METASOURCES = AUTO
+noinst_HEADERS = config.h
+
+lnkdir = $(kde_datadir)/twin/
+
+###KMAKE-start (don't edit or delete this block)
+
+###KMAKE-end
diff --git a/twin-styles/icewm/config/config.cpp b/twin-styles/icewm/config/config.cpp
new file mode 100644
index 00000000..a0a2a8db
--- /dev/null
+++ b/twin-styles/icewm/config/config.cpp
@@ -0,0 +1,271 @@
+/*
+ * $Id$
+ *
+ * This file contains the IceWM configuration widget
+ *
+ * Copyright (c) 2001
+ * Karol Szwed <gallium@kde.org>
+ * http://gallium.n3.net/
+ *
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "config.h"
+#include <tqdir.h>
+#include <tqregexp.h>
+#include <tqvbox.h>
+#include <tqwhatsthis.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kdialog.h>
+#include <kdirwatch.h>
+#include <kapplication.h>
+
+
+extern "C"
+{
+ KDE_EXPORT TQObject* allocate_config( KConfig* conf, TQWidget* parent )
+ {
+ return(new IceWMConfig(conf, parent));
+ }
+}
+
+
+// NOTE:
+// ==========================================================================
+// 'conf' is a pointer to the twindecoration modules open twin config,
+// and is by default set to the "Style" group.
+//
+// 'parent' is the parent of the TQObject, which is a VBox inside the
+// Configure tab in twindecoration
+// ==========================================================================
+
+IceWMConfig::IceWMConfig( KConfig* conf, TQWidget* parent )
+ : TQObject( parent )
+{
+ icewmConfig = new KConfig("twinicewmrc");
+ KGlobal::locale()->insertCatalogue("twin_art_clients");
+
+ mainWidget = new TQVBox( parent );
+ mainWidget->setSpacing( KDialog::spacingHint() );
+
+ themeListBox = new TQListBox( mainWidget );
+ TQWhatsThis::add( themeListBox,
+ i18n("Make your IceWM selection by clicking on a theme here. ") );
+
+ cbThemeTitleTextColors = new TQCheckBox(
+ i18n("Use theme &title text colors"), mainWidget );
+
+ TQWhatsThis::add( cbThemeTitleTextColors,
+ i18n("When selected, titlebar colors will follow those set "
+ "in the IceWM theme. If not selected, the current KDE "
+ "titlebar colors will be used instead.") );
+
+ cbTitleBarOnTop = new TQCheckBox(
+ i18n("&Show title bar on top of windows"), mainWidget );
+
+ TQWhatsThis::add( cbTitleBarOnTop,
+ i18n("When selected, all window titlebars will be shown "
+ "at the top of each window, otherwise they will be "
+ "shown at the bottom.") );
+
+ cbShowMenuButtonIcon = new TQCheckBox(
+ i18n("&Menu button always shows application mini icon"), mainWidget );
+
+ TQWhatsThis::add( cbShowMenuButtonIcon,
+ i18n("When selected, all titlebar menu buttons will have "
+ "the application icon shown. If not selected, the current "
+ "theme's defaults are used instead.") );
+
+ urlLabel = new KURLLabel( mainWidget );
+ urlLabel->setText( i18n("Open KDE's IceWM theme folder") );
+
+ themeLabel = new TQLabel(
+ i18n("Clicking on the link above will cause a window to appear "
+ "showing the KDE IceWM theme folder. You can "
+ "add or remove native IceWM themes by "
+ "uncompressing <b>http://icewm.themes.org/</b> theme files "
+ "into this folder, or by creating folder symlinks to "
+ "existing IceWM themes on your system."), mainWidget );
+
+ // Load configuration options
+ load( conf );
+
+ // Ensure we track user changes properly
+ connect( themeListBox, TQT_SIGNAL(selectionChanged()),
+ this, TQT_SLOT(slotSelectionChanged()) );
+
+ connect( urlLabel, TQT_SIGNAL(leftClickedURL(const TQString&)),
+ this, TQT_SLOT(callURL(const TQString&)));
+
+ connect( cbThemeTitleTextColors, TQT_SIGNAL(clicked()),
+ this, TQT_SLOT(slotSelectionChanged()) );
+
+ connect( cbTitleBarOnTop, TQT_SIGNAL(clicked()),
+ this, TQT_SLOT(slotSelectionChanged()) );
+
+ connect( cbShowMenuButtonIcon, TQT_SIGNAL(clicked()),
+ this, TQT_SLOT(slotSelectionChanged()) );
+
+ // Create the theme directory (if not found) ... and obtain the path as we do so.
+ localThemeString = KGlobal::dirs()->saveLocation("data", "twin");
+ localThemeString += "/icewm-themes";
+ if (!TQFile::exists(localThemeString))
+ TQDir().mkdir(localThemeString);
+
+ // Watch the icewm theme directory for theme additions/removals
+ KDirWatch::self()->addDir(localThemeString);
+ connect( KDirWatch::self(), TQT_SIGNAL(dirty(const TQString&)), this, TQT_SLOT(findIceWMThemes()) );
+ connect( KDirWatch::self(), TQT_SIGNAL(created(const TQString&)), this, TQT_SLOT(findIceWMThemes()) );
+ connect( KDirWatch::self(), TQT_SIGNAL(deleted(const TQString&)), this, TQT_SLOT(findIceWMThemes()) );
+
+ // Set the konqui link url
+ TQString urlThemeString = TQString("file://") + localThemeString;
+ urlThemeString.replace( TQRegExp("~"), "$HOME" );
+ urlLabel->setURL( urlThemeString );
+
+ // Make the widgets visible in twindecoration
+ mainWidget->show();
+
+ KDirWatch::self()->startScan();
+}
+
+
+IceWMConfig::~IceWMConfig()
+{
+ KDirWatch::self()->removeDir(localThemeString);
+ KDirWatch::self()->stopScan();
+ delete icewmConfig;
+ delete mainWidget;
+}
+
+
+// Searches for all installed IceWM themes, and adds them to the listBox.
+void IceWMConfig::findIceWMThemes()
+{
+ TQStringList dirList = KGlobal::dirs()->findDirs("data", "twin/icewm-themes");
+ TQStringList::ConstIterator it;
+
+ // Remove any old themes in the list (if any)
+ themeListBox->clear();
+ themeListBox->insertItem( i18n("Infadel #2 (default)") );
+
+ // Step through all twin/icewm-themes directories...
+ for( it = dirList.begin(); it != dirList.end(); it++)
+ {
+ // List all directory names only...
+ TQDir d(*it, TQString("*"), TQDir::Unsorted, TQDir::Dirs | TQDir::Readable );
+ if (d.exists())
+ {
+ TQFileInfoListIterator it2( *d.entryInfoList() );
+ TQFileInfo* finfo;
+
+ // Step through all directories within the twin/icewm-themes directory
+ while( (finfo = it2.current()) )
+ {
+ // Ignore . and .. directories
+ if ( (finfo->fileName() == ".") || (finfo->fileName() == "..") )
+ {
+ ++it2;
+ continue;
+ }
+
+ if ( !themeListBox->findItem( finfo->fileName()) )
+ themeListBox->insertItem( finfo->fileName() );
+
+ ++it2;
+ }
+ }
+ }
+
+ // Sort the items
+ themeListBox->sort();
+
+ // Select the currently used IceWM theme
+ TQString themeName = icewmConfig->readEntry("CurrentTheme");
+
+ // Provide a theme alias
+ if (themeName == "default")
+ themeName = "";
+
+ if (themeName.isEmpty())
+ themeListBox->setCurrentItem(
+ themeListBox->findItem( i18n("Infadel #2 (default)") ) );
+ else
+ themeListBox->setCurrentItem( themeListBox->findItem(themeName) );
+}
+
+
+void IceWMConfig::callURL( const TQString& s )
+{
+ kapp->invokeBrowser( s );
+}
+
+
+void IceWMConfig::slotSelectionChanged()
+{
+ emit changed();
+}
+
+
+// Loads the configurable options from the twinicewmrc config file
+void IceWMConfig::load( KConfig* )
+{
+ icewmConfig->setGroup("General");
+
+ bool override = icewmConfig->readBoolEntry( "ThemeTitleTextColors", true );
+ cbThemeTitleTextColors->setChecked( override );
+
+ override = icewmConfig->readBoolEntry( "TitleBarOnTop", true );
+ cbTitleBarOnTop->setChecked( override );
+
+ override = icewmConfig->readBoolEntry( "ShowMenuButtonIcon", false );
+ cbShowMenuButtonIcon->setChecked( override );
+
+ findIceWMThemes();
+}
+
+
+// Saves the configurable options to the twinicewmrc config file
+void IceWMConfig::save( KConfig* )
+{
+ icewmConfig->setGroup("General");
+ icewmConfig->writeEntry( "ThemeTitleTextColors", cbThemeTitleTextColors->isChecked() );
+ icewmConfig->writeEntry( "TitleBarOnTop", cbTitleBarOnTop->isChecked() );
+ icewmConfig->writeEntry( "ShowMenuButtonIcon", cbShowMenuButtonIcon->isChecked() );
+
+ if (themeListBox->currentText() == i18n("Infadel #2 (default)"))
+ icewmConfig->writeEntry("CurrentTheme", "default");
+ else
+ icewmConfig->writeEntry("CurrentTheme", themeListBox->currentText() );
+
+ icewmConfig->sync();
+}
+
+
+// Sets UI widget defaults which must correspond to config defaults
+void IceWMConfig::defaults()
+{
+ cbThemeTitleTextColors->setChecked( true );
+ cbTitleBarOnTop->setChecked( true );
+ cbShowMenuButtonIcon->setChecked( false );
+ themeListBox->setCurrentItem( themeListBox->findItem(i18n("Infadel #2 (default)")) );
+}
+
+#include "config.moc"
+// vim: ts=4
diff --git a/twin-styles/icewm/config/config.h b/twin-styles/icewm/config/config.h
new file mode 100644
index 00000000..c9c5b2d0
--- /dev/null
+++ b/twin-styles/icewm/config/config.h
@@ -0,0 +1,77 @@
+/*
+ * $Id$
+ *
+ * This file contains the IceWM configuration widget
+ *
+ * Copyright (c) 2001
+ * Karol Szwed <gallium@kde.org>
+ * http://gallium.n3.net/
+ *
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef _ICEWMCONFIG_H
+#define _ICEWMCONFIG_H
+
+#include <tqwidget.h>
+#include <tqcheckbox.h>
+#include <tqgroupbox.h>
+#include <tqlistbox.h>
+#include <tqlabel.h>
+#include <kurllabel.h>
+#include <kconfig.h>
+
+class TQVBox;
+
+class IceWMConfig: public TQObject
+{
+ Q_OBJECT
+ TQ_OBJECT
+
+ public:
+ IceWMConfig( KConfig* conf, TQWidget* parent );
+ ~IceWMConfig();
+
+ // These public signals/slots work similar to KCM modules
+ signals:
+ void changed();
+
+ public slots:
+ void load( KConfig* conf );
+ void save( KConfig* conf );
+ void defaults();
+
+ protected slots:
+ void slotSelectionChanged(); // Internal use
+ void callURL( const TQString& s );
+ void findIceWMThemes();
+
+ private:
+ KConfig* icewmConfig;
+ TQCheckBox* cbThemeTitleTextColors;
+ TQCheckBox* cbTitleBarOnTop;
+ TQCheckBox* cbShowMenuButtonIcon;
+ TQListBox* themeListBox;
+ TQLabel* themeLabel;
+ KURLLabel* urlLabel;
+ TQString localThemeString;
+ TQVBox* mainWidget;
+};
+
+
+#endif
+// vim: ts=4
diff --git a/twin-styles/icewm/icewm-themes/CMakeLists.txt b/twin-styles/icewm/icewm-themes/CMakeLists.txt
new file mode 100644
index 00000000..367553ab
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/CMakeLists.txt
@@ -0,0 +1,21 @@
+#################################################
+#
+# (C) 2011 Golubev Alexander
+# fatzer2 (AT) gmail.com
+#
+# Improvements and feedback are welcome
+#
+# This file is released under GPL >= 2
+#
+#################################################
+
+install( FILES
+ titleAB.xpm titleAJ.xpm titleAM.xpm titleAP.xpm titleAQ.xpm
+ titleAR.xpm titleAS.xpm titleAT.xpm titleIB.xpm titleIJ.xpm
+ titleIM.xpm titleIQ.xpm titleIR.xpm titleIS.xpm titleIT.xpm
+ titleIP.xpm closeA.xpm closeI.xpm depthA.xpm depthI.xpm
+ maximizeA.xpm maximizeI.xpm menuButtonA.xpm menuButtonI.xpm
+ minimizeA.xpm minimizeI.xpm restoreA.xpm restoreI.xpm
+ rolldownA.xpm rolldownI.xpm rollupA.xpm rollupI.xpm
+ default.theme
+ DESTINATION ${DATA_INSTALL_DIR}/twin/icewm-themes )
diff --git a/twin-styles/icewm/icewm-themes/Makefile.am b/twin-styles/icewm/icewm-themes/Makefile.am
new file mode 100644
index 00000000..dcd5463a
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/Makefile.am
@@ -0,0 +1,12 @@
+pics_DATA = titleAB.xpm titleAJ.xpm titleAM.xpm titleAP.xpm titleAQ.xpm \
+ titleAR.xpm titleAS.xpm titleAT.xpm titleIB.xpm titleIJ.xpm \
+ titleIM.xpm titleIQ.xpm titleIR.xpm titleIS.xpm titleIT.xpm \
+ titleIP.xpm closeA.xpm closeI.xpm depthA.xpm depthI.xpm \
+ maximizeA.xpm maximizeI.xpm menuButtonA.xpm menuButtonI.xpm \
+ minimizeA.xpm minimizeI.xpm restoreA.xpm restoreI.xpm \
+ rolldownA.xpm rolldownI.xpm rollupA.xpm rollupI.xpm \
+ default.theme
+
+picsdir = $(kde_datadir)/twin/icewm-themes
+
+
diff --git a/twin-styles/icewm/icewm-themes/closeA.xpm b/twin-styles/icewm/icewm-themes/closeA.xpm
new file mode 100644
index 00000000..cc202bcd
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/closeA.xpm
@@ -0,0 +1,69 @@
+/* XPM */
+static char * closeA_xpm[] = {
+"15 34 32 1",
+" c None",
+". c #858686",
+"+ c #9A9A9A",
+"@ c #AEAEAE",
+"# c #5D5D5E",
+"$ c #111214",
+"% c #040404",
+"& c #C2C2C2",
+"* c #181C22",
+"= c #2D333D",
+"- c #56657A",
+"; c #58667E",
+"> c #5D6E86",
+", c #D6D6D6",
+"' c #1D2632",
+") c #4A4A4A",
+"! c #6E809C",
+"~ c #EAEAEA",
+"{ c #717273",
+"] c #232D3A",
+"^ c #4D5868",
+"/ c #798EAA",
+"( c #7E96B6",
+"_ c #C7CDD4",
+": c #FEFEFE",
+"< c #8CA3C5",
+"[ c #435165",
+"} c #3C4553",
+"| c #323F4F",
+"1 c #0D0E13",
+"2 c #363636",
+"3 c #677B98",
+"...............",
+"+++++++++++++++",
+"@@@@#$%%%$#@@@@",
+"&&&*=-;>;-=*&&&",
+",,')->!!!>;)',,",
+"~{]^>!/(/_>^]{~",
+":*)^>!(<'!_^[*:",
+"~%}^>!/*/_>^}%~",
+",%}[->*!,>;^}%,",
+"&%|[^$>_>;^}=%&",
+"@$]|1[&^^^}|]$@",
+"+)$]|&}[)||=$)+",
+"..**']=|=]]**..",
+"{{{$1*'''*1${{{",
+"####=%%%%1=####",
+")))))))))))))))",
+"2222222=2222222",
+"...............",
+"+++++++++++++++",
+"@@@@)1%%%$)@@@@",
+"&&&*'})[)}]*&&&",
+",,*=)[^-^^}2*,,",
+"~{'}[^;>;-[}'{~",
+":$=}[^>31+[|=*:",
+"~%=}[^;$;^+|=%~",
+",%]|}^1-^+}|]%,",
+"&%'2|1[[/)|2'%&",
+"@1']%|}.}|2]'1@",
+"+)1']=.==]]'1)+",
+"..$$*.]]''*$1..",
+"{{{11$***$1${{{",
+"####]%%%%%]####",
+")))))))))))))))",
+"222222222222222"};
diff --git a/twin-styles/icewm/icewm-themes/closeI.xpm b/twin-styles/icewm/icewm-themes/closeI.xpm
new file mode 100644
index 00000000..4529b06f
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/closeI.xpm
@@ -0,0 +1,69 @@
+/* XPM */
+static char * closeI_xpm[] = {
+"15 34 32 1",
+" g None",
+". g #858585",
+"+ g #9A9A9A",
+"@ g #AEAEAE",
+"# g #5D5D5D",
+"$ g #111111",
+"% g #040404",
+"& g #C2C2C2",
+"* g #1B1B1B",
+"= g #323232",
+"- g #626262",
+"; g #646464",
+"> g #6B6B6B",
+", g #D6D6D6",
+"' g #242424",
+") g #4A4A4A",
+"! g #7D7D7D",
+"~ g #EAEAEA",
+"{ g #717171",
+"] g #2B2B2B",
+"^ g #565656",
+"/ g #8A8A8A",
+"( g #929292",
+"_ g #CBCBCB",
+": g #FEFEFE",
+"< g #9F9F9F",
+"[ g #4F4F4F",
+"} g #434343",
+"| g #3C3C3C",
+"1 g #0E0E0E",
+"2 g #363636",
+"3 g #787878",
+"...............",
+"+++++++++++++++",
+"@@@@#$%%%$#@@@@",
+"&&&*=-;>;-=*&&&",
+",,')->!!!>;)',,",
+"~{]^>!/(/_>^]{~",
+":*)^>!(<'!_^[*:",
+"~%}^>!/*/_>^}%~",
+",%}[->*!,>;^}%,",
+"&%|[^$>_>;^}=%&",
+"@$]|1[&^^^}|]$@",
+"+)$]|&}[)||=$)+",
+"..**']=|=]]**..",
+"{{{$1*'''*1${{{",
+"####=%%%%1=####",
+")))))))))))))))",
+"2222222=2222222",
+"...............",
+"+++++++++++++++",
+"@@@@)1%%%$)@@@@",
+"&&&*'})[)}]*&&&",
+",,*=)[^-^^}2*,,",
+"~{'}[^;>;-[}'{~",
+":$=}[^>31+[|=*:",
+"~%=}[^;$;^+|=%~",
+",%]|}^1-^+}|]%,",
+"&%'2|1[[/)|2'%&",
+"@1']%|}.}|2]'1@",
+"+)1']=.==]]'1)+",
+"..$$*.]]''*$1..",
+"{{{11$***$1${{{",
+"####]%%%%%]####",
+")))))))))))))))",
+"222222222222222"};
diff --git a/twin-styles/icewm/icewm-themes/default.theme b/twin-styles/icewm/icewm-themes/default.theme
new file mode 100644
index 00000000..945a3824
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/default.theme
@@ -0,0 +1,48 @@
+# Xerithane:
+#
+# Well, Artwiz inspired me (dirty lil blackbox user <g>)
+# So, I ripped his font (snap.pcf), and then got the chrome style idea and
+# adapted the theme as a rip of the e.t.o page (get it, Infadel..)
+# Some of the borrowed style is from Area 51 (by RudeSka, herald of #icewm)
+# Also borrowed are some icons from Area 51.
+#
+# tbf:
+#
+# Extended Artwiz's snap font, added cursors, polished the applets.
+# Invented depth, hide, rollup and rolldown buttons. Redraw the others.
+# Reduced number of colors.
+
+# closeI.xpm depthI.xpm maximizeI.xpm minimizeI.xpm restoreI.xpm hideI.xpm
+# rollupI.xpm rolldownI.xpm menuButtonI.xpm
+# closeA.xpm depthA.xpm maximizeA.xpm minimizeA.xpm restoreA.xpm hideA.xpm
+# rollupA.xpm rolldownA.xpm menuButtonA.xpm
+
+# PLEASE NOTE:
+# ============
+# Heavily modified by gallium for the purposes of twin-icewm.
+# Please do not use this for icewm. Use the original icewm Infadel #2 instead.
+# The full Infadel #2 theme will still work with twin-icewm as well, but
+# this trimmed version is included here for space reasons.
+
+ThemeDescription="Infadel/1.0.7(twin)"
+ThemeAuthor="xerithane@nerdfarm.org"
+Look=pixmap
+
+TitleButtonsLeft="s"
+TitleButtonsRight="xmi"
+TitleButtonsSupported="sxmihrd"
+TitleBarCentered=1
+TitleBarHeight=17
+
+# Modified border sizes so they're more user "grip" friendly
+BorderSizeX=3
+BorderSizeY=3
+CornerSizeX=28
+CornerSizeY=28
+
+ColorNormalTitleBarText="#c0c0c0"
+ColorActiveTitleBarText="#ffffff"
+ColorActiveBorder="#868687"
+ColorNormalBorder="#575757"
+
+ShowMenuButtonIcon=0
diff --git a/twin-styles/icewm/icewm-themes/depthA.xpm b/twin-styles/icewm/icewm-themes/depthA.xpm
new file mode 100644
index 00000000..67a2e1e6
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/depthA.xpm
@@ -0,0 +1,69 @@
+/* XPM */
+static char * depthA_xpm[] = {
+"15 34 32 1",
+" c None",
+". c #858686",
+"+ c #9A9A9A",
+"@ c #AEAEAE",
+"# c #363636",
+"$ c #0D0E13",
+"% c #040404",
+"& c #C2C2C2",
+"* c #4A4A4A",
+"= c #2D333D",
+"- c #56657A",
+"; c #5D6E86",
+"> c #D6D6D6",
+", c #4D5868",
+"' c #677B98",
+") c #6E809C",
+"! c #58667E",
+"~ c #EAEAEA",
+"{ c #232D3A",
+"] c #798EAA",
+"^ c #7E96B6",
+"/ c #FEFEFE",
+"( c #3C4553",
+"_ c #8CA3C5",
+": c #111214",
+"< c #323F4F",
+"[ c #435165",
+"} c #C7CDD4",
+"| c #717273",
+"1 c #181C22",
+"2 c #1D2632",
+"3 c #5D5D5E",
+"...............",
+"+++++++++++++++",
+"@@@@.#$%$#.@@@@",
+"&&&*=-;;;-=*&&&",
+">>,*-;')';!*,>>",
+"~@{,;)]^]);,{@~",
+"/*(-;)^_^);,(,/",
+"~:(,;)<(<);,*:~",
+">%([!=)))}![(%>",
+"&:=*[-}}&-,[=$&",
+"@#=<*[,-,[(<{#@",
+"+|:{<(((*(<=:|+",
+"..#1{=<==={1#..",
+"|||{$12221$=|||",
+"3333(1%%%1(3333",
+"***************",
+"###############",
+"...............",
+"+++++++++++++++",
+"@@@@|{$%%=|@@@@",
+"&&&(2**[[(2(&&&",
+">>*=([,3,,*#*>>",
+"~+1([3!;!,[(2+~",
+"/(#([,;'!-[(#(/",
+"~:=([,{={,[<=:~",
+">%{<(2,-,+(<=%>",
+"&$2#((^+.[<=2$&",
+"@=2{=#<<(<#{1=@",
+"+3$2{===={{2$!+",
+"..=:122{221:=..",
+"|||{%1111:$2|||",
+"3333#1%%%:*3333",
+"***************",
+"###############"};
diff --git a/twin-styles/icewm/icewm-themes/depthI.xpm b/twin-styles/icewm/icewm-themes/depthI.xpm
new file mode 100644
index 00000000..e4fe17a9
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/depthI.xpm
@@ -0,0 +1,69 @@
+/* XPM */
+static char * depthI_xpm[] = {
+"15 34 32 1",
+" g None",
+". g #858585",
+"+ g #9A9A9A",
+"@ g #AEAEAE",
+"# g #363636",
+"$ g #0E0E0E",
+"% g #040404",
+"& g #C2C2C2",
+"* g #4A4A4A",
+"= g #323232",
+"- g #626262",
+"; g #6B6B6B",
+"> g #D6D6D6",
+", g #565656",
+"' g #787878",
+") g #7D7D7D",
+"! g #646464",
+"~ g #EAEAEA",
+"{ g #2B2B2B",
+"] g #8A8A8A",
+"^ g #929292",
+"/ g #FEFEFE",
+"( g #434343",
+"_ g #9F9F9F",
+": g #111111",
+"< g #3C3C3C",
+"[ g #4F4F4F",
+"} g #CBCBCB",
+"| g #717171",
+"1 g #1B1B1B",
+"2 g #242424",
+"3 g #5D5D5D",
+"...............",
+"+++++++++++++++",
+"@@@@.#$%$#.@@@@",
+"&&&*=-;;;-=*&&&",
+">>,*-;')';!*,>>",
+"~@{,;)]^]);,{@~",
+"/*(-;)^_^);,(,/",
+"~:(,;)<(<);,*:~",
+">%([!=)))}![(%>",
+"&:=*[-}}&-,[=$&",
+"@#=<*[,-,[(<{#@",
+"+|:{<(((*(<=:|+",
+"..#1{=<==={1#..",
+"|||{$12221$=|||",
+"3333(1%%%1(3333",
+"***************",
+"###############",
+"...............",
+"+++++++++++++++",
+"@@@@|{$%%=|@@@@",
+"&&&(2**[[(2(&&&",
+">>*=([,3,,*#*>>",
+"~+1([3!;!,[(2+~",
+"/(#([,;'!-[(#(/",
+"~:=([,{={,[<=:~",
+">%{<(2,-,+(<=%>",
+"&$2#((^+.[<=2$&",
+"@=2{=#<<(<#{1=@",
+"+3$2{===={{2$!+",
+"..=:122{221:=..",
+"|||{%1111:$2|||",
+"3333#1%%%:*3333",
+"***************",
+"###############"};
diff --git a/twin-styles/icewm/icewm-themes/maximizeA.xpm b/twin-styles/icewm/icewm-themes/maximizeA.xpm
new file mode 100644
index 00000000..c34304dc
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/maximizeA.xpm
@@ -0,0 +1,68 @@
+/* XPM */
+static char * maximizeA_xpm[] = {
+"15 34 31 1",
+" c None",
+". c #858686",
+"+ c #9A9A9A",
+"@ c #AEAEAE",
+"# c #5D5D5E",
+"$ c #111214",
+"% c #040404",
+"& c #C2C2C2",
+"* c #181C22",
+"= c #2D333D",
+"- c #56657A",
+"; c #58667E",
+"> c #5D6E86",
+", c #D6D6D6",
+"' c #1D2632",
+") c #4A4A4A",
+"! c #6E809C",
+"~ c #EAEAEA",
+"{ c #717273",
+"] c #232D3A",
+"^ c #4D5868",
+"/ c #798EAA",
+"( c #7E96B6",
+"_ c #FEFEFE",
+": c #7A91B1",
+"< c #3C4553",
+"[ c #435165",
+"} c #C7CDD4",
+"| c #323F4F",
+"1 c #0D0E13",
+"2 c #363636",
+"...............",
+"+++++++++++++++",
+"@@@@#$%%%$#@@@@",
+"&&&*=-;>;-=*&&&",
+",,')->!!!>;)',,",
+"~{]^>!/(/!>^]{~",
+"_*)^>!(~:!>-)*_",
+"~%<^>!,@,!>^<%~",
+",%<[-}@@@};^|%,",
+"&%|[^%%%%%^<|%&",
+"@$]|<^^^^^<|]$@",
+"+)$]|<<[<<|]$)+",
+"..**'==|=]]**..",
+"{{{$1*'''*1${{{",
+"####=%%%%1=####",
+")))))))))))))))",
+"222222222222222",
+"...............",
+"+++++++++++++++",
+"@@@@)1%%%$)@@@@",
+"&&&*'<)[)['*}&&",
+",,*2<^^^^[<2*,,",
+"~{'<[^>>;-)<*{~",
+"_$=|[->+;-[<2*_",
+"~%=<[^+.+^[|=%~",
+",%]|<+.!!+<|]%,",
+"&%'=|%%%%%|2'%&",
+"@1']=||<||2]'1@",
+"+)1']==2=]]'1)+",
+"..$1*'''''*$1..",
+"{{{11$***$1${{{",
+"####]%%%%%]####",
+")))))))))))))))",
+"222222222222222"};
diff --git a/twin-styles/icewm/icewm-themes/maximizeI.xpm b/twin-styles/icewm/icewm-themes/maximizeI.xpm
new file mode 100644
index 00000000..d857672b
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/maximizeI.xpm
@@ -0,0 +1,68 @@
+/* XPM */
+static char * maximizeI_xpm[] = {
+"15 34 31 1",
+" g None",
+". g #858585",
+"+ g #9A9A9A",
+"@ g #AEAEAE",
+"# g #5D5D5D",
+"$ g #111111",
+"% g #040404",
+"& g #C2C2C2",
+"* g #1B1B1B",
+"= g #323232",
+"- g #626262",
+"; g #646464",
+"> g #6B6B6B",
+", g #D6D6D6",
+"' g #242424",
+") g #4A4A4A",
+"! g #7D7D7D",
+"~ g #EAEAEA",
+"{ g #717171",
+"] g #2B2B2B",
+"^ g #565656",
+"/ g #8A8A8A",
+"( g #929292",
+"_ g #FEFEFE",
+": g #8D8D8D",
+"< g #434343",
+"[ g #4F4F4F",
+"} g #CBCBCB",
+"| g #3C3C3C",
+"1 g #0E0E0E",
+"2 g #363636",
+"...............",
+"+++++++++++++++",
+"@@@@#$%%%$#@@@@",
+"&&&*=-;>;-=*&&&",
+",,')->!!!>;)',,",
+"~{]^>!/(/!>^]{~",
+"_*)^>!(~:!>-)*_",
+"~%<^>!,@,!>^<%~",
+",%<[-}@@@};^|%,",
+"&%|[^%%%%%^<|%&",
+"@$]|<^^^^^<|]$@",
+"+)$]|<<[<<|]$)+",
+"..**'==|=]]**..",
+"{{{$1*'''*1${{{",
+"####=%%%%1=####",
+")))))))))))))))",
+"222222222222222",
+"...............",
+"+++++++++++++++",
+"@@@@)1%%%$)@@@@",
+"&&&*'<)[)['*}&&",
+",,*2<^^^^[<2*,,",
+"~{'<[^>>;-)<*{~",
+"_$=|[->+;-[<2*_",
+"~%=<[^+.+^[|=%~",
+",%]|<+.!!+<|]%,",
+"&%'=|%%%%%|2'%&",
+"@1']=||<||2]'1@",
+"+)1']==2=]]'1)+",
+"..$1*'''''*$1..",
+"{{{11$***$1${{{",
+"####]%%%%%]####",
+")))))))))))))))",
+"222222222222222"};
diff --git a/twin-styles/icewm/icewm-themes/menuButtonA.xpm b/twin-styles/icewm/icewm-themes/menuButtonA.xpm
new file mode 100644
index 00000000..e4b5e0ed
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/menuButtonA.xpm
@@ -0,0 +1,68 @@
+/* XPM */
+static char * menuButtonA_xpm[] = {
+"17 34 31 1",
+" c None",
+". c #858686",
+"+ c #9A9A9A",
+"@ c #AEAEAE",
+"# c #363636",
+"$ c #0D0E13",
+"% c #040404",
+"& c #C2C2C2",
+"* c #4A4A4A",
+"= c #2D333D",
+"- c #56657A",
+"; c #5D6E86",
+"> c #D6D6D6",
+", c #4D5868",
+"' c #677B98",
+") c #6E809C",
+"! c #58667E",
+"~ c #EAEAEA",
+"{ c #232D3A",
+"] c #798EAA",
+"^ c #7E96B6",
+"/ c #FEFEFE",
+"( c #3C4553",
+"_ c #8CA3C5",
+": c #111214",
+"< c #435165",
+"[ c #323F4F",
+"} c #717273",
+"| c #181C22",
+"1 c #1D2632",
+"2 c #5D5D5E",
+".................",
+"+++++++++++++++++",
+"@@@@@.#$%$#.@@@@@",
+"&&&&*=-;;;-=*&&&&",
+">>>,*-;')';!*,>>>",
+"~~@{,;)]^]);,{@~~",
+"//*(-;)^_^);,(,//",
+"~~:(,;)]^]);,*:~~",
+">>%(<%%%%%%%<(%>>",
+"&&$=<@&&&&&@<=$&&",
+"@@#{[*<,,,,([=#@@",
+"++}|{[((<(([=:}++",
+"...#|{{=[={{|#...",
+"}}}}{$|111|$=}}}}",
+"22222(|%%$|(22222",
+"*****************",
+"#################",
+".................",
+"+++++++++++++++++",
+"@@@@@}{$%%=}@@@@@",
+"&&&&(1**<<(1(&&&&",
+">>>*=(<,-2<*#*>>>",
+"~~+|(<,-;-,<(1+~~",
+"//(#(<-;'!-<(#(//",
+"~~$=[*,!;-,<[=:~~",
+">>%{[%%%%%%%[{%>>",
+"&&$1#.]..]..#1$&&",
+"@@=1{=[((([#{1=@@",
+"++2$1{====={|$2++",
+"...{:|11{11|:=...",
+"}}}}{%:|||:$1}}}}",
+"22222(|%%%|(22222",
+"*****************",
+"#################"};
diff --git a/twin-styles/icewm/icewm-themes/menuButtonI.xpm b/twin-styles/icewm/icewm-themes/menuButtonI.xpm
new file mode 100644
index 00000000..854ea273
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/menuButtonI.xpm
@@ -0,0 +1,68 @@
+/* XPM */
+static char * menuButtonI_xpm[] = {
+"17 34 31 1",
+" g None",
+". g #858585",
+"+ g #9A9A9A",
+"@ g #AEAEAE",
+"# g #363636",
+"$ g #0E0E0E",
+"% g #040404",
+"& g #C2C2C2",
+"* g #4A4A4A",
+"= g #323232",
+"- g #626262",
+"; g #6B6B6B",
+"> g #D6D6D6",
+", g #565656",
+"' g #787878",
+") g #7D7D7D",
+"! g #646464",
+"~ g #EAEAEA",
+"{ g #2B2B2B",
+"] g #8A8A8A",
+"^ g #929292",
+"/ g #FEFEFE",
+"( g #434343",
+"_ g #9F9F9F",
+": g #111111",
+"< g #4F4F4F",
+"[ g #3C3C3C",
+"} g #717171",
+"| g #1B1B1B",
+"1 g #242424",
+"2 g #5D5D5D",
+".................",
+"+++++++++++++++++",
+"@@@@@.#$%$#.@@@@@",
+"&&&&*=-;;;-=*&&&&",
+">>>,*-;')';!*,>>>",
+"~~@{,;)]^]);,{@~~",
+"//*(-;)^_^);,(,//",
+"~~:(,;)]^]);,*:~~",
+">>%(<%%%%%%%<(%>>",
+"&&$=<@&&&&&@<=$&&",
+"@@#{[*<,,,,([=#@@",
+"++}|{[((<(([=:}++",
+"...#|{{=[={{|#...",
+"}}}}{$|111|$=}}}}",
+"22222(|%%$|(22222",
+"*****************",
+"#################",
+".................",
+"+++++++++++++++++",
+"@@@@@}{$%%=}@@@@@",
+"&&&&(1**<<(1(&&&&",
+">>>*=(<,-2<*#*>>>",
+"~~+|(<,-;-,<(1+~~",
+"//(#(<-;'!-<(#(//",
+"~~$=[*,!;-,<[=:~~",
+">>%{[%%%%%%%[{%>>",
+"&&$1#.]..]..#1$&&",
+"@@=1{=[((([#{1=@@",
+"++2$1{====={|$2++",
+"...{:|11{11|:=...",
+"}}}}{%:|||:$1}}}}",
+"22222(|%%%|(22222",
+"*****************",
+"#################"};
diff --git a/twin-styles/icewm/icewm-themes/minimizeA.xpm b/twin-styles/icewm/icewm-themes/minimizeA.xpm
new file mode 100644
index 00000000..bcbfa3a7
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/minimizeA.xpm
@@ -0,0 +1,68 @@
+/* XPM */
+static char * minimizeA_xpm[] = {
+"15 34 31 1",
+" c None",
+". c #858686",
+"+ c #9A9A9A",
+"@ c #AEAEAE",
+"# c #5D5D5E",
+"$ c #111214",
+"% c #040404",
+"& c #C2C2C2",
+"* c #181C22",
+"= c #2D333D",
+"- c #56657A",
+"; c #58667E",
+"> c #5D6E86",
+", c #D6D6D6",
+"' c #1D2632",
+") c #4A4A4A",
+"! c #6E809C",
+"~ c #EAEAEA",
+"{ c #717273",
+"] c #232D3A",
+"^ c #4D5868",
+"/ c #798EAA",
+"( c #7E96B6",
+"_ c #FEFEFE",
+": c #8CA3C5",
+"< c #3C4553",
+"[ c #323F4F",
+"} c #0D0E13",
+"| c #435165",
+"1 c #363636",
+"2 c #677B98",
+"...............",
+"+++++++++++++++",
+"@@@@#$%%%$#@@@@",
+"&&&*=-;>;-=*&&&",
+",,')->!!!>;)',,",
+"~{]^>!/(/!>^]{~",
+"_*)^>!(:(!>-)*_",
+"~%<^>,,,,,>^<%~",
+",%<^-%@@@%-^[%,",
+"&%[<^-}@%-^<[%&",
+"@}][<|^%^|<[]$@",
+"+|$][<<|<<[=$)+",
+"..**]==[=]]**..",
+"{{{$}*'''*}${{{",
+"####=%%%%}]####",
+")))))))))))))))",
+"111111111111111",
+"...............",
+"+++++++++++++++",
+"@@@@)}%%%}^@@@@",
+"&&&*'<)|)<'*&&&",
+",,*1||^-^|)1*,,",
+"~{*[|^;>;^|<'{~",
+"_*1<|->2>-|<=*_",
+"~%=[|+++++|[=%~",
+",%=[<%!.!%<[]%,",
+"&%'1[<%.%)[1'%&",
+"@}']11[%[[1]'}@",
+"+)}']==1==]'})+",
+"..}$*'''''*$}..",
+"{{{$}$**$$}}{{{",
+"####]%%%%}]####",
+")))))))))))))))",
+"111111111111111"};
diff --git a/twin-styles/icewm/icewm-themes/minimizeI.xpm b/twin-styles/icewm/icewm-themes/minimizeI.xpm
new file mode 100644
index 00000000..e2e954a2
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/minimizeI.xpm
@@ -0,0 +1,68 @@
+/* XPM */
+static char * minimizeI_xpm[] = {
+"15 34 31 1",
+" g None",
+". g #858585",
+"+ g #9A9A9A",
+"@ g #AEAEAE",
+"# g #5D5D5D",
+"$ g #111111",
+"% g #040404",
+"& g #C2C2C2",
+"* g #1B1B1B",
+"= g #323232",
+"- g #626262",
+"; g #646464",
+"> g #6B6B6B",
+", g #D6D6D6",
+"' g #242424",
+") g #4A4A4A",
+"! g #7D7D7D",
+"~ g #EAEAEA",
+"{ g #717171",
+"] g #2B2B2B",
+"^ g #565656",
+"/ g #8A8A8A",
+"( g #929292",
+"_ g #FEFEFE",
+": g #9F9F9F",
+"< g #434343",
+"[ g #3C3C3C",
+"} g #0E0E0E",
+"| g #4F4F4F",
+"1 g #363636",
+"2 g #787878",
+"...............",
+"+++++++++++++++",
+"@@@@#$%%%$#@@@@",
+"&&&*=-;>;-=*&&&",
+",,')->!!!>;)',,",
+"~{]^>!/(/!>^]{~",
+"_*)^>!(:(!>-)*_",
+"~%<^>,,,,,>^<%~",
+",%<^-%@@@%-^[%,",
+"&%[<^-}@%-^<[%&",
+"@}][<|^%^|<[]$@",
+"+|$][<<|<<[=$)+",
+"..**]==[=]]**..",
+"{{{$}*'''*}${{{",
+"####=%%%%}]####",
+")))))))))))))))",
+"111111111111111",
+"...............",
+"+++++++++++++++",
+"@@@@)}%%%}^@@@@",
+"&&&*'<)|)<'*&&&",
+",,*1||^-^|)1*,,",
+"~{*[|^;>;^|<'{~",
+"_*1<|->2>-|<=*_",
+"~%=[|+++++|[=%~",
+",%=[<%!.!%<[]%,",
+"&%'1[<%.%)[1'%&",
+"@}']11[%[[1]'}@",
+"+)}']==1==]'})+",
+"..}$*'''''*$}..",
+"{{{$}$**$$}}{{{",
+"####]%%%%}]####",
+")))))))))))))))",
+"111111111111111"};
diff --git a/twin-styles/icewm/icewm-themes/restoreA.xpm b/twin-styles/icewm/icewm-themes/restoreA.xpm
new file mode 100644
index 00000000..93481afe
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/restoreA.xpm
@@ -0,0 +1,68 @@
+/* XPM */
+static char * restoreA_xpm[] = {
+"15 34 31 1",
+" c None",
+". c #858686",
+"+ c #9A9A9A",
+"@ c #AEAEAE",
+"# c #5D5D5E",
+"$ c #111214",
+"% c #040404",
+"& c #C2C2C2",
+"* c #181C22",
+"= c #2D333D",
+"- c #56657A",
+"; c #58667E",
+"> c #5D6E86",
+", c #D6D6D6",
+"' c #1D2632",
+") c #4A4A4A",
+"! c #6E809C",
+"~ c #EAEAEA",
+"{ c #717273",
+"] c #232D3A",
+"^ c #4D5868",
+"/ c #798EAA",
+"( c #FEFEFE",
+"_ c #3C4553",
+": c #0D0E13",
+"< c #323F4F",
+"[ c #C7CDD4",
+"} c #435165",
+"| c #363636",
+"1 c #8CA3C5",
+"2 c #7E96B6",
+"...............",
+"+++++++++++++++",
+"@@@@#$%%%$#@@@@",
+"&&&*=-;>;-=*&&&",
+",,')->!!!>;)',,",
+"~{]^>!/,/!>^]{~",
+"(*)^>!,@,!>-)*(",
+"~%_^>,@@@,>^_%~",
+",%_^;%:%%%-^<%,",
+"&%<_^[[[[[^_<%&",
+"@:]<_:@@@%_<]$@",
+"+}$]<<%@%_<]$)+",
+"..**]]=%=]]**..",
+"{{{$:*'''*:${{{",
+"####=%%%%:=####",
+")))))))))))))))",
+"|||||||||||||||",
+"...............",
+"+++++++++++++++",
+"@@@@):%%%$)@@@@",
+"&&&*'_)})}'*[&&",
+",,*|_^^^^}_|*,,",
+"~{'_}^>1;#}<'{~",
+"($=<}-+.+^}_=*(",
+"~%=_)+!..+}<=%~",
+",%=<_%%%%%)|]%,",
+"&%'<<++2+/_=]%&",
+"@:*]=%.{.%|]*:@",
+"+):'']%{%]]':)+",
+"..$$*''%''*$$..",
+"{{{$:$***$::{{{",
+"####]%%%%:]####",
+")))))))))))))))",
+"|||||||||||||||"};
diff --git a/twin-styles/icewm/icewm-themes/restoreI.xpm b/twin-styles/icewm/icewm-themes/restoreI.xpm
new file mode 100644
index 00000000..b1408657
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/restoreI.xpm
@@ -0,0 +1,68 @@
+/* XPM */
+static char * restoreI_xpm[] = {
+"15 34 31 1",
+" g None",
+". g #858585",
+"+ g #9A9A9A",
+"@ g #AEAEAE",
+"# g #5D5D5D",
+"$ g #111111",
+"% g #040404",
+"& g #C2C2C2",
+"* g #1B1B1B",
+"= g #323232",
+"- g #626262",
+"; g #646464",
+"> g #6B6B6B",
+", g #D6D6D6",
+"' g #242424",
+") g #4A4A4A",
+"! g #7D7D7D",
+"~ g #EAEAEA",
+"{ g #717171",
+"] g #2B2B2B",
+"^ g #565656",
+"/ g #8A8A8A",
+"( g #FEFEFE",
+"_ g #434343",
+": g #0E0E0E",
+"< g #3C3C3C",
+"[ g #CBCBCB",
+"} g #4F4F4F",
+"| g #363636",
+"1 g #9F9F9F",
+"2 g #929292",
+"...............",
+"+++++++++++++++",
+"@@@@#$%%%$#@@@@",
+"&&&*=-;>;-=*&&&",
+",,')->!!!>;)',,",
+"~{]^>!/,/!>^]{~",
+"(*)^>!,@,!>-)*(",
+"~%_^>,@@@,>^_%~",
+",%_^;%:%%%-^<%,",
+"&%<_^[[[[[^_<%&",
+"@:]<_:@@@%_<]$@",
+"+}$]<<%@%_<]$)+",
+"..**]]=%=]]**..",
+"{{{$:*'''*:${{{",
+"####=%%%%:=####",
+")))))))))))))))",
+"|||||||||||||||",
+"...............",
+"+++++++++++++++",
+"@@@@):%%%$)@@@@",
+"&&&*'_)})}'*[&&",
+",,*|_^^^^}_|*,,",
+"~{'_}^>1;#}<'{~",
+"($=<}-+.+^}_=*(",
+"~%=_)+!..+}<=%~",
+",%=<_%%%%%)|]%,",
+"&%'<<++2+/_=]%&",
+"@:*]=%.{.%|]*:@",
+"+):'']%{%]]':)+",
+"..$$*''%''*$$..",
+"{{{$:$***$::{{{",
+"####]%%%%:]####",
+")))))))))))))))",
+"|||||||||||||||"};
diff --git a/twin-styles/icewm/icewm-themes/rolldownA.xpm b/twin-styles/icewm/icewm-themes/rolldownA.xpm
new file mode 100644
index 00000000..e7b70845
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/rolldownA.xpm
@@ -0,0 +1,68 @@
+/* XPM */
+static char * rolldownA_xpm[] = {
+"15 34 31 1",
+" c None",
+". c #858686",
+"+ c #9A9A9A",
+"@ c #AEAEAE",
+"# c #5D5D5E",
+"$ c #111214",
+"% c #040404",
+"& c #C2C2C2",
+"* c #181C22",
+"= c #2D333D",
+"- c #56657A",
+"; c #58667E",
+"> c #5D6E86",
+", c #D6D6D6",
+"' c #1D2632",
+") c #4A4A4A",
+"! c #6E809C",
+"~ c #EAEAEA",
+"{ c #717273",
+"] c #232D3A",
+"^ c #4D5868",
+"/ c #798EAA",
+"( c #7E96B6",
+"_ c #FEFEFE",
+": c #3C4553",
+"< c #323F4F",
+"[ c #0D0E13",
+"} c #C7CDD4",
+"| c #435165",
+"1 c #363636",
+"2 c #8CA3C5",
+"...............",
+"+++++++++++++++",
+"@@@@#$%%%$#@@@@",
+"&&&*=-;>;-=*&&&",
+",,')->!!!>;)',,",
+"~{]^>!/(/!>^]{~",
+"_*)^>,,~,,>-)*_",
+"~%:^>%@@@%>^:%~",
+",%:^->%@%>;^<%,",
+"&%<:^;>%>-^:<%&",
+"@[]<&&}}}&&<][@",
+"+|$]%%%%%%%=$)+",
+"..**]]====]**..",
+"{{{$[*']'*[${{{",
+"####=%%%%%=####",
+")))))))))))))))",
+"111111=11111111",
+"...............",
+"+++++++++++++++",
+"@@@@)[%%%[^@@@@",
+"&&&*':)|):'*&&&",
+",,*=)|^-^|)1*,,",
+"~{':|^;>;^|:'{~",
+"_$=:|+2+2+|:=*_",
+"~%=:|%...%)<=%~",
+",%]<:|%.%|)<]%,",
+"&%'1<:)%):<<'%&",
+"@[''+/+/+(.]*[@",
+"+)['%%%%%%%'[)+",
+"..$$*'''''*$$..",
+"{{{[[$***$[[{{{",
+"####]%%%%%]####",
+")))))))))))))))",
+"111111111111111"};
diff --git a/twin-styles/icewm/icewm-themes/rolldownI.xpm b/twin-styles/icewm/icewm-themes/rolldownI.xpm
new file mode 100644
index 00000000..993e561b
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/rolldownI.xpm
@@ -0,0 +1,68 @@
+/* XPM */
+static char * rolldownI_xpm[] = {
+"15 34 31 1",
+" g None",
+". g #858585",
+"+ g #9A9A9A",
+"@ g #AEAEAE",
+"# g #5D5D5D",
+"$ g #111111",
+"% g #040404",
+"& g #C2C2C2",
+"* g #1B1B1B",
+"= g #323232",
+"- g #626262",
+"; g #646464",
+"> g #6B6B6B",
+", g #D6D6D6",
+"' g #242424",
+") g #4A4A4A",
+"! g #7D7D7D",
+"~ g #EAEAEA",
+"{ g #717171",
+"] g #2B2B2B",
+"^ g #565656",
+"/ g #8A8A8A",
+"( g #929292",
+"_ g #FEFEFE",
+": g #434343",
+"< g #3C3C3C",
+"[ g #0E0E0E",
+"} g #CBCBCB",
+"| g #4F4F4F",
+"1 g #363636",
+"2 g #9F9F9F",
+"...............",
+"+++++++++++++++",
+"@@@@#$%%%$#@@@@",
+"&&&*=-;>;-=*&&&",
+",,')->!!!>;)',,",
+"~{]^>!/(/!>^]{~",
+"_*)^>,,~,,>-)*_",
+"~%:^>%@@@%>^:%~",
+",%:^->%@%>;^<%,",
+"&%<:^;>%>-^:<%&",
+"@[]<&&}}}&&<][@",
+"+|$]%%%%%%%=$)+",
+"..**]]====]**..",
+"{{{$[*']'*[${{{",
+"####=%%%%%=####",
+")))))))))))))))",
+"111111=11111111",
+"...............",
+"+++++++++++++++",
+"@@@@)[%%%[^@@@@",
+"&&&*':)|):'*&&&",
+",,*=)|^-^|)1*,,",
+"~{':|^;>;^|:'{~",
+"_$=:|+2+2+|:=*_",
+"~%=:|%...%)<=%~",
+",%]<:|%.%|)<]%,",
+"&%'1<:)%):<<'%&",
+"@[''+/+/+(.]*[@",
+"+)['%%%%%%%'[)+",
+"..$$*'''''*$$..",
+"{{{[[$***$[[{{{",
+"####]%%%%%]####",
+")))))))))))))))",
+"111111111111111"};
diff --git a/twin-styles/icewm/icewm-themes/rollupA.xpm b/twin-styles/icewm/icewm-themes/rollupA.xpm
new file mode 100644
index 00000000..32311d6a
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/rollupA.xpm
@@ -0,0 +1,68 @@
+/* XPM */
+static char * rollupA_xpm[] = {
+"15 34 31 1",
+" c None",
+". c #858686",
+"+ c #9A9A9A",
+"@ c #AEAEAE",
+"# c #5D5D5E",
+"$ c #111214",
+"% c #040404",
+"& c #C2C2C2",
+"* c #181C22",
+"= c #2D333D",
+"- c #56657A",
+"; c #58667E",
+"> c #5D6E86",
+", c #D6D6D6",
+"' c #1D2632",
+") c #4A4A4A",
+"! c #6E809C",
+"~ c #EAEAEA",
+"{ c #717273",
+"] c #232D3A",
+"^ c #4D5868",
+"/ c #C7CDD4",
+"( c #FEFEFE",
+"_ c #0D0E13",
+": c #435165",
+"< c #3C4553",
+"[ c #677B98",
+"} c #798EAA",
+"| c #323F4F",
+"1 c #363636",
+"2 c #8CA3C5",
+"...............",
+"+++++++++++++++",
+"@@@@#$%%%$#@@@@",
+"&&&*=-;>;-=*&&&",
+",,')->!!!>;)',,",
+"~{]^/,,,,,/^]{~",
+"(*)^_%__%_%^:*(",
+"~%<^;[},}!>^<%~",
+",%<^;>,@/[-^<%,",
+"&%|<^/@@@/^<=%&",
+"@_]|<_%%%%<|]$@",
+"+)*]|<<<<||=$)+",
+"..$*'=||==]**..",
+"{{{$_**''*_${{{",
+"##-#=_%%%%=####",
+")))))))))))))))",
+"111111=11111111",
+"...............",
+"+++++++++++++++",
+"@@@@)_%%%_^@@@@",
+"&&&*'<):)<'*&&&",
+",,*=):^-^^)1*,,",
+"~{'|+2+2+++<'{~",
+"($=<%%%%%%%<=*(",
+"~%=|:^;+;^:|=%~",
+",%=|<:+.+:<|]%,",
+"&%'1<+!!.+|1'%&",
+"@_']=%%%%%1]'_@",
+"+)_*]====]]'_)+",
+"..$$*'']''*$_..",
+"{{{__$$*$$_${{{",
+"####]%%%%_]####",
+")))))))))))))))",
+"111111111111111"};
diff --git a/twin-styles/icewm/icewm-themes/rollupI.xpm b/twin-styles/icewm/icewm-themes/rollupI.xpm
new file mode 100644
index 00000000..31b81973
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/rollupI.xpm
@@ -0,0 +1,68 @@
+/* XPM */
+static char * rollupI_xpm[] = {
+"15 34 31 1",
+" g None",
+". g #858585",
+"+ g #9A9A9A",
+"@ g #AEAEAE",
+"# g #5D5D5D",
+"$ g #111111",
+"% g #040404",
+"& g #C2C2C2",
+"* g #1B1B1B",
+"= g #323232",
+"- g #626262",
+"; g #646464",
+"> g #6B6B6B",
+", g #D6D6D6",
+"' g #242424",
+") g #4A4A4A",
+"! g #7D7D7D",
+"~ g #EAEAEA",
+"{ g #717171",
+"] g #2B2B2B",
+"^ g #565656",
+"/ g #CBCBCB",
+"( g #FEFEFE",
+"_ g #0E0E0E",
+": g #4F4F4F",
+"< g #434343",
+"[ g #787878",
+"} g #8A8A8A",
+"| g #3C3C3C",
+"1 g #363636",
+"2 g #9F9F9F",
+"...............",
+"+++++++++++++++",
+"@@@@#$%%%$#@@@@",
+"&&&*=-;>;-=*&&&",
+",,')->!!!>;)',,",
+"~{]^/,,,,,/^]{~",
+"(*)^_%__%_%^:*(",
+"~%<^;[},}!>^<%~",
+",%<^;>,@/[-^<%,",
+"&%|<^/@@@/^<=%&",
+"@_]|<_%%%%<|]$@",
+"+)*]|<<<<||=$)+",
+"..$*'=||==]**..",
+"{{{$_**''*_${{{",
+"##-#=_%%%%=####",
+")))))))))))))))",
+"111111=11111111",
+"...............",
+"+++++++++++++++",
+"@@@@)_%%%_^@@@@",
+"&&&*'<):)<'*&&&",
+",,*=):^-^^)1*,,",
+"~{'|+2+2+++<'{~",
+"($=<%%%%%%%<=*(",
+"~%=|:^;+;^:|=%~",
+",%=|<:+.+:<|]%,",
+"&%'1<+!!.+|1'%&",
+"@_']=%%%%%1]'_@",
+"+)_*]====]]'_)+",
+"..$$*'']''*$_..",
+"{{{__$$*$$_${{{",
+"####]%%%%_]####",
+")))))))))))))))",
+"111111111111111"};
diff --git a/twin-styles/icewm/icewm-themes/titleAB.xpm b/twin-styles/icewm/icewm-themes/titleAB.xpm
new file mode 100644
index 00000000..f153f2af
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/titleAB.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char * titleAS_xpm[] = {
+"1 17 12 1",
+" c None",
+". c #868687",
+"+ c #9A9A9B",
+"@ c #AEAEAF",
+"# c #C2C2C3",
+"$ c #D6D6D7",
+"% c #EAEAEB",
+"& c #FFFFFF",
+"* c #727273",
+"= c #5E5E5F",
+"- c #4A4A4B",
+"; c #363637",
+".",
+"+",
+"@",
+"#",
+"$",
+"%",
+"&",
+"%",
+"$",
+"#",
+"@",
+"+",
+".",
+"*",
+"=",
+"-",
+";"};
diff --git a/twin-styles/icewm/icewm-themes/titleAJ.xpm b/twin-styles/icewm/icewm-themes/titleAJ.xpm
new file mode 100644
index 00000000..0ef284c1
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/titleAJ.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char * titleAJ_xpm[] = {
+"3 17 17 1",
+" c None",
+". c #858687",
+"+ c #4F4F51",
+"@ c #999A9A",
+"# c #AEAEAE",
+"$ c #5E5E5E",
+"% c #C2C2C2",
+"& c #717172",
+"* c #D6D6D6",
+"= c #E9EAEA",
+"- c #FEFEFE",
+"; c #909090",
+"> c #717374",
+", c #5C5F64",
+"' c #373739",
+") c #494B4D",
+"! c #343638",
+"..+",
+"@@+",
+"##$",
+"%%&",
+"**&",
+"==&",
+"--;",
+"==&",
+"**&",
+"%%&",
+"##$",
+"@@+",
+"..+",
+">>+",
+",,'",
+"))'",
+"!!'"};
diff --git a/twin-styles/icewm/icewm-themes/titleAM.xpm b/twin-styles/icewm/icewm-themes/titleAM.xpm
new file mode 100644
index 00000000..808458a4
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/titleAM.xpm
@@ -0,0 +1,73 @@
+/* XPM */
+static char * titleAM_xpm[] = {
+"18 17 53 1",
+" c None",
+". c #868687",
+"+ c #4E4E4F",
+"@ c #484848",
+"# c #9A9A9B",
+"$ c #575758",
+"% c #344066",
+"& c #515151",
+"* c #AEAEAF",
+"= c #606061",
+"- c #425076",
+"; c #606060",
+"> c #C2C2C3",
+", c #68686A",
+"' c #526185",
+") c #707070",
+"! c #D6D6D7",
+"~ c #717173",
+"{ c #607194",
+"] c #808080",
+"^ c #EAEAEB",
+"/ c #7A7A7C",
+"( c #7081A3",
+"_ c #8E8E8E",
+": c #FFFFFF",
+"< c #838385",
+"[ c #7284A6",
+"} c #9B9B9B",
+"| c #7587A9",
+"1 c #A9A9A9",
+"2 c #66779A",
+"3 c #B7B7B7",
+"4 c #57668A",
+"5 c #C5C5C5",
+"6 c #4A597D",
+"7 c #D2D2D2",
+"8 c #3D4A70",
+"9 c #303C63",
+"0 c #A7A7A7",
+"a c #727273",
+"b c #454547",
+"c c #273259",
+"d c #7F7F7F",
+"e c #5E5E5F",
+"f c #3C3C3E",
+"g c #969696",
+"h c #848484",
+"i c #6B6B6B",
+"j c #575757",
+"k c #4A4A4B",
+"l c #333335",
+"m c #363637",
+"n c #2A2A2C",
+"..............+...",
+"@@@@@@@@@@@@@#$###",
+"%%%%%%%%%%%%&*=***",
+"------------;>,>>>",
+"'''''''''''')!~!!!",
+"{{{{{{{{{{{{]^/^^^",
+"((((((((((((_:<:::",
+"[[[[[[[[[[[[}^/^^^",
+"||||||||||||1!~!!!",
+"2222222222223>,>>>",
+"4444444444445*=***",
+"6666666666667#$###",
+"8888888888885.+...",
+"9999999999990abaaa",
+"ccccccccccccdefeee",
+"}}}}}}}}}ghijklkkk",
+"mmmmmmmmmmmmmmnmmm"};
diff --git a/twin-styles/icewm/icewm-themes/titleAP.xpm b/twin-styles/icewm/icewm-themes/titleAP.xpm
new file mode 100644
index 00000000..a4ae203a
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/titleAP.xpm
@@ -0,0 +1,73 @@
+/* XPM */
+static char * titleAP_xpm[] = {
+"18 17 53 1",
+" c None",
+". c #868687",
+"+ c #4E4E4F",
+"@ c #9A9A9B",
+"# c #575758",
+"$ c #484848",
+"% c #AEAEAF",
+"& c #606061",
+"* c #515151",
+"= c #344066",
+"- c #C2C2C3",
+"; c #68686A",
+"> c #606060",
+", c #425076",
+"' c #D6D6D7",
+") c #717173",
+"! c #707070",
+"~ c #526185",
+"{ c #EAEAEB",
+"] c #7A7A7C",
+"^ c #808080",
+"/ c #607194",
+"( c #FFFFFF",
+"_ c #838385",
+": c #8E8E8E",
+"< c #7081A3",
+"[ c #9B9B9B",
+"} c #7284A6",
+"| c #A9A9A9",
+"1 c #7587A9",
+"2 c #B7B7B7",
+"3 c #66779A",
+"4 c #C5C5C5",
+"5 c #57668A",
+"6 c #D2D2D2",
+"7 c #4A597D",
+"8 c #3D4A70",
+"9 c #727273",
+"0 c #454547",
+"a c #A7A7A7",
+"b c #303C63",
+"c c #5E5E5F",
+"d c #3C3C3E",
+"e c #7F7F7F",
+"f c #273259",
+"g c #4A4A4B",
+"h c #333335",
+"i c #575757",
+"j c #6B6B6B",
+"k c #848484",
+"l c #969696",
+"m c #363637",
+"n c #2A2A2C",
+"...+..............",
+"@@@#@$$$$$$$$$$$$$",
+"%%%&%*============",
+"---;->,,,,,,,,,,,,",
+"''')'!~~~~~~~~~~~~",
+"{{{]{^////////////",
+"(((_(:<<<<<<<<<<<<",
+"{{{]{[}}}}}}}}}}}}",
+"''')'|111111111111",
+"---;-2333333333333",
+"%%%&%4555555555555",
+"@@@#@6777777777777",
+"...+.4888888888888",
+"99909abbbbbbbbbbbb",
+"cccdceffffffffffff",
+"ggghgijkl[[[[[[[[[",
+"mmmnmmmmmmmmmmmmmm"};
diff --git a/twin-styles/icewm/icewm-themes/titleAQ.xpm b/twin-styles/icewm/icewm-themes/titleAQ.xpm
new file mode 100644
index 00000000..8bc6cd28
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/titleAQ.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char * titleAQ_xpm[] = {
+"2 17 17 1",
+" c None",
+". c #4F4F51",
+"+ c #858687",
+"@ c #999A9A",
+"# c #5E5E5E",
+"$ c #AEAEAE",
+"% c #717172",
+"& c #C2C2C2",
+"* c #D6D6D6",
+"= c #E9EAEA",
+"- c #909090",
+"; c #FEFEFE",
+"> c #717374",
+", c #373739",
+"' c #5C5F64",
+") c #494B4D",
+"! c #343638",
+".+",
+".@",
+"#$",
+"%&",
+"%*",
+"%=",
+"-;",
+"%=",
+"%*",
+"%&",
+"#$",
+".@",
+".+",
+".>",
+",'",
+",)",
+",!"};
diff --git a/twin-styles/icewm/icewm-themes/titleAR.xpm b/twin-styles/icewm/icewm-themes/titleAR.xpm
new file mode 100644
index 00000000..8bc6cd28
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/titleAR.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char * titleAQ_xpm[] = {
+"2 17 17 1",
+" c None",
+". c #4F4F51",
+"+ c #858687",
+"@ c #999A9A",
+"# c #5E5E5E",
+"$ c #AEAEAE",
+"% c #717172",
+"& c #C2C2C2",
+"* c #D6D6D6",
+"= c #E9EAEA",
+"- c #909090",
+"; c #FEFEFE",
+"> c #717374",
+", c #373739",
+"' c #5C5F64",
+") c #494B4D",
+"! c #343638",
+".+",
+".@",
+"#$",
+"%&",
+"%*",
+"%=",
+"-;",
+"%=",
+"%*",
+"%&",
+"#$",
+".@",
+".+",
+".>",
+",'",
+",)",
+",!"};
diff --git a/twin-styles/icewm/icewm-themes/titleAS.xpm b/twin-styles/icewm/icewm-themes/titleAS.xpm
new file mode 100644
index 00000000..f153f2af
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/titleAS.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char * titleAS_xpm[] = {
+"1 17 12 1",
+" c None",
+". c #868687",
+"+ c #9A9A9B",
+"@ c #AEAEAF",
+"# c #C2C2C3",
+"$ c #D6D6D7",
+"% c #EAEAEB",
+"& c #FFFFFF",
+"* c #727273",
+"= c #5E5E5F",
+"- c #4A4A4B",
+"; c #363637",
+".",
+"+",
+"@",
+"#",
+"$",
+"%",
+"&",
+"%",
+"$",
+"#",
+"@",
+"+",
+".",
+"*",
+"=",
+"-",
+";"};
diff --git a/twin-styles/icewm/icewm-themes/titleAT.xpm b/twin-styles/icewm/icewm-themes/titleAT.xpm
new file mode 100644
index 00000000..84f06879
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/titleAT.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char * titleAT_xpm[] = {
+"1 17 18 1",
+" c None",
+". c #868687",
+"+ c #484848",
+"@ c #344066",
+"# c #425076",
+"$ c #526185",
+"% c #607194",
+"& c #7081A3",
+"* c #7284A6",
+"= c #7587A9",
+"- c #66779A",
+"; c #57668A",
+"> c #4A597D",
+", c #3D4A70",
+"' c #303C63",
+") c #273259",
+"! c #9B9B9B",
+"~ c #363637",
+".",
+"+",
+"@",
+"#",
+"$",
+"%",
+"&",
+"*",
+"=",
+"-",
+";",
+">",
+",",
+"'",
+")",
+"!",
+"~"};
diff --git a/twin-styles/icewm/icewm-themes/titleIB.xpm b/twin-styles/icewm/icewm-themes/titleIB.xpm
new file mode 100644
index 00000000..f153f2af
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/titleIB.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char * titleAS_xpm[] = {
+"1 17 12 1",
+" c None",
+". c #868687",
+"+ c #9A9A9B",
+"@ c #AEAEAF",
+"# c #C2C2C3",
+"$ c #D6D6D7",
+"% c #EAEAEB",
+"& c #FFFFFF",
+"* c #727273",
+"= c #5E5E5F",
+"- c #4A4A4B",
+"; c #363637",
+".",
+"+",
+"@",
+"#",
+"$",
+"%",
+"&",
+"%",
+"$",
+"#",
+"@",
+"+",
+".",
+"*",
+"=",
+"-",
+";"};
diff --git a/twin-styles/icewm/icewm-themes/titleIJ.xpm b/twin-styles/icewm/icewm-themes/titleIJ.xpm
new file mode 100644
index 00000000..0ef284c1
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/titleIJ.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char * titleAJ_xpm[] = {
+"3 17 17 1",
+" c None",
+". c #858687",
+"+ c #4F4F51",
+"@ c #999A9A",
+"# c #AEAEAE",
+"$ c #5E5E5E",
+"% c #C2C2C2",
+"& c #717172",
+"* c #D6D6D6",
+"= c #E9EAEA",
+"- c #FEFEFE",
+"; c #909090",
+"> c #717374",
+", c #5C5F64",
+"' c #373739",
+") c #494B4D",
+"! c #343638",
+"..+",
+"@@+",
+"##$",
+"%%&",
+"**&",
+"==&",
+"--;",
+"==&",
+"**&",
+"%%&",
+"##$",
+"@@+",
+"..+",
+">>+",
+",,'",
+"))'",
+"!!'"};
diff --git a/twin-styles/icewm/icewm-themes/titleIM.xpm b/twin-styles/icewm/icewm-themes/titleIM.xpm
new file mode 100644
index 00000000..575b63c4
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/titleIM.xpm
@@ -0,0 +1,66 @@
+/* XPM */
+static char * titleIM_xpm[] = {
+"18 17 46 1",
+" c None",
+". c #868686",
+"+ c #4E4E4E",
+"@ c #484848",
+"# c #9A9A9A",
+"$ c #575757",
+"% c #4D4D4D",
+"& c #515151",
+"* c #AEAEAE",
+"= c #606060",
+"- c #5C5C5C",
+"; c #C2C2C2",
+"> c #696969",
+", c #6B6B6B",
+"' c #707070",
+") c #D6D6D6",
+"! c #727272",
+"~ c #7A7A7A",
+"{ c #808080",
+"] c #EAEAEA",
+"^ c #7B7B7B",
+"/ c #898989",
+"( c #8E8E8E",
+"_ c #FFFFFF",
+": c #848484",
+"< c #8C8C8C",
+"[ c #9B9B9B",
+"} c #8F8F8F",
+"| c #A9A9A9",
+"1 c #B7B7B7",
+"2 c #C5C5C5",
+"3 c #636363",
+"4 c #D2D2D2",
+"5 c #565656",
+"6 c #494949",
+"7 c #A7A7A7",
+"8 c #464646",
+"9 c #404040",
+"0 c #7F7F7F",
+"a c #5E5E5E",
+"b c #3D3D3D",
+"c c #969696",
+"d c #4A4A4A",
+"e c #343434",
+"f c #363636",
+"g c #2B2B2B",
+"..............+...",
+"@@@@@@@@@@@@@#$###",
+"%%%%%%%%%%%%&*=***",
+"------------=;>;;;",
+",,,,,,,,,,,,')!)))",
+"~~~~~~~~~~~~{]^]]]",
+"////////////(_:___",
+"<<<<<<<<<<<<[]^]]]",
+"}}}}}}}}}}}}|)!)))",
+"{{{{{{{{{{{{1;>;;;",
+"''''''''''''2*=***",
+"3333333333334#$###",
+"5555555555552.+...",
+"6666666666667!8!!!",
+"9999999999990abaaa",
+"[[[[[[[[[c:,$deddd",
+"ffffffffffffffgfff"};
diff --git a/twin-styles/icewm/icewm-themes/titleIP.xpm b/twin-styles/icewm/icewm-themes/titleIP.xpm
new file mode 100644
index 00000000..170d1b2a
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/titleIP.xpm
@@ -0,0 +1,66 @@
+/* XPM */
+static char * titleIP_xpm[] = {
+"18 17 46 1",
+" c None",
+". c #868686",
+"+ c #4E4E4E",
+"@ c #9A9A9A",
+"# c #575757",
+"$ c #484848",
+"% c #AEAEAE",
+"& c #606060",
+"* c #515151",
+"= c #4D4D4D",
+"- c #C2C2C2",
+"; c #696969",
+"> c #5C5C5C",
+", c #D6D6D6",
+"' c #727272",
+") c #707070",
+"! c #6B6B6B",
+"~ c #EAEAEA",
+"{ c #7B7B7B",
+"] c #808080",
+"^ c #7A7A7A",
+"/ c #FFFFFF",
+"( c #848484",
+"_ c #8E8E8E",
+": c #898989",
+"< c #9B9B9B",
+"[ c #8C8C8C",
+"} c #A9A9A9",
+"| c #8F8F8F",
+"1 c #B7B7B7",
+"2 c #C5C5C5",
+"3 c #D2D2D2",
+"4 c #636363",
+"5 c #565656",
+"6 c #464646",
+"7 c #A7A7A7",
+"8 c #494949",
+"9 c #5E5E5E",
+"0 c #3D3D3D",
+"a c #7F7F7F",
+"b c #404040",
+"c c #4A4A4A",
+"d c #343434",
+"e c #969696",
+"f c #363636",
+"g c #2B2B2B",
+"...+..............",
+"@@@#@$$$$$$$$$$$$$",
+"%%%&%*============",
+"---;-&>>>>>>>>>>>>",
+",,,',)!!!!!!!!!!!!",
+"~~~{~]^^^^^^^^^^^^",
+"///(/_::::::::::::",
+"~~~{~<[[[[[[[[[[[[",
+",,,',}||||||||||||",
+"---;-1]]]]]]]]]]]]",
+"%%%&%2))))))))))))",
+"@@@#@3444444444444",
+"...+.2555555555555",
+"'''6'7888888888888",
+"99909abbbbbbbbbbbb",
+"cccdc#!(e<<<<<<<<<",
+"fffgffffffffffffff"};
diff --git a/twin-styles/icewm/icewm-themes/titleIQ.xpm b/twin-styles/icewm/icewm-themes/titleIQ.xpm
new file mode 100644
index 00000000..8bc6cd28
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/titleIQ.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char * titleAQ_xpm[] = {
+"2 17 17 1",
+" c None",
+". c #4F4F51",
+"+ c #858687",
+"@ c #999A9A",
+"# c #5E5E5E",
+"$ c #AEAEAE",
+"% c #717172",
+"& c #C2C2C2",
+"* c #D6D6D6",
+"= c #E9EAEA",
+"- c #909090",
+"; c #FEFEFE",
+"> c #717374",
+", c #373739",
+"' c #5C5F64",
+") c #494B4D",
+"! c #343638",
+".+",
+".@",
+"#$",
+"%&",
+"%*",
+"%=",
+"-;",
+"%=",
+"%*",
+"%&",
+"#$",
+".@",
+".+",
+".>",
+",'",
+",)",
+",!"};
diff --git a/twin-styles/icewm/icewm-themes/titleIR.xpm b/twin-styles/icewm/icewm-themes/titleIR.xpm
new file mode 100644
index 00000000..8bc6cd28
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/titleIR.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char * titleAQ_xpm[] = {
+"2 17 17 1",
+" c None",
+". c #4F4F51",
+"+ c #858687",
+"@ c #999A9A",
+"# c #5E5E5E",
+"$ c #AEAEAE",
+"% c #717172",
+"& c #C2C2C2",
+"* c #D6D6D6",
+"= c #E9EAEA",
+"- c #909090",
+"; c #FEFEFE",
+"> c #717374",
+", c #373739",
+"' c #5C5F64",
+") c #494B4D",
+"! c #343638",
+".+",
+".@",
+"#$",
+"%&",
+"%*",
+"%=",
+"-;",
+"%=",
+"%*",
+"%&",
+"#$",
+".@",
+".+",
+".>",
+",'",
+",)",
+",!"};
diff --git a/twin-styles/icewm/icewm-themes/titleIS.xpm b/twin-styles/icewm/icewm-themes/titleIS.xpm
new file mode 100644
index 00000000..f153f2af
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/titleIS.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char * titleAS_xpm[] = {
+"1 17 12 1",
+" c None",
+". c #868687",
+"+ c #9A9A9B",
+"@ c #AEAEAF",
+"# c #C2C2C3",
+"$ c #D6D6D7",
+"% c #EAEAEB",
+"& c #FFFFFF",
+"* c #727273",
+"= c #5E5E5F",
+"- c #4A4A4B",
+"; c #363637",
+".",
+"+",
+"@",
+"#",
+"$",
+"%",
+"&",
+"%",
+"$",
+"#",
+"@",
+"+",
+".",
+"*",
+"=",
+"-",
+";"};
diff --git a/twin-styles/icewm/icewm-themes/titleIT.xpm b/twin-styles/icewm/icewm-themes/titleIT.xpm
new file mode 100644
index 00000000..ddcab757
--- /dev/null
+++ b/twin-styles/icewm/icewm-themes/titleIT.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char * titleIT_xpm[] = {
+"1 17 18 1",
+" c None",
+". c #868686",
+"+ c #484848",
+"@ c #4D4D4D",
+"# c #5C5C5C",
+"$ c #6B6B6B",
+"% c #7A7A7A",
+"& c #898989",
+"* c #8C8C8C",
+"= c #8F8F8F",
+"- c #808080",
+"; c #707070",
+"> c #636363",
+", c #565656",
+"' c #494949",
+") c #404040",
+"! c #9B9B9B",
+"~ c #363636",
+".",
+"+",
+"@",
+"#",
+"$",
+"%",
+"&",
+"*",
+"=",
+"-",
+";",
+">",
+",",
+"'",
+")",
+"!",
+"~"};
diff --git a/twin-styles/icewm/icewm.cpp b/twin-styles/icewm/icewm.cpp
new file mode 100644
index 00000000..4b9a064b
--- /dev/null
+++ b/twin-styles/icewm/icewm.cpp
@@ -0,0 +1,1703 @@
+/*
+ $Id$
+
+ Gallium-IceWM themeable KWin client
+
+ Copyright 2001
+ Karol Szwed <gallium@kde.org>
+ http://gallium.n3.net/
+
+ 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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+ -----------------------------------------------------------------------------
+ This client loads most icewm 1.0.X pixmap themes, without taking into account
+ specific font settings for clients, or coloured mouse cursors. Titlebar
+ fonts can be changed via the kde control center. Bi-colour mouse cursors
+ may be added in future if requested by users, as well as theme font support.
+ Any styles using inbuilt icewm titlebar drawing without using pixmaps (e.g.
+ Warp4, win95 etc.) are not fully supported, and may cause drawing errors,
+ as these themes use in-built icewm drawing mechanisms.
+
+ When a pixmap theme is not present (or a corrupt one is present) then very
+ plain title decorations are painted instead, so that users don't see
+ non-painted window areas where possible ;)
+
+ At a later date, frame shaping may be added if really requested, and an
+ update to support the latest icewm 1.1.X theme format may be made.
+
+*/
+
+#include <kconfig.h>
+#include <kstandarddirs.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kdrawutil.h>
+#include <tqapplication.h>
+#include <tqlabel.h>
+#include <tqdrawutil.h>
+#include <tqdatetime.h>
+#include <tqbitmap.h>
+#include <tqcursor.h>
+#include <tqstring.h>
+#include <tqtooltip.h>
+#include <tqregexp.h>
+#include "icewm.h"
+
+namespace IceWM {
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// Here's the global pixmap stuff - as memory efficient as it can be :)
+////////////////////////////////////////////////////////////////////////////////////////////
+
+// IceWM frame pixmaps
+TQPixmap* frameTL[] = {NULL, NULL};
+TQPixmap* frameT [] = {NULL, NULL};
+TQPixmap* frameTR[] = {NULL, NULL};
+TQPixmap* frameL [] = {NULL, NULL};
+TQPixmap* frameR [] = {NULL, NULL};
+TQPixmap* frameBL[] = {NULL, NULL};
+TQPixmap* frameB [] = {NULL, NULL};
+TQPixmap* frameBR[] = {NULL, NULL};
+
+// Button pixmaps
+TQPixmap* closePix[] = {NULL, NULL};
+TQPixmap* depthPix[] = {NULL, NULL};
+TQPixmap* maximizePix[] = {NULL, NULL};
+TQPixmap* minimizePix[] = {NULL, NULL};
+TQPixmap* restorePix[] = {NULL, NULL};
+TQPixmap* hidePix[] = {NULL, NULL};
+TQPixmap* rollupPix[] = {NULL, NULL};
+TQPixmap* rolldownPix[] = {NULL, NULL};
+TQPixmap* menuButtonPix[] = {NULL, NULL};
+
+// Titlebar pixmaps
+TQPixmap* titleJ[] = {NULL, NULL};
+TQPixmap* titleL[] = {NULL, NULL};
+TQPixmap* titleS[] = {NULL, NULL};
+TQPixmap* titleP[] = {NULL, NULL};
+TQPixmap* titleT[] = {NULL, NULL};
+TQPixmap* titleM[] = {NULL, NULL};
+TQPixmap* titleB[] = {NULL, NULL};
+TQPixmap* titleR[] = {NULL, NULL};
+TQPixmap* titleQ[] = {NULL, NULL};
+
+ThemeHandler* clientHandler;
+
+TQString* titleButtonsLeft;
+TQString* titleButtonsRight;
+
+TQColor* colorActiveBorder;
+TQColor* colorInActiveBorder;
+TQColor* colorActiveButton;
+TQColor* colorInActiveButton;
+TQColor* colorActiveTitleBarText;
+TQColor* colorInActiveTitleBarText;
+TQColor* colorActiveTitleBar;
+TQColor* colorInActiveTitleBar;
+TQColor* colorActiveTitleTextShadow;
+TQColor* colorInActiveTitleTextShadow;
+
+int cornerSizeX;
+int cornerSizeY;
+int titleBarHeight;
+int borderSizeX;
+int borderSizeY;
+
+bool validframe = false;
+bool useActiveShadow = false;
+bool useInActiveShadow = false;
+
+// KControl Settings - Read from twinicewmrc config file or icewm theme
+bool themeTitleTextColors = true; // Allow theme to set colors.
+ // kcontrol will have no effect
+
+bool titleBarOnTop = true; // Titlebars can be below windows too :)
+bool showMenuButtonIcon = false; // Draw a mini icon over the menu pixmap.
+bool customButtonPositions = false; // Let the theme dictate the btn pos.
+bool titleBarCentered = true;
+
+enum styles {OTHER, WARP3, WARP4, MOTIF, WIN95, NICE} themeLook;
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// General utility functions
+////////////////////////////////////////////////////////////////////////////////////////////
+
+// Returns true if both active and inactive pixmaps are valid, and not null
+bool validPixmaps( TQPixmap* p[] )
+{
+ return ( p[Active] && ( !p[Active]->isNull() ) &&
+ p[InActive] && ( !p[InActive]->isNull() ) );
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// ThemeHandler class
+//
+// This class allows us to free dynamic memory upon being reset, or unloaded
+// from twin, so we don't leak big images everywhere, and handles the theme
+// initialisation / destruction in general.
+////////////////////////////////////////////////////////////////////////////////////////////
+
+ThemeHandler::ThemeHandler()
+{
+ initialized = false;
+
+ // Prevent having globals objects (use pointers to objects)
+ titleButtonsLeft = new TQString();
+ titleButtonsRight = new TQString();
+
+ colorActiveBorder = new TQColor();
+ colorInActiveBorder = new TQColor();
+ colorActiveButton = new TQColor();
+ colorInActiveButton = new TQColor();
+ colorActiveTitleBarText = new TQColor();
+ colorInActiveTitleBarText = new TQColor();
+ colorActiveTitleBar = new TQColor();
+ colorInActiveTitleBar = new TQColor();
+ colorActiveTitleTextShadow = new TQColor();
+ colorInActiveTitleTextShadow = new TQColor();
+
+ // Initialize
+ readConfig();
+ initTheme();
+ validframe = isFrameValid();
+ initialized = true;
+}
+
+
+ThemeHandler::~ThemeHandler()
+{
+ if (initialized)
+ freePixmaps();
+
+ delete colorInActiveTitleTextShadow;
+ delete colorActiveTitleTextShadow;
+ delete colorInActiveBorder;
+ delete colorActiveTitleBarText;
+ delete colorInActiveTitleBarText;
+ delete colorActiveTitleBar;
+ delete colorInActiveTitleBar;
+ delete colorActiveBorder;
+ delete colorActiveButton;
+ delete colorInActiveButton;
+
+ delete titleButtonsRight;
+ delete titleButtonsLeft;
+}
+
+
+KDecoration* ThemeHandler::createDecoration( KDecorationBridge* bridge )
+{
+ return new IceWMClient( bridge, this );
+}
+
+
+// Converts KDE style button strings to icewm style button strings
+void ThemeHandler::convertButtons( TQString& s )
+{
+ s.replace( TQRegExp("_"), ""); // Spacer (ignored)
+ s.replace( TQRegExp("H"), ""); // Help (ignored)
+ s.replace( TQRegExp("M"), "s"); // Sysmenu
+ s.replace( TQRegExp("S"), "d"); // Sticky/OnAllDesktops
+ s.replace( TQRegExp("I"), "i"); // Minimize
+ s.replace( TQRegExp("A"), "m"); // Maximize
+ s.replace( TQRegExp("X"), "x"); // Close
+}
+
+
+// Reverses all characters in a TQString
+TQString ThemeHandler::reverseString( TQString s )
+{
+ if (s.length() <= 1)
+ return s;
+
+ TQString tmpStr;
+ for(int i = s.length()-1; i >= 0; i--)
+ {
+ tmpStr += s[(unsigned int)i];
+ }
+
+ return tmpStr;
+}
+
+
+// This function reads the twinicewmrc config file
+void ThemeHandler::readConfig()
+{
+ KConfig conf("twinicewmrc");
+ conf.setGroup("General");
+ themeName = conf.readEntry("CurrentTheme");
+ themeTitleTextColors = conf.readBoolEntry("ThemeTitleTextColors", true);
+ showMenuButtonIcon = conf.readBoolEntry("ShowMenuButtonIcon", false);
+ titleBarOnTop = conf.readBoolEntry("TitleBarOnTop", true);
+
+ customButtonPositions = KDecoration::options()->customButtonPositions();
+ if (customButtonPositions)
+ {
+ *titleButtonsLeft = KDecoration::options()->titleButtonsLeft();
+ *titleButtonsRight = KDecoration::options()->titleButtonsRight();
+
+ // Convert KDE to icewm style buttons
+ convertButtons( *titleButtonsLeft );
+ convertButtons( *titleButtonsRight );
+ }
+
+ // Provide a default theme alias
+ if (themeName == "default")
+ themeName = "";
+}
+
+
+// This creates the dynamic pixmaps upon loading the style
+// into the pixmap buffers above, and configures the dimensioning stuff.
+void ThemeHandler::initTheme()
+{
+ // Add a slash if required
+ if ( !themeName.isEmpty() )
+ themeName += "/";
+
+ // We use kconfig to read icewm config files...
+ // this is easy since icewm uses key=value pairs!
+ KConfig config( locate("data", TQString("twin/icewm-themes/") +
+ themeName + TQString("default.theme")) );
+
+ // Load specifics, or use IceWM defaults instead.
+ borderSizeX = config.readNumEntry("BorderSizeX", 6);
+ borderSizeY = config.readNumEntry("BorderSizeY", 6);
+ cornerSizeX = config.readNumEntry("CornerSizeX", 24);
+ cornerSizeY = config.readNumEntry("CornerSizeY", 24);
+ titleBarCentered = (bool) config.readNumEntry("TitleBarCentered", 0);
+
+ // Check if readConfig() hasn't overridden this value...
+ if (!showMenuButtonIcon)
+ showMenuButtonIcon = (bool) config.readNumEntry("ShowMenuButtonIcon", 0);
+ titleBarHeight = config.readNumEntry("TitleBarHeight", 20);
+
+ if (!customButtonPositions)
+ {
+ // Read in the button configuration, stripping any quotes
+ // Ignore on all desktops 'd' on the left buttons
+ // (some themes look bad with it on by default)
+ *titleButtonsLeft = config.readEntry("TitleButtonsLeft", "s");
+ *titleButtonsLeft = titleButtonsLeft->replace( TQRegExp(TQString("\"")), "");
+ *titleButtonsRight = config.readEntry("TitleButtonsRight", "xmir");
+ *titleButtonsRight = titleButtonsRight->replace( TQRegExp(TQString("\"")), "");
+
+ // I have no idea why the right side buttons in icewm are reversed
+ *titleButtonsRight = reverseString( *titleButtonsRight );
+ }
+
+ // Read the default border and text colours from the config file
+ // And use IceWM defaults if not found
+ TQString s;
+
+ s = config.readEntry("Look", "other");
+ if (s=="motif") themeLook = MOTIF;
+ else if (s=="warp3") themeLook = WARP3;
+ else if (s=="warp4") themeLook = WARP4;
+ else if (s=="win95") themeLook = WIN95;
+ else if (s=="nice") themeLook = NICE;
+ else themeLook = OTHER;
+
+ s = config.readEntry("ColorActiveBorder", "#C0C0C0");
+ *colorActiveBorder = decodeColor( s );
+ s = config.readEntry("ColorNormalBorder", "#C0C0C0");
+ *colorInActiveBorder = decodeColor( s );
+ s = config.readEntry("ColorActiveButton", "#C0C0C0");
+ *colorActiveButton = decodeColor( s );
+ s = config.readEntry("ColorNormalButton", "#C0C0C0");
+ *colorInActiveButton = decodeColor( s );
+
+ // Use these as a last resort
+ s = config.readEntry("ColorActiveTitleBar", "#0000A0");
+ *colorActiveTitleBar = decodeColor( s );
+ s = config.readEntry("ColorNormalTitleBar", "#808080");
+ *colorInActiveTitleBar = decodeColor( s );
+
+ // Read titlebar text colours
+ s = config.readEntry("ColorActiveTitleBarText", "#FFFFFF");
+ *colorActiveTitleBarText = decodeColor( s );
+ s = config.readEntry("ColorNormalTitleBarText", "#000000");
+ *colorInActiveTitleBarText = decodeColor( s );
+
+ // Use title text shadows only with theme title text colors
+ if ( themeTitleTextColors )
+ {
+ s = config.readEntry("ColorActiveTitleBarShadow");
+ if (!s.isEmpty())
+ {
+ *colorActiveTitleTextShadow = decodeColor( s );
+ useActiveShadow = true;
+ } else
+ useActiveShadow = false;
+
+ s = config.readEntry("ColorNormalTitleBarShadow");
+ if (!s.isEmpty())
+ {
+ *colorInActiveTitleTextShadow = decodeColor( s );
+ useInActiveShadow = true;
+ } else
+ useInActiveShadow = false;
+ } else
+ {
+ useActiveShadow = false;
+ useInActiveShadow = false;
+ }
+
+ // Stretch pixmaps for speed, where required
+ setPixmap( titleJ, "title", "J.xpm" );
+ setPixmap( titleL, "title", "L.xpm" );
+ setPixmap( titleS, "title", "S.xpm", true );
+
+ setPixmap( titleP, "title", "P.xpm" );
+ setPixmap( titleT, "title", "T.xpm", true );
+ setPixmap( titleM, "title", "M.xpm" );
+ setPixmap( titleB, "title", "B.xpm", true );
+ setPixmap( titleR, "title", "R.xpm" );
+ setPixmap( titleQ, "title", "Q.xpm" );
+
+ setPixmapButton( closePix, "close", ".xpm" );
+ setPixmapButton( depthPix, "depth", ".xpm" );
+ setPixmapButton( maximizePix, "maximize", ".xpm" );
+ setPixmapButton( minimizePix, "minimize", ".xpm" );
+ setPixmapButton( restorePix, "restore", ".xpm" );
+ setPixmapButton( hidePix, "hide", ".xpm" );
+ setPixmapButton( rollupPix, "rollup", ".xpm" );
+ setPixmapButton( rolldownPix, "rolldown", ".xpm" );
+ setPixmapButton( menuButtonPix,"menuButton",".xpm" );
+
+ // Top
+ setPixmap( frameTL, "frame", "TL.xpm" );
+ setPixmap( frameT, "frame", "T.xpm", true );
+ setPixmap( frameTR, "frame", "TR.xpm" );
+
+ // Sides
+ setPixmap( frameL, "frame", "L.xpm", true,Qt::Vertical );
+ setPixmap( frameR, "frame", "R.xpm", true,Qt::Vertical );
+
+ // Bottom
+ setPixmap( frameBL, "frame", "BL.xpm" );
+ setPixmap( frameB, "frame", "B.xpm", true );
+ setPixmap( frameBR, "frame", "BR.xpm" );
+
+ // Make sure border sizes are at least reasonable...
+ if (borderSizeX < 0)
+ borderSizeX = 0;
+ if (borderSizeY < 0)
+ borderSizeY = 0;
+ // ...and titleBarHeight as well
+ if (titleBarHeight < 0)
+ titleBarHeight = 0;
+
+ // This is a work-around for some themes
+ if (!titleT[Active])
+ titleT[Active] = duplicateValidPixmap( Active );
+
+ if (!titleB[Active])
+ titleB[Active] = duplicateValidPixmap( Active );
+
+
+ if (titleL[Active] && !titleL[InActive])
+ titleL[InActive] = duplicateValidPixmap( InActive, titleL[Active]->width() );
+
+ if (titleS[Active] && !titleS[InActive])
+ titleS[InActive] = duplicateValidPixmap( InActive, titleS[Active]->width() );
+
+ if (titleP[Active] && !titleP[InActive])
+ titleP[InActive] = duplicateValidPixmap( InActive, titleP[Active]->width() );
+
+ if (titleT[Active] && !titleT[InActive])
+ titleT[InActive] = duplicateValidPixmap( InActive, titleT[Active]->width() );
+
+ if (titleM[Active] && !titleM[InActive])
+ titleM[InActive] = duplicateValidPixmap( InActive, titleM[Active]->width() );
+
+ if (titleB[Active] && !titleB[InActive])
+ titleB[InActive] = duplicateValidPixmap( InActive, titleB[Active]->width() );
+
+ if (titleR[Active] && !titleR[InActive])
+ titleR[InActive] = duplicateValidPixmap( InActive, titleR[Active]->width() );
+}
+
+
+TQPixmap* ThemeHandler::duplicateValidPixmap( bool act, int size )
+{
+ TQPixmap* p1 = NULL;
+ // Use the stretch or title pixmaps instead
+ if ( titleS[act] )
+ p1 = new TQPixmap( *titleS[act] );
+ else if ( titleB[act] )
+ p1 = new TQPixmap( *titleB[act] );
+ else if ( titleT[act] )
+ p1 = new TQPixmap( *titleT[act] );
+
+ // Stretch if required
+ if ( (size != -1) && p1 && (!p1->isNull()) )
+ p1 = stretchPixmap( p1, true, size );
+
+ return p1;
+}
+
+
+// Frees all memory used by pixmaps.
+void ThemeHandler::freePixmaps()
+{
+ freePixmapGroup( frameTL );
+ freePixmapGroup( frameT );
+ freePixmapGroup( frameTR );
+ freePixmapGroup( frameL );
+ freePixmapGroup( frameR );
+ freePixmapGroup( frameBL );
+ freePixmapGroup( frameB );
+ freePixmapGroup( frameBR );
+
+ freePixmapGroup( closePix );
+ freePixmapGroup( depthPix );
+ freePixmapGroup( maximizePix );
+ freePixmapGroup( minimizePix );
+ freePixmapGroup( restorePix );
+ freePixmapGroup( hidePix );
+ freePixmapGroup( rollupPix );
+ freePixmapGroup( rolldownPix );
+ freePixmapGroup( menuButtonPix );
+
+ freePixmapGroup( titleJ );
+ freePixmapGroup( titleL );
+ freePixmapGroup( titleS );
+ freePixmapGroup( titleP );
+ freePixmapGroup( titleT );
+ freePixmapGroup( titleM );
+ freePixmapGroup( titleB );
+ freePixmapGroup( titleR );
+ freePixmapGroup( titleQ );
+}
+
+
+// Frees a dynamic pixmap group from the heap.
+void ThemeHandler::freePixmapGroup( TQPixmap* p[] )
+{
+ if (p)
+ {
+ if (p[Active]) delete p[Active];
+ if (p[InActive]) delete p[InActive];
+ p[Active] = NULL;
+ p[InActive] = NULL;
+ } else
+ qWarning("twin-icewm: freePixmapGroup - invalid TQPixmap** 'p'\n");
+}
+
+
+// Converts icewm colors #C0C0C0 or rgb:C0/C0/C0 to TQColors
+TQColor ThemeHandler::decodeColor( TQString& s )
+{
+ // Make rgb:C0/C0/C0, or #C0/C0/C0 -> C0C0C0
+ s.replace( TQRegExp("r"), "");
+ s.replace( TQRegExp("g"), "");
+ s.replace( TQRegExp("b"), "");
+ s.replace( TQRegExp("#"), "");
+ s.replace( TQRegExp("/"), "");
+ s.replace( TQRegExp(":"), "");
+ s.replace( TQRegExp("\\"), "");
+ s.replace( TQRegExp("\""), "");
+
+ // Wierd error - return grey
+ if (s.length() != 6)
+ return TQColor( 0xC0, 0xC0, 0xC0 );
+
+ // TQt makes this conversion very easy
+ return TQColor( TQString("#") + s );
+}
+
+
+// Stretches tiny pixmaps vertically or horizontally, taking into account
+// repetition in patterns, so as not to make them mismatched
+TQPixmap* ThemeHandler::stretchPixmap( TQPixmap* src, bool stretchHoriz, int stretchSize )
+{
+ if (!src) return NULL;
+ if (src->isNull()) return NULL;
+
+ int s_inc, size;
+
+ // If its the right size already, just return
+ if (stretchSize == -1)
+ {
+ if (stretchHoriz)
+ s_inc = src->width();
+ else
+ s_inc = src->height();
+
+ size = s_inc;
+ if (size >= 100)
+ return src;
+
+ // Stretch an appropriate amount - taking care of pattern repetition
+ while( size < 100 )
+ size += s_inc;
+ } else
+ size = stretchSize;
+
+ TQPixmap* p = new TQPixmap();
+ if ( stretchHoriz )
+ p->resize( size, src->height() );
+ else
+ p->resize( src->width(), size );
+
+ TQPainter pnt( p );
+ if ( stretchHoriz )
+ pnt.drawTiledPixmap( 0, 0, size, src->height(), *src);
+ else
+ pnt.drawTiledPixmap( 0, 0, src->width(), size, *src);
+ pnt.end();
+
+ delete src;
+ return p;
+}
+
+static void draw3DRect(TQPainter &pnt, TQColor &col, int x, int y, int w, int h, bool up) {
+ TQColor light = col.light(135);
+ TQColor dark = col.dark(140);
+ pnt.setPen(up ? light : dark);
+ pnt.drawLine(x, y, x+w, y);
+ pnt.drawLine(x, y, x, y+h);
+ pnt.setPen(up ? dark : light);
+ pnt.drawLine(x, y+h, x+w, y+h);
+ pnt.drawLine(x+w, y, x+w, y+h);
+ pnt.setPen(col);
+ pnt.drawPoint(x+w, y);
+ pnt.drawPoint(x, y+h);
+}
+
+void ThemeHandler::setPixmapButton( TQPixmap* p[], TQString s1, TQString s2)
+{
+ if ( p[Active] )
+ qWarning("twin-icewm: setPixmap - should be null (1)\n");
+ if ( p[InActive] )
+ qWarning("twin-icewm: setPixmap - should be null (2)\n");
+
+ TQString str = locate("appdata", TQString("icewm-themes/")
+ + themeName + s1 + "A" + s2);
+ if (str.isEmpty())
+ str = locate("appdata", TQString("icewm-themes/")
+ + themeName + s1 + s2);
+
+ TQPixmap *qp = new TQPixmap(str);
+ TQColor cActive = themeLook == WIN95 ? *colorActiveTitleBar : *colorActiveButton;
+ TQColor cInActive = themeLook == WIN95 ? *colorInActiveTitleBar : *colorInActiveButton;
+
+ if (!qp->isNull() && themeLook > 0) {
+ int w = qp->width();
+ if (themeLook > 0 && titleBarHeight > w) w = titleBarHeight;
+ p[Active] = new TQPixmap(w, 2*titleBarHeight );
+ p[Active] -> fill(cActive);
+
+ TQPainter pnt( p[Active] );
+
+ int offX = (w - qp->width())/2;
+ int offY = (titleBarHeight - qp->height())/2;
+ if (offY < 0) offY = 0;
+
+ if (themeLook == WIN95) {
+ draw3DRect(pnt, *colorActiveButton, offX-1, offY-1,
+ qp->width()+1, qp->height()+1, true);
+ draw3DRect(pnt, *colorActiveButton, offX-1, offY-1 + titleBarHeight,
+ qp->width()+1, qp->height()+1, false);
+ } else if (themeLook != WARP4) {
+ draw3DRect(pnt, *colorActiveButton, 0, 0,
+ w-1, titleBarHeight-1, true);
+ draw3DRect(pnt, *colorActiveButton, 0, titleBarHeight,
+ w-1, 2*titleBarHeight-1, false);
+ }
+
+ pnt.drawPixmap(offX, offY, *qp);
+ if (qp->height() <= titleBarHeight) {
+ pnt.drawPixmap(offX, titleBarHeight+offY, *qp);
+ }
+ pnt.end();
+ delete qp;
+ } else {
+ p[Active] = qp;
+ }
+
+ str = locate("appdata", TQString("icewm-themes/")
+ + themeName + s1 + "I" + s2);
+ if (str.isEmpty())
+ str = locate("appdata", TQString("icewm-themes/")
+ + themeName + s1 + s2);
+
+ qp = new TQPixmap(str);
+ if (!qp->isNull() && themeLook > 0) {
+ int w = qp->width();
+ if (titleBarHeight > w) w = titleBarHeight;
+ p[InActive] = new TQPixmap(w, 2*titleBarHeight );
+ p[InActive] -> fill(cInActive);
+
+ TQPainter pnt( p[InActive] );
+
+ int offX = (w - qp->width())/2;
+ int offY = (titleBarHeight - qp->height())/2;
+ if (offY < 0) offY = 0;
+
+ if (themeLook == WIN95) {
+ draw3DRect(pnt, *colorInActiveButton, offX-1, offY-1,
+ qp->width()+1, qp->height()+1, true);
+ draw3DRect(pnt, *colorInActiveButton, offX-1, offY-1 + titleBarHeight,
+ qp->width()+1, qp->height()+1, false);
+ } else if (themeLook != WARP4) {
+ draw3DRect(pnt, *colorInActiveButton, 0, 0,
+ w-1, titleBarHeight-1, true);
+ draw3DRect(pnt, *colorActiveButton, 0, titleBarHeight,
+ w-1, 2*titleBarHeight-1, false);
+ }
+ pnt.drawPixmap(offX, offY, *qp);
+ if (qp->height() <= titleBarHeight) {
+ pnt.drawPixmap(offX, titleBarHeight+offY, *qp);
+ }
+ pnt.end();
+ delete qp;
+ } else {
+ p[InActive] = qp;
+ }
+}
+
+
+
+
+// Loads the specified Active/InActive files into the specific pixmaps, and
+// can perform horizontal / vertical stretching if required for speed.
+// Tries to implement some icewm specific pixmap handling for some dodgy themes
+void ThemeHandler::setPixmap( TQPixmap* p[], TQString s1, TQString s2,
+ bool stretch, bool stretchHoriz )
+{
+ if ( p[Active] )
+ qWarning("twin-icewm: setPixmap - should be null (1)\n");
+ if ( p[InActive] )
+ qWarning("twin-icewm: setPixmap - should be null (2)\n");
+
+ p[Active] = new TQPixmap( locate("data", TQString("twin/icewm-themes/")
+ + themeName + s1 + "A" + s2) );
+ p[InActive] = new TQPixmap( locate("data", TQString("twin/icewm-themes/")
+ + themeName + s1 + "I" + s2) );
+
+ // Stretch the pixmap if requested.
+ if ( stretch )
+ {
+ if (p[Active])
+ p[Active] = stretchPixmap( p[Active], stretchHoriz );
+ if (p[InActive])
+ p[InActive] = stretchPixmap( p[InActive], stretchHoriz );
+ }
+
+ if ( p[Active] && p[InActive] )
+ {
+ // Make sure active and inactive pixmaps are the same width for proper painting
+ if (p[Active]->width() > p[InActive]->width())
+ p[InActive] = stretchPixmap( p[InActive], true, p[Active]->width() );
+ }
+
+}
+
+
+// returns true if there were enough pixmaps loaded to
+// draw the pixmap frame properly.
+bool ThemeHandler::isFrameValid()
+{
+ return
+ ( validPixmaps( frameTL ) &&
+ validPixmaps( frameT ) &&
+ validPixmaps( frameTR ) &&
+ validPixmaps( frameL ) &&
+ validPixmaps( frameR ) &&
+ validPixmaps( frameBL ) &&
+ validPixmaps( frameB ) &&
+ validPixmaps( frameBR ) );
+}
+
+
+// Resets the theme, and re-clients all twin's wrapped windows.
+bool ThemeHandler::reset( unsigned long)
+{
+ initialized = false;
+ freePixmaps();
+ readConfig();
+ initTheme();
+ validframe = isFrameValid();
+ initialized = true;
+
+ // recreate all clients
+ return true;
+}
+
+bool ThemeHandler::supports( Ability ability )
+{
+ switch( ability )
+ {
+ case AbilityAnnounceButtons:
+ case AbilityButtonMenu:
+ case AbilityButtonOnAllDesktops:
+ case AbilityButtonMinimize:
+ case AbilityButtonMaximize:
+ case AbilityButtonClose:
+ return true;
+ default:
+ return false;
+ };
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// IceWM button class
+////////////////////////////////////////////////////////////////////////////////////////////
+
+IceWMButton::IceWMButton(IceWMClient *parent, const char *name, TQPixmap* (*p)[2],
+ bool isToggle, const TQString& tip, const int realizeBtns )
+ : TQButton(parent->widget(), name)
+{
+ m_realizeButtons = realizeBtns;
+ setTipText(tip);
+ setCursor(ArrowCursor);
+ // Eliminate any possible background flicker
+ setBackgroundMode( TQWidget::NoBackground );
+ client = parent;
+ usePixmap( p );
+ setFixedSize( tqsizeHint() );
+ setToggleButton( isToggle );
+}
+
+
+void IceWMButton::setTipText(const TQString &tip) {
+ if(KDecoration::options()->showTooltips()) {
+ TQToolTip::remove(this );
+ TQToolTip::add(this, tip );
+ }
+}
+
+
+TQSize IceWMButton::tqsizeHint() const
+{
+ // Check for invalid data
+ if ( validPixmaps( (TQPixmap**) (*pix) ) ) // Cast to avoid dumb warning
+ {
+ TQPixmap* p = (*pix)[ client->isActive() ? Active : InActive ];
+ return( TQSize(p->width(), titleBarHeight) );
+ } else
+ return( TQSize(0, 0) );
+}
+
+
+void IceWMButton::usePixmap( TQPixmap* (*p)[2] )
+{
+ if (validPixmaps( *p )) {
+ pix = p;
+ setFixedSize( (*pix)[Active]->width(), titleBarHeight );
+ tqrepaint( false );
+ } else
+ pix = NULL;
+}
+
+
+void IceWMButton::drawButton(TQPainter *pnt)
+{
+ if ( pix && validPixmaps(*pix) )
+ {
+ TQPixmap* p = (*pix)[ client->isActive() ? Active : InActive ];
+
+ if( p && (!p->isNull()) )
+ {
+ int width = p->width();
+
+ // Only draw the lower pixmap 1/2 for down, and upper 1/2 for up state
+ if( isDown() || isOn() )
+ pnt->drawPixmap(0, 0, *p, 0, titleBarHeight, width, titleBarHeight);
+ else
+ pnt->drawPixmap(0, 0, *p, 0, 0, width, titleBarHeight);
+ }
+ } else
+ qWarning("twin-icewm: Can't paint a null pixmap button");
+}
+
+
+void IceWMButton::turnOn( bool isOn )
+{
+ if ( isToggleButton() )
+ setOn( isOn );
+}
+
+
+void IceWMButton::mousePressEvent( TQMouseEvent* e )
+{
+ last_button = e->button();
+ TQMouseEvent me ( e->type(), e->pos(), e->globalPos(),
+ (e->button()&m_realizeButtons)?Qt::LeftButton:Qt::NoButton, e->state() );
+ TQButton::mousePressEvent( &me );
+}
+
+
+void IceWMButton::mouseReleaseEvent( TQMouseEvent* e )
+{
+ last_button = e->button();
+ TQMouseEvent me ( e->type(), e->pos(), e->globalPos(),
+ (e->button()&m_realizeButtons)?Qt::LeftButton:Qt::NoButton, e->state() );
+ TQButton::mouseReleaseEvent( &me );
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// IceWMClient class
+////////////////////////////////////////////////////////////////////////////////////////////
+
+IceWMClient::IceWMClient( KDecorationBridge* bridge, KDecorationFactory* factory )
+ : KDecoration (bridge, factory),
+ m_closing(false)
+{
+}
+
+
+IceWMClient::~IceWMClient()
+{
+ // Free the menu pixmaps if previously allocated
+ if ( menuButtonWithIconPix[Active] )
+ delete menuButtonWithIconPix[Active];
+ if ( menuButtonWithIconPix[InActive] )
+ delete menuButtonWithIconPix[InActive];
+}
+
+
+void IceWMClient::init()
+{
+ createMainWidget( WNoAutoErase | WStaticContents );
+ widget()->installEventFilter( this );
+
+ // Set button pointers to null so we can track things
+ for(int i= IceWMClient::BtnSysMenu; i < IceWMClient::BtnCount; i++)
+ button[i] = NULL;
+
+ // Make sure we can track the menu pixmaps too.
+ menuButtonWithIconPix[Active] = NULL;
+ menuButtonWithIconPix[InActive] = NULL;
+
+ // No flicker thanks
+ widget()->setBackgroundMode( NoBackground );
+
+ // Pack the windowWrapper() window within a grid tqlayout
+ grid = new TQGridLayout(widget(), 0, 0, 0);
+ grid->setResizeMode(TQLayout::FreeResize);
+ grid->addRowSpacing(0, borderSizeY); // Top grab bar
+
+ // Do something IceWM can't do :)
+ if (titleBarOnTop) {
+ if( isPreview())
+ grid->addWidget( new TQLabel( i18n( "<center><b>IceWM preview</b></center>" ), widget() ), 2, 1);
+ else
+ grid->addItem( new TQSpacerItem( 0, 0 ), 2, 1);
+ // no shade flicker
+ grid->addItem( new TQSpacerItem( 0, 0, TQSizePolicy::Fixed, TQSizePolicy::Expanding ) );
+ }
+ else {
+ // no shade flicker
+ grid->addItem( new TQSpacerItem( 0, 0, TQSizePolicy::Fixed, TQSizePolicy::Expanding ) );
+ if( isPreview())
+ grid->addWidget( new TQLabel( i18n( "<center><b>IceWM preview</b></center>" ), widget() ), 1, 1);
+ else
+ grid->addItem( new TQSpacerItem( 0, 0 ), 1, 1);
+ }
+
+ grid->setRowStretch(1, 10);
+ grid->setRowStretch(2, 10);
+ grid->setColStretch(1, 10);
+ grid->addRowSpacing(3, borderSizeY);
+ grid->addColSpacing(0, borderSizeX);
+ grid->addColSpacing(2, borderSizeX);
+
+ // Pack the titlebar with spacers and buttons
+ hb = new TQBoxLayout(0, TQBoxLayout::LeftToRight, 0, 0, 0);
+ hb->setResizeMode( TQLayout::FreeResize );
+
+ titleSpacerJ = addPixmapSpacer( titleJ );
+
+ addClientButtons( *titleButtonsLeft );
+ titleSpacerL = addPixmapSpacer( titleL );
+
+ // Centre titlebar if required.
+ TQSizePolicy::SizeType spTitleBar;
+ spTitleBar = titleBarCentered ? TQSizePolicy::Expanding : TQSizePolicy::Maximum;
+ titleSpacerS = addPixmapSpacer( titleS, spTitleBar, 1 );
+ titleSpacerP = addPixmapSpacer( titleP );
+
+ titlebar = new TQSpacerItem( titleTextWidth(caption()), titleBarHeight,
+ TQSizePolicy::Preferred, TQSizePolicy::Fixed );
+ hb->addItem(titlebar);
+
+ titleSpacerM = addPixmapSpacer( titleM );
+ titleSpacerB = addPixmapSpacer( titleB, TQSizePolicy::Expanding, 1 );
+ titleSpacerR = addPixmapSpacer( titleR );
+
+ addClientButtons( *titleButtonsRight );
+
+ titleSpacerQ = addPixmapSpacer( titleQ );
+
+ if (titleBarOnTop)
+ grid->addLayout ( hb, 1, 1 );
+ else
+ grid->addLayout ( hb, 2, 1 );
+}
+
+
+// Adds the buttons to the hbox tqlayout as per the buttons specified
+// in the button string 's'
+void IceWMClient::addClientButtons( const TQString& s )
+{
+ if (!s.isEmpty())
+ for(unsigned int i = 0; i < s.length(); i++)
+ {
+ switch ( s[i].latin1() )
+ {
+ case 's':
+ // Create the menu icons, and render with the current mini-icon
+ // if explicitly requested by the theme.
+ if ( (validPixmaps(menuButtonPix) || showMenuButtonIcon) && !button[BtnSysMenu])
+ {
+ if (showMenuButtonIcon) {
+ renderMenuIcons();
+ button[BtnSysMenu] = new IceWMButton(this, "menu",
+ &menuButtonWithIconPix, false, i18n("Menu"), Qt::LeftButton|Qt::RightButton);
+ }
+ else
+ button[BtnSysMenu] = new IceWMButton(this, "menu",
+ &menuButtonPix, false, i18n("Menu"));
+
+ connect( button[BtnSysMenu], TQT_SIGNAL(pressed()),
+ this, TQT_SLOT(menuButtonPressed()));
+ connect( button[BtnSysMenu], TQT_SIGNAL(released()),
+ this, TQT_SLOT(menuButtonReleased()));
+ hb->addWidget( button[BtnSysMenu] );
+ }
+ break;
+
+ case 'x':
+ if ( validPixmaps(closePix) && !button[BtnClose] && isCloseable())
+ {
+ button[BtnClose] = new IceWMButton(this, "close",
+ &closePix, false, i18n("Close"));
+ hb->addWidget( button[BtnClose] );
+ connect( button[BtnClose], TQT_SIGNAL(clicked()),
+ this, TQT_SLOT(closeWindow()));
+ }
+ break;
+
+ case 'm':
+ if ( validPixmaps(maximizePix) && !button[BtnMaximize] && isMaximizable() )
+ {
+ button[BtnMaximize] = new IceWMButton(this, "maximize",
+ &maximizePix, false, i18n("Maximize"), Qt::LeftButton|Qt::MidButton|Qt::RightButton);
+ hb->addWidget( button[BtnMaximize] );
+ connect( button[BtnMaximize], TQT_SIGNAL(clicked()),
+ this, TQT_SLOT(slotMaximize()));
+ }
+ break;
+
+ case 'i':
+ if ( validPixmaps(minimizePix) && !button[BtnMinimize] &&
+ isMinimizable() )
+ {
+ button[BtnMinimize] = new IceWMButton(this, "minimize",
+ &minimizePix, false, i18n("Minimize"));
+ hb->addWidget( button[BtnMinimize] );
+ connect( button[BtnMinimize], TQT_SIGNAL(clicked()),
+ this, TQT_SLOT(minimize()));
+ }
+ break;
+
+ /* Not yet implemented - how's hide useful anyway?
+ case 'h':
+ if ( button[BtnHide] && !button[BtnHide] )
+ hb->addWidget( button[BtnHide] );
+ break; */
+
+ case 'r':
+ // NOTE: twin doesn't have toggleShade() in clients.h !
+ if ( validPixmaps(rollupPix) && !button[BtnRollup] )
+ {
+ button[BtnRollup] = new IceWMButton(this, "shade",
+ isSetShade() ? &rolldownPix : &rollupPix,
+ false, i18n("Rollup"));
+ hb->addWidget( button[BtnRollup] );
+ connect( button[BtnRollup], TQT_SIGNAL(clicked()),
+ this, TQT_SLOT(toggleShade()));
+ }
+ break;
+
+ case 'd':
+ // Make depth == on all desktops
+ if ( validPixmaps(depthPix) && !button[BtnDepth] )
+ {
+ button[BtnDepth] = new IceWMButton(this, "on_all_desktops",
+ &depthPix, true, isOnAllDesktops()?i18n("Not on all desktops"):i18n("On all desktops"));
+ button[BtnDepth]->turnOn( isOnAllDesktops() );
+ hb->addWidget( button[BtnDepth] );
+ connect( button[BtnDepth], TQT_SIGNAL(clicked()),
+ this, TQT_SLOT(toggleOnAllDesktops()));
+ }
+ break;
+ }
+ }
+}
+
+
+// Adds a pixmap to the titlebar tqlayout via the use of a nice TQSpacerItem
+TQSpacerItem* IceWMClient::addPixmapSpacer( TQPixmap* p[], TQSizePolicy::SizeType s, int hsize )
+{
+ TQSpacerItem* sp;
+
+ // Add a null spacer for zero image
+ if ( p && p[Active] )
+ {
+ int w = (hsize == -1) ? p[Active]->width(): hsize;
+ sp = new TQSpacerItem( w, titleBarHeight, s, TQSizePolicy::Fixed );
+ }
+ else
+ sp = new TQSpacerItem(0, 0, TQSizePolicy::Maximum, TQSizePolicy::Fixed );
+
+ hb->addItem( sp );
+ return sp;
+}
+
+
+void IceWMClient::renderMenuIcons()
+{
+ TQPixmap miniIcon( icon().pixmap( TQIconSet::Small, TQIconSet::Normal) );
+
+ if (!miniIcon.isNull())
+ for(int i = 0; i < 2; i++) {
+ if ( menuButtonWithIconPix[i] )
+ delete menuButtonWithIconPix[i];
+
+ // Try to be more friendly to dodgy themes - icewm assumes a square menu button
+ // but some pixmap themes don't provide a square menu button.
+ int w = titleBarHeight;
+ if (validPixmaps(menuButtonPix) && menuButtonPix[i]->width() > w)
+ w = menuButtonPix[i]->width();
+ menuButtonWithIconPix[i] = new TQPixmap(w, 2*titleBarHeight );
+ if (themeLook != WIN95)
+ menuButtonWithIconPix[i] -> fill((i==0) ? *colorInActiveButton : *colorActiveButton);
+ else
+ menuButtonWithIconPix[i] -> fill((i==0) ? *colorInActiveTitleBar : *colorActiveTitleBar);
+ TQPainter pnt( menuButtonWithIconPix[i] );
+
+ if (themeLook > 0 && themeLook != WIN95 && themeLook != WARP4) {
+ draw3DRect(pnt, *colorActiveButton, 0, 0,
+ w-1, titleBarHeight-1, true);
+ draw3DRect(pnt, *colorActiveButton, 0, titleBarHeight,
+ w-1, 2*titleBarHeight-1, false);
+ }
+ if (validPixmaps(menuButtonPix)) {
+ pnt.drawPixmap(0, 0, *menuButtonPix[i]);
+ }
+ int offset = (titleBarHeight - miniIcon.width())/2;
+ if (offset<0) offset = 0;
+ // Paint the mini icon over the menu pixmap in the centre
+ pnt.drawPixmap( offset, offset, miniIcon );
+ pnt.drawPixmap( offset, titleBarHeight+offset, miniIcon );
+ pnt.end();
+ }
+
+}
+
+
+void IceWMClient::slotMaximize()
+{
+ maximize(button[BtnMaximize]->last_button);
+}
+
+void IceWMClient::toggleShade()
+{
+ setShade(!isSetShade());
+}
+
+int IceWMClient::titleTextWidth( const TQString& s )
+{
+ // Obtains the actual width of the text, using the titlebar font
+ TQSize size;
+ TQFontMetrics fm( options()->font(true) );
+ size = fm.size( 0, s );
+ return size.width();
+}
+
+
+void IceWMClient::borders(int& left, int& right, int& top, int& bottom) const
+{
+ left = borderSizeX;
+ right = borderSizeX;
+ if( titleBarOnTop ) {
+ top = titleBarHeight + borderSizeY;
+ bottom = borderSizeY;
+ } else {
+ top = borderSizeY;
+ bottom = titleBarHeight + borderSizeY;
+ }
+}
+
+
+void IceWMClient::resize( const TQSize& s )
+{
+ widget()->resize( s );
+}
+
+
+TQSize IceWMClient::tqminimumSize() const
+{
+ return widget()->tqminimumSize();
+}
+
+
+// Repaint nicely upon resize to minimise flicker.
+void IceWMClient::resizeEvent( TQResizeEvent* e )
+{
+ calcHiddenButtons();
+
+ if (widget()->isVisibleToTLW())
+ {
+ widget()->update(widget()->rect());
+ int dx = 0;
+ int dy = 0;
+
+ if ( e->oldSize().width() != widget()->width() )
+ dx = 32 + TQABS( e->oldSize().width() - width() );
+
+ if ( e->oldSize().height() != height() )
+ dy = 8 + TQABS( e->oldSize().height() - height() );
+
+ if ( dy )
+ widget()->update( 0, height() - dy + 1, width(), dy );
+
+ if ( dx )
+ {
+ widget()->update( width() - dx + 1, 0, dx, height() );
+ widget()->update( TQRect( TQPoint(4,4), titlebar->tqgeometry().bottomLeft() - TQPoint(1,0) ) );
+ widget()->update( TQRect( titlebar->tqgeometry().topRight(), TQPoint( width() - 4, titlebar->tqgeometry().bottom() ) ) );
+ widget()->tqrepaint(titlebar->tqgeometry(), false);
+ }
+ }
+}
+
+
+// IceWM Paint magic goes here.
+void IceWMClient::paintEvent( TQPaintEvent* )
+{
+ TQColor colorTitleShadow;
+ TQColor colorTitle;
+ TQColor c1;
+ int rx, rw;
+
+ TQPainter p( widget() );
+ int act = isActive() ? Active: InActive;
+
+ // Determine titlebar shadow colors
+ bool useShadow = isActive() ? useActiveShadow : useInActiveShadow;
+ if ( useShadow )
+ colorTitleShadow = isActive() ? *colorActiveTitleTextShadow : *colorInActiveTitleTextShadow;
+
+ if ( themeTitleTextColors )
+ colorTitle = isActive()? *colorActiveTitleBarText : *colorInActiveTitleBarText;
+ else
+ colorTitle = options()->color(ColorFont, isActive());
+
+ // Obtain widget bounds.
+ TQRect r;
+ r = widget()->rect();
+ int fillWidth = r.width() - 2*borderSizeX;
+ int y = r.y();
+ int x = r.x();
+ int w = r.width();
+ int h = r.height();
+
+ // Do we have pixmaps for the frame?
+ if (validframe)
+ {
+ // Top corner
+ p.drawPixmap(0, 0, *frameTL[ act ], 0, 0, cornerSizeX, borderSizeY);
+ p.drawPixmap(0, 0, *frameTL[ act ], 0, 0, borderSizeX, cornerSizeY);
+
+ // Top right corner
+ p.drawPixmap(w-cornerSizeX, 0, *frameTR[ act ],
+ frameTR[act]->width()-cornerSizeX, 0, cornerSizeX, borderSizeY);
+ p.drawPixmap(w-borderSizeX, 0, *frameTR[ act ],
+ frameTR[act]->width()-borderSizeX, 0, borderSizeX, cornerSizeY);
+
+ // Top bar
+ p.drawTiledPixmap( cornerSizeX, 0, w-(2*cornerSizeX), borderSizeY, *frameT[ act ] );
+
+ // Left bar
+ p.drawTiledPixmap( 0, cornerSizeY, borderSizeX, h-(2*cornerSizeY), *frameL[ act ] );
+
+ // Right bar
+ p.drawTiledPixmap( w-borderSizeX, cornerSizeY, borderSizeX, h-(2*cornerSizeY),
+ *frameR[ act ],frameR[act]->width()-borderSizeX );
+
+ // Bottom left corner
+ p.drawPixmap(0, h-borderSizeY, *frameBL[ act ],
+ 0, frameBL[act]->height()-borderSizeY, cornerSizeX, borderSizeY);
+ p.drawPixmap(0, h-cornerSizeY, *frameBL[ act ],
+ 0, frameBL[act]->height()-cornerSizeY, borderSizeX, cornerSizeY);
+
+ // Bottom right corner
+ p.drawPixmap(w-cornerSizeX, h-borderSizeY, *frameBR[ act ],
+ frameBR[act]->width()-cornerSizeX, frameBR[act]->height()-borderSizeY,
+ cornerSizeX, borderSizeY);
+
+ p.drawPixmap(w-borderSizeX, h-cornerSizeY, *frameBR[ act ],
+ frameBR[act]->width()-borderSizeX, frameBR[act]->height()-cornerSizeY,
+ borderSizeX, cornerSizeY);
+
+ // Bottom bar
+ p.drawTiledPixmap(cornerSizeX, h-borderSizeY, w-(2*cornerSizeX), borderSizeY,
+ *frameB[ act ], 0, frameB[ act ]->height()-borderSizeY );
+
+ // Ensure uncovered areas during shading are painted with something
+ p.setPen( *colorInActiveBorder );
+ if (titleBarOnTop)
+ p.drawLine( x+borderSizeX, y+h-borderSizeY-1,
+ x+w-borderSizeX-1, y+h-borderSizeY-1);
+ else
+ p.drawLine( x+borderSizeX, y+borderSizeY,
+ x+w-borderSizeX-1, y+borderSizeY);
+
+ } else
+ {
+ // Draw a stock IceWM frame instead of a pixmap frame
+ c1 = isActive() ? *colorActiveBorder : *colorInActiveBorder;
+
+ if (themeLook == WARP3 || themeLook == MOTIF) {
+ draw3DRect(p, c1, x, y, w-1, h-1, true);
+ p.setPen(c1);
+ p.drawRect(x+1, y+1, w-2, h-2);
+ } else {
+ p.setPen( c1.light(135) );
+ p.drawLine(0, 0, w-2, 0);
+ p.drawLine(0, 0, 0, h-2);
+
+ p.setPen(c1);
+ p.drawLine(1, 1, w-3, 1);
+ p.drawLine(1, 1, 1, h-3);
+
+ p.setPen( c1.dark(140) );
+ p.drawLine(1, h-2, w-2, h-2);
+ p.drawLine(w-2, 1, w-2, h-2);
+
+ p.setPen( TQt::black );
+ p.drawLine(w-1, 0, w-1, h-1);
+ p.drawLine(0, h-1, w-1, h-1);
+ }
+
+
+ // Fill frame border if required
+ if (borderSizeX > 2)
+ {
+ // FillQt::Vertical sizes
+ p.fillRect( x+2, y+2, borderSizeX-2, h-4, c1);
+ p.fillRect( w-borderSizeX, y+2, borderSizeX-2, h-4, c1);
+ }
+
+ if (borderSizeY > 2)
+ {
+ // Fill horizontal frame parts
+ p.fillRect( x+borderSizeX, y+2, fillWidth, borderSizeY-2, c1);
+ p.fillRect( x+borderSizeX, h-borderSizeY, fillWidth, borderSizeY-2, c1);
+ }
+
+ if (themeLook == WARP3 || themeLook == MOTIF) {
+ draw3DRect(p, c1, x+borderSizeX-1, y+borderSizeY-1,
+ w+1-2*borderSizeX, h+1-2*borderSizeY, false);
+ }
+ if (themeLook == MOTIF && !isShade()) {
+ int xext = titleBarHeight + borderSizeX - 1;
+ int yext = titleBarHeight + borderSizeY - 1;
+
+ int xext2 = w-xext-2;
+ int yext2 = h-yext-2;
+
+ int bX = w - borderSizeX-1;
+ int bY = h - borderSizeY-1;
+
+ p.setPen( c1.dark(140) );
+ p.drawLine(xext, 0, xext, borderSizeY);
+ p.drawLine(xext2, 0, xext2, borderSizeY);
+ p.drawLine(xext, bY, xext, h-1);
+ p.drawLine(xext2, bY, xext2, h-1);
+
+ p.drawLine(0, yext, borderSizeX, yext);
+ p.drawLine(0, yext2, borderSizeX, yext2);
+ p.drawLine(bX, yext, w-1, yext);
+ p.drawLine(bX, yext2, w-1, yext2);
+
+ p.setPen( c1.light(135) );
+
+ ++xext; ++yext; ++xext2; ++yext2;
+
+ p.drawLine(xext, 0, xext, borderSizeY);
+ p.drawLine(xext2, 0, xext2, borderSizeY);
+ p.drawLine(xext, bY, xext, h-1);
+ p.drawLine(xext2, bY, xext2, h-1);
+
+ p.drawLine(0, yext, borderSizeX, yext);
+ p.drawLine(0, yext2, borderSizeX, yext2);
+ p.drawLine(bX, yext, w-1, yext);
+ p.drawLine(bX, yext2, w-1, yext2);
+
+
+ }
+
+ // Ensure uncovered areas during shading are painted with something
+ p.setPen( *colorInActiveBorder );
+ if (titleBarOnTop)
+ p.drawLine( x+borderSizeX, y+h-borderSizeY-1,
+ x+w-borderSizeX-1, y+h-borderSizeY-1);
+ else
+ p.drawLine( x+borderSizeX, y+borderSizeY,
+ x+w-borderSizeX-1, y+borderSizeY);
+ }
+
+ // Draw the title elements, if we need to draw a titlebar.
+ if (titleBarHeight > 0)
+ {
+ TQPixmap* titleBuffer = new TQPixmap( width()-(2*borderSizeX), titleBarHeight );
+ TQPainter p2( titleBuffer, this );
+ titleBuffer->fill( act ? *colorActiveTitleBar : *colorInActiveTitleBar );
+
+ r = titleSpacerJ->tqgeometry();
+ if (!r.isEmpty() && titleJ[ act ])
+ p2.drawPixmap( r.x()-borderSizeX, 0, *titleJ[ act ]);
+
+ r = titleSpacerL->tqgeometry();
+ if (!r.isEmpty() && titleL[ act ])
+ p2.drawPixmap( r.x()-borderSizeX, 0, *titleL[ act ]);
+
+ r = titleSpacerS->tqgeometry();
+ if (!r.isEmpty() && titleS[ act ])
+ p2.drawTiledPixmap( r.x()-borderSizeX, 0, r.width(), titleBarHeight, *titleS[ act ]);
+
+ r = titleSpacerP->tqgeometry();
+ if (!r.isEmpty() && titleP[ act ])
+ p2.drawPixmap( r.x()-borderSizeX, 0, *titleP[ act ]);
+
+ r = titlebar->tqgeometry();
+ if (!r.isEmpty() && titleT[ act ] )
+ p2.drawTiledPixmap( r.x()-borderSizeX, 0, r.width(), titleBarHeight, *titleT[ act ]);
+
+ r = titleSpacerM->tqgeometry();
+ if (!r.isEmpty() && titleM[ act ])
+ p2.drawPixmap( r.x()-borderSizeX, 0, *titleM[ act ], 0, 0, r.width(), r.height());
+
+ r = titleSpacerB->tqgeometry();
+ if (!r.isEmpty() && titleB[ act ])
+ p2.drawTiledPixmap( r.x()-borderSizeX, 0, r.width(), titleBarHeight, *titleB[ act ]);
+
+ r = titleSpacerR->tqgeometry();
+ if (!r.isEmpty() && titleR[ act ])
+ p2.drawPixmap( r.x()-borderSizeX, 0, *titleR[ act ], 0, 0, r.width(), r.height());
+
+ r = titleSpacerQ->tqgeometry();
+ if (!r.isEmpty() && titleQ[ act ])
+ p2.drawPixmap( r.x()-borderSizeX, 0, *titleQ[ act ], 0, 0, r.width(), r.height());
+
+ p2.setFont( options()->font(true) );
+
+ // Pre-compute as much as possible
+ r = titlebar->tqgeometry();
+ rx = r.x() - borderSizeX;
+ rw = width()-(2*borderSizeX)-r.x();
+
+ // Paint a title text shadow if requested
+ if ( useShadow )
+ {
+ p2.setPen( colorTitleShadow );
+ p2.drawText(rx+1, 1, rw, titleBarHeight, AlignLeft|AlignVCenter, caption());
+ }
+
+ // Draw the title text
+ p2.setPen( colorTitle );
+ p2.drawText(rx, 0, rw, titleBarHeight, AlignLeft|AlignVCenter, caption());
+ p2.end();
+
+ bitBlt( widget(), borderSizeX, hb->tqgeometry().y(), titleBuffer );
+
+ delete titleBuffer;
+ }
+}
+
+
+void IceWMClient::showEvent(TQShowEvent *ev)
+{
+ calcHiddenButtons();
+
+ titlebar->changeSize( titleTextWidth(caption()), titleBarHeight,
+ TQSizePolicy::Preferred, TQSizePolicy::Fixed );
+ grid->activate();
+ widget()->show();
+ IceWMClient::showEvent(ev);
+}
+
+
+void IceWMClient::mouseDoubleClickEvent( TQMouseEvent * e )
+{
+ if( e->button() != Qt::LeftButton )
+ return;
+
+ TQRect r;
+ if (titleBarOnTop)
+ r.setRect( borderSizeX, borderSizeY, width()-(2*borderSizeX), titleBarHeight);
+ else
+ r.setRect( borderSizeX, height()-borderSizeY-titleBarHeight,
+ width()-(2*borderSizeX), titleBarHeight);
+
+ if (r.contains( e->pos() ) )
+ titlebarDblClickOperation();
+
+}
+
+
+void IceWMClient::wheelEvent(TQWheelEvent *e)
+{
+ if (isSetShade() || TQRect( 0, 0, width(), titleBarHeight ).contains( e->pos() ) )
+ titlebarMouseWheelOperation( e->delta());
+}
+
+
+// Called via Client class when the miniIcon() changes
+void IceWMClient::iconChange()
+{
+ if (validPixmaps(menuButtonPix) && showMenuButtonIcon)
+ {
+ if (button[BtnSysMenu])
+ {
+ renderMenuIcons();
+ button[BtnSysMenu]->usePixmap( &menuButtonWithIconPix );
+ if (button[BtnSysMenu]->isVisible())
+ button[BtnSysMenu]->tqrepaint(false);
+ }
+ }
+}
+
+
+void IceWMClient::desktopChange()
+{
+ if (button[BtnDepth])
+ {
+ button[BtnDepth]->turnOn( isOnAllDesktops() );
+ button[BtnDepth]->tqrepaint(false);
+ button[BtnDepth]->setTipText(isOnAllDesktops() ? i18n("Not on all desktops") : i18n("On all desktops"));
+ }
+}
+
+
+// Please don't modify the following unless you want tqlayout problems
+void IceWMClient::captionChange()
+{
+ TQRect r( 0, borderSizeY, geometry().width(), titleBarHeight);
+
+ titlebar->changeSize( titleTextWidth( caption() ), titleBarHeight,
+ TQSizePolicy::Preferred, TQSizePolicy::Fixed );
+ titlebar->invalidate();
+ grid->activate();
+ widget()->tqrepaint( r, false );
+}
+
+
+void IceWMClient::maximizeChange()
+{
+ // Change the button pixmap to restore if required
+ if (button[BtnMaximize] && validPixmaps(restorePix))
+ {
+ button[BtnMaximize]->usePixmap( (maximizeMode()==MaximizeFull) ? &restorePix : &maximizePix );
+ button[BtnMaximize]->setTipText( (maximizeMode()==MaximizeFull) ? i18n("Restore") : i18n("Maximize"));
+ }
+}
+
+
+void IceWMClient::shadeChange()
+{
+ // Change the button pixmap to rolldown if required
+ if (button[BtnRollup] && validPixmaps(rolldownPix))
+ {
+ button[BtnRollup]->usePixmap( isSetShade() ? &rolldownPix : &rollupPix );
+ button[BtnRollup]->setTipText( isSetShade() ? i18n("Rolldown") : i18n("Rollup"));
+ }
+
+}
+
+
+void IceWMClient::activeChange()
+{
+ widget()->tqrepaint(false);
+
+ // Reset the button pixmaps.
+ for(int i= IceWMClient::BtnSysMenu; i < IceWMClient::BtnCount; i++)
+ if(button[i])
+ button[i]->tqrepaint( false );
+}
+
+
+// This does the showing / hiding button magic
+// for variable positioned buttons.
+void IceWMClient::calcHiddenButtons()
+{
+ const int minwidth = 220; // Minimum width where all buttons are shown
+ const int btn_width = 20; // Average width
+
+ // Show/Hide buttons in this order - OnAllDesktops, Maximize, Menu, Rollup, Minimize, Close.
+ IceWMButton* btnArray[] = { button[BtnDepth], button[BtnMaximize], button[BtnSysMenu],
+ button[BtnRollup], button[BtnMinimize], button[BtnClose] };
+
+ int current_width = width();
+ int count = 0;
+ int i;
+
+ // Find out how many buttons we have to hide.
+ while (current_width < minwidth)
+ {
+ current_width += btn_width;
+ count++;
+ }
+
+ // Bound the number of buttons to hide
+ if (count > 6) count = 6;
+
+ // Hide the required buttons...
+ for(i = 0; i < count; i++)
+ {
+ if (btnArray[i] && btnArray[i]->isVisible() )
+ btnArray[i]->hide();
+ }
+
+ // Show the rest of the buttons...
+ for(i = count; i < 6; i++)
+ {
+ if (btnArray[i] && (!btnArray[i]->isVisible()) )
+ btnArray[i]->show();
+ }
+}
+
+
+// Mouse position code modified from that in workspace.cpp
+IceWMClient::Position IceWMClient::mousePosition( const TQPoint& p ) const
+{
+ int rangeX = cornerSizeX;
+ int rangeY = cornerSizeY;
+ int borderX = borderSizeX;
+ int borderY = borderSizeY;
+
+ Position m = PositionCenter;
+
+ if ((p.x() > borderX && p.x() < width() - borderX) &&
+ ( p.y() > borderY && p.y() < height() - borderY))
+ return PositionCenter;
+
+ if ( p.y() <= rangeY && p.x() <= rangeX)
+ m = PositionTopLeft;
+ else if ( p.y() >= height()-rangeY && p.x() >= width()-rangeX)
+ m = PositionBottomRight;
+ else if ( p.y() >= height()-rangeX && p.x() <= rangeX)
+ m = PositionBottomLeft;
+ else if ( p.y() <= rangeY && p.x() >= width()-rangeX)
+ m = PositionTopRight;
+ else if ( p.y() <= borderY )
+ m = PositionTop;
+ else if ( p.y() >= height()-borderY )
+ m = PositionBottom;
+ else if ( p.x() <= borderX )
+ m = PositionLeft;
+ else if ( p.x() >= width()-borderX )
+ m = PositionRight;
+ else
+ m = PositionCenter;
+ return m;
+}
+
+
+void IceWMClient::menuButtonPressed()
+{
+ static TQTime t;
+ static IceWMClient* lastClient = NULL;
+ bool dbl = ( lastClient == this && t.elapsed() <= TQApplication::doubleClickInterval());
+ lastClient = this;
+ t.start();
+
+ if (dbl)
+ {
+ m_closing = true;
+ return;
+ }
+
+ TQPoint menuPoint ( button[BtnSysMenu]->rect().bottomLeft() );
+
+ // Move to right if menu on rhs, otherwise on left
+ // and make this depend on windowWrapper(), not button.
+
+ KDecorationFactory* f = factory();
+ showWindowMenu( button[BtnSysMenu]->mapToGlobal(menuPoint) );
+ if( !f->exists( this )) // 'this' was deleted
+ return;
+ button[BtnSysMenu]->setDown(false);
+}
+
+void IceWMClient::menuButtonReleased()
+{
+ if (m_closing)
+ closeWindow();
+}
+
+bool IceWMClient::eventFilter( TQObject* o, TQEvent* e )
+{
+ if( TQT_BASE_OBJECT(o) != TQT_BASE_OBJECT(widget()))
+ return false;
+ switch( e->type())
+ {
+ case TQEvent::Resize:
+ resizeEvent(TQT_TQRESIZEEVENT( e ) );
+ return true;
+ case TQEvent::Paint:
+ paintEvent(TQT_TQPAINTEVENT( e ) );
+ return true;
+ case TQEvent::MouseButtonDblClick:
+ mouseDoubleClickEvent(TQT_TQMOUSEEVENT( e ) );
+ return true;
+ case TQEvent::MouseButtonPress:
+ processMousePressEvent(TQT_TQMOUSEEVENT( e ) );
+ return true;
+ case TQEvent::Wheel:
+ wheelEvent( TQT_TQWHEELEVENT( e ));
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+
+}
+
+extern "C"
+{
+ KDE_EXPORT KDecorationFactory *create_factory()
+ {
+ IceWM::clientHandler = new IceWM::ThemeHandler;
+ return IceWM::clientHandler;
+ }
+}
+
+
+#include "icewm.moc"
+
+// vim: ts=4
diff --git a/twin-styles/icewm/icewm.desktop b/twin-styles/icewm/icewm.desktop
new file mode 100644
index 00000000..eeffdcc0
--- /dev/null
+++ b/twin-styles/icewm/icewm.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Name=IceWM
+Name[cy]=RhewWM
+Name[hi]=आइस-डबल्यूएम
+Name[sv]=Ice-fönsterhanterare
+Name[ta]=பனிக்கட்டிWM
+Name[th]=ตัวจัดการหน้าต่าง IceWM
+Name[vi]=Nước đá WM
+Name[xh]=UmkhenkceWM
+Name[zu]=Iqhwa leWM
+X-KDE-Library=twin3_icewm
diff --git a/twin-styles/icewm/icewm.h b/twin-styles/icewm/icewm.h
new file mode 100644
index 00000000..f343912c
--- /dev/null
+++ b/twin-styles/icewm/icewm.h
@@ -0,0 +1,193 @@
+/*
+ $Id$
+
+ Gallium-IceWM themeable KWin client
+
+ Copyright 2001
+ Karol Szwed <gallium@kde.org>
+ http://gallium.n3.net/
+
+ 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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+ -----------------------------------------------------------------------------
+ This client loads most icewm 1.0.X pixmap themes, without taking into account
+ specific font settings for clients, or coloured mouse cursors. Titlebar
+ fonts can be changed via the kde control center. Bi-colour mouse cursors
+ may be added in future if requested by users, as well as theme font support.
+ Any styles using inbuilt icewm titlebar drawing without using pixmaps (e.g.
+ Warp4, win95 etc.) are not fully supported, and may cause drawing errors,
+ as these themes use in-built icewm drawing mechanisms.
+
+ When a pixmap theme is not present (or a corrupt one is present) then very
+ plain title decorations are painted instead, so that users don't see
+ non-painted window areas where possible ;)
+
+ At a later date, frame shaping may be added if really requested, and an
+ update to support the latest icewm 1.1.X theme format may be made.
+*/
+
+#ifndef __KDEGALLIUM_ICEWM_H
+#define __KDEGALLIUM_ICEWM_H
+
+#include <tqbutton.h>
+#include <tqlayout.h>
+#include <kpixmap.h>
+#include <kdecoration.h>
+#include <kdecorationfactory.h>
+#include <tqbutton.h>
+class TQLabel;
+class TQSpacerItem;
+class TQBoxLayout;
+class TQGridLayout;
+
+namespace IceWM {
+
+class IceWMClient;
+
+// Pixmap group
+enum { InActive=0, Active };
+// Pixmap stretching mode
+enum { Vertical=0, Horizontal=1 };
+
+
+// Handles the resetClients() signal from the Options class,
+// and manages the dynamic pixmaps, configuration and theme changing
+class ThemeHandler: public KDecorationFactory
+{
+ public:
+ ThemeHandler();
+ ~ThemeHandler();
+
+ virtual KDecoration* createDecoration( KDecorationBridge* );
+ virtual bool reset( unsigned long changed );
+ virtual bool supports( Ability ability );
+
+ private:
+ bool initialized;
+ TQString themeName;
+
+ void readConfig();
+ TQColor decodeColor( TQString& s );
+ bool isFrameValid();
+ void initTheme();
+ void freePixmaps();
+ void freePixmapGroup( TQPixmap* p[] );
+ void setPixmap( TQPixmap* p[], TQString s1, TQString s2, bool
+ stretch=false, bool stretchHoriz=true );
+ void setPixmapButton( TQPixmap* p[], TQString s1, TQString s2);
+ TQPixmap* stretchPixmap( TQPixmap* src, bool stretchHoriz=true,
+ int stretchSize=-1);
+ TQPixmap* duplicateValidPixmap( bool act, int size = -1 );
+ void convertButtons( TQString& s );
+ TQString reverseString( TQString s );
+};
+
+
+class IceWMButton : public TQButton
+{
+ public:
+ IceWMButton( IceWMClient *parent=0, const char *name=0,
+ TQPixmap* (*p)[2]=0L, bool isToggle=false,
+ const TQString& tip=NULL, const int realizeBtns = Qt::LeftButton );
+ void setTipText(const TQString &tip);
+ void usePixmap( TQPixmap* (*p)[2] );
+ TQSize tqsizeHint() const;
+ void turnOn( bool isOn );
+ ButtonState last_button;
+
+ protected:
+ void mousePressEvent( TQMouseEvent* e );
+ void mouseReleaseEvent( TQMouseEvent* e );
+
+ void drawButton( TQPainter *p );
+ void drawButtonLabel( TQPainter * ) {;}
+
+ private:
+ int m_realizeButtons;
+ IceWMClient* client;
+ TQPixmap* (*pix)[2]; // Points to active/inactive pixmap array
+};
+
+
+class IceWMClient : public KDecoration
+{
+ Q_OBJECT
+ TQ_OBJECT
+ public:
+ IceWMClient( KDecorationBridge* bridge, KDecorationFactory* factory );
+ ~IceWMClient();
+
+ virtual void init();
+ virtual void resize(const TQSize&);
+ virtual bool eventFilter( TQObject* o, TQEvent* e );
+
+ protected:
+ void resizeEvent( TQResizeEvent* );
+ void paintEvent( TQPaintEvent* );
+ void showEvent( TQShowEvent* );
+ void mouseDoubleClickEvent( TQMouseEvent * );
+ void wheelEvent( TQWheelEvent * );
+ virtual void captionChange();
+ virtual void maximizeChange();
+ virtual void shadeChange();
+ virtual void activeChange();
+ // void shadeChange(bool); /* KWin Client class doesn't provide this yet */
+ Position mousePosition( const TQPoint& ) const;
+ void renderMenuIcons();
+ void iconChange();
+ virtual void desktopChange( );
+ virtual void borders(int&, int&, int&, int&) const;
+ virtual TQSize tqminimumSize() const;
+
+ protected slots:
+ void slotMaximize();
+ void menuButtonPressed();
+ void menuButtonReleased();
+ void toggleShade();
+
+ private:
+ // These are all the icewm button types :)
+ enum Buttons{ BtnSysMenu=0, BtnClose, BtnMaximize, BtnMinimize,
+ BtnHide, BtnRollup, BtnDepth, BtnCount };
+
+ TQString shortenCaption( const TQString* s );
+ void calcHiddenButtons();
+ int titleTextWidth( const TQString& s );
+ void addClientButtons( const TQString& s );
+ TQSpacerItem* addPixmapSpacer( TQPixmap* p[],
+ TQSizePolicy::SizeType = TQSizePolicy::Maximum, int hsize = -1 );
+
+ IceWMButton* button[ IceWMClient::BtnCount ];
+ TQPixmap* menuButtonWithIconPix[2];
+ TQSpacerItem* titleSpacerJ;
+ TQSpacerItem* titleSpacerL;
+ TQSpacerItem* titleSpacerS;
+ TQSpacerItem* titleSpacerP;
+ TQSpacerItem* titlebar;
+ TQSpacerItem* titleSpacerM;
+ TQSpacerItem* titleSpacerB;
+ TQSpacerItem* titleSpacerR;
+ TQSpacerItem* titleSpacerQ;
+ TQBoxLayout* hb;
+ TQGridLayout* grid;
+ bool m_closing;
+};
+
+}
+
+#endif
+
+// vim: ts=4