From e35f3fe53cd8df85d4fd04e49dfffbaeac971cdf Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Mon, 7 Nov 2011 21:50:31 -0600 Subject: Rename kwin to twin (Part 2 of 2) --- twin-styles/CMakeLists.txt | 22 + twin-styles/Makefile.am | 4 + twin-styles/cde/CMakeLists.txt | 34 + twin-styles/cde/Makefile.am | 22 + twin-styles/cde/cde.desktop | 6 + twin-styles/cde/cdeclient.cpp | 863 ++++++++++ twin-styles/cde/cdeclient.h | 119 ++ twin-styles/cde/config/CMakeLists.txt | 28 + twin-styles/cde/config/Makefile.am | 17 + twin-styles/cde/config/config.cpp | 131 ++ twin-styles/cde/config/config.h | 52 + twin-styles/configure.in.in | 3 + twin-styles/glow/CMakeLists.txt | 35 + twin-styles/glow/Makefile.am | 22 + twin-styles/glow/config/CMakeLists.txt | 28 + twin-styles/glow/config/Makefile.am | 17 + twin-styles/glow/config/bitmaps.h | 55 + twin-styles/glow/config/glowconfigdialog.cpp | 369 ++++ twin-styles/glow/config/glowconfigdialog.h | 92 + twin-styles/glow/glow.desktop | 49 + twin-styles/glow/glowbutton.cpp | 339 ++++ twin-styles/glow/glowbutton.h | 129 ++ twin-styles/glow/glowclient.cpp | 902 ++++++++++ twin-styles/glow/glowclient.h | 206 +++ twin-styles/glow/resources.h | 11 + twin-styles/glow/themes/CMakeLists.txt | 17 + twin-styles/glow/themes/Makefile.am | 1 + twin-styles/glow/themes/default/CMakeLists.txt | 22 + twin-styles/glow/themes/default/Makefile.am | 17 + twin-styles/glow/themes/default/background.png | Bin 0 -> 788 bytes twin-styles/glow/themes/default/close.png | Bin 0 -> 122 bytes twin-styles/glow/themes/default/close_glow.png | Bin 0 -> 179 bytes twin-styles/glow/themes/default/default.theme | 19 + twin-styles/glow/themes/default/help.png | Bin 0 -> 120 bytes twin-styles/glow/themes/default/help_glow.png | Bin 0 -> 174 bytes twin-styles/glow/themes/default/iconify.png | Bin 0 -> 120 bytes twin-styles/glow/themes/default/iconify_glow.png | Bin 0 -> 177 bytes twin-styles/glow/themes/default/maximizeoff.png | Bin 0 -> 109 bytes .../glow/themes/default/maximizeoff_glow.png | Bin 0 -> 166 bytes twin-styles/glow/themes/default/maximizeon.png | Bin 0 -> 129 bytes .../glow/themes/default/maximizeon_glow.png | Bin 0 -> 186 bytes twin-styles/glow/themes/default/stickyoff.png | Bin 0 -> 103 bytes twin-styles/glow/themes/default/stickyoff_glow.png | Bin 0 -> 161 bytes twin-styles/glow/themes/default/stickyon.png | Bin 0 -> 115 bytes twin-styles/glow/themes/default/stickyon_glow.png | Bin 0 -> 173 bytes twin-styles/glow/themes/glass/CMakeLists.txt | 22 + twin-styles/glow/themes/glass/Makefile.am | 17 + twin-styles/glow/themes/glass/background.png | Bin 0 -> 794 bytes twin-styles/glow/themes/glass/close.png | Bin 0 -> 186 bytes twin-styles/glow/themes/glass/close_glow.png | Bin 0 -> 567 bytes twin-styles/glow/themes/glass/glass.theme | 19 + twin-styles/glow/themes/glass/help.png | Bin 0 -> 183 bytes twin-styles/glow/themes/glass/help_glow.png | Bin 0 -> 554 bytes twin-styles/glow/themes/glass/iconify.png | Bin 0 -> 190 bytes twin-styles/glow/themes/glass/iconify_glow.png | Bin 0 -> 575 bytes twin-styles/glow/themes/glass/maximizeoff.png | Bin 0 -> 169 bytes twin-styles/glow/themes/glass/maximizeoff_glow.png | Bin 0 -> 518 bytes twin-styles/glow/themes/glass/maximizeon.png | Bin 0 -> 188 bytes twin-styles/glow/themes/glass/maximizeon_glow.png | Bin 0 -> 541 bytes twin-styles/glow/themes/glass/stickyoff.png | Bin 0 -> 178 bytes twin-styles/glow/themes/glass/stickyoff_glow.png | Bin 0 -> 597 bytes twin-styles/glow/themes/glass/stickyon.png | Bin 0 -> 180 bytes twin-styles/glow/themes/glass/stickyon_glow.png | Bin 0 -> 564 bytes twin-styles/glow/themes/glass_huge/CMakeLists.txt | 22 + twin-styles/glow/themes/glass_huge/Makefile.am | 17 + twin-styles/glow/themes/glass_huge/background.png | Bin 0 -> 2094 bytes twin-styles/glow/themes/glass_huge/close.png | Bin 0 -> 207 bytes twin-styles/glow/themes/glass_huge/close_glow.png | Bin 0 -> 1386 bytes .../glow/themes/glass_huge/glass_huge.theme | 19 + twin-styles/glow/themes/glass_huge/help.png | Bin 0 -> 199 bytes twin-styles/glow/themes/glass_huge/help_glow.png | Bin 0 -> 1398 bytes twin-styles/glow/themes/glass_huge/iconify.png | Bin 0 -> 206 bytes .../glow/themes/glass_huge/iconify_glow.png | Bin 0 -> 1395 bytes twin-styles/glow/themes/glass_huge/maximizeoff.png | Bin 0 -> 187 bytes .../glow/themes/glass_huge/maximizeoff_glow.png | Bin 0 -> 1397 bytes twin-styles/glow/themes/glass_huge/maximizeon.png | Bin 0 -> 206 bytes .../glow/themes/glass_huge/maximizeon_glow.png | Bin 0 -> 1417 bytes twin-styles/glow/themes/glass_huge/stickyoff.png | Bin 0 -> 192 bytes .../glow/themes/glass_huge/stickyoff_glow.png | Bin 0 -> 1409 bytes twin-styles/glow/themes/glass_huge/stickyon.png | Bin 0 -> 194 bytes .../glow/themes/glass_huge/stickyon_glow.png | Bin 0 -> 1414 bytes twin-styles/glow/themes/glass_large/CMakeLists.txt | 22 + twin-styles/glow/themes/glass_large/Makefile.am | 17 + twin-styles/glow/themes/glass_large/background.png | Bin 0 -> 1217 bytes twin-styles/glow/themes/glass_large/close.png | Bin 0 -> 190 bytes twin-styles/glow/themes/glass_large/close_glow.png | Bin 0 -> 731 bytes .../glow/themes/glass_large/glass_large.theme | 19 + twin-styles/glow/themes/glass_large/help.png | Bin 0 -> 187 bytes twin-styles/glow/themes/glass_large/help_glow.png | Bin 0 -> 720 bytes twin-styles/glow/themes/glass_large/iconify.png | Bin 0 -> 194 bytes .../glow/themes/glass_large/iconify_glow.png | Bin 0 -> 723 bytes .../glow/themes/glass_large/maximizeoff.png | Bin 0 -> 174 bytes .../glow/themes/glass_large/maximizeoff_glow.png | Bin 0 -> 667 bytes twin-styles/glow/themes/glass_large/maximizeon.png | Bin 0 -> 195 bytes .../glow/themes/glass_large/maximizeon_glow.png | Bin 0 -> 700 bytes twin-styles/glow/themes/glass_large/stickyoff.png | Bin 0 -> 182 bytes .../glow/themes/glass_large/stickyoff_glow.png | Bin 0 -> 658 bytes twin-styles/glow/themes/glass_large/stickyon.png | Bin 0 -> 178 bytes .../glow/themes/glass_large/stickyon_glow.png | Bin 0 -> 674 bytes .../glow/themes/glass_verylarge/CMakeLists.txt | 22 + .../glow/themes/glass_verylarge/Makefile.am | 17 + .../glow/themes/glass_verylarge/background.png | Bin 0 -> 1520 bytes twin-styles/glow/themes/glass_verylarge/close.png | Bin 0 -> 197 bytes .../glow/themes/glass_verylarge/close_glow.png | Bin 0 -> 1048 bytes .../themes/glass_verylarge/glass_verylarge.theme | 19 + twin-styles/glow/themes/glass_verylarge/help.png | Bin 0 -> 190 bytes .../glow/themes/glass_verylarge/help_glow.png | Bin 0 -> 1070 bytes .../glow/themes/glass_verylarge/iconify.png | Bin 0 -> 201 bytes .../glow/themes/glass_verylarge/iconify_glow.png | Bin 0 -> 1063 bytes .../glow/themes/glass_verylarge/maximizeoff.png | Bin 0 -> 179 bytes .../themes/glass_verylarge/maximizeoff_glow.png | Bin 0 -> 1060 bytes .../glow/themes/glass_verylarge/maximizeon.png | Bin 0 -> 201 bytes .../themes/glass_verylarge/maximizeon_glow.png | Bin 0 -> 1073 bytes .../glow/themes/glass_verylarge/stickyoff.png | Bin 0 -> 185 bytes .../glow/themes/glass_verylarge/stickyoff_glow.png | Bin 0 -> 1059 bytes .../glow/themes/glass_verylarge/stickyon.png | Bin 0 -> 183 bytes .../glow/themes/glass_verylarge/stickyon_glow.png | Bin 0 -> 1045 bytes twin-styles/glow/themes/square/CMakeLists.txt | 22 + twin-styles/glow/themes/square/Makefile.am | 17 + twin-styles/glow/themes/square/background.png | Bin 0 -> 287 bytes twin-styles/glow/themes/square/close.png | Bin 0 -> 122 bytes twin-styles/glow/themes/square/close_glow.png | Bin 0 -> 164 bytes twin-styles/glow/themes/square/help.png | Bin 0 -> 120 bytes twin-styles/glow/themes/square/help_glow.png | Bin 0 -> 164 bytes twin-styles/glow/themes/square/iconify.png | Bin 0 -> 120 bytes twin-styles/glow/themes/square/iconify_glow.png | Bin 0 -> 164 bytes twin-styles/glow/themes/square/maximizeoff.png | Bin 0 -> 109 bytes .../glow/themes/square/maximizeoff_glow.png | Bin 0 -> 164 bytes twin-styles/glow/themes/square/maximizeon.png | Bin 0 -> 129 bytes twin-styles/glow/themes/square/maximizeon_glow.png | Bin 0 -> 164 bytes twin-styles/glow/themes/square/square.theme | 19 + twin-styles/glow/themes/square/stickyoff.png | Bin 0 -> 103 bytes twin-styles/glow/themes/square/stickyoff_glow.png | Bin 0 -> 164 bytes twin-styles/glow/themes/square/stickyon.png | Bin 0 -> 115 bytes twin-styles/glow/themes/square/stickyon_glow.png | Bin 0 -> 164 bytes twin-styles/icewm/CMakeLists.txt | 35 + twin-styles/icewm/Makefile.am | 21 + twin-styles/icewm/config/CMakeLists.txt | 28 + twin-styles/icewm/config/Makefile.am | 16 + twin-styles/icewm/config/config.cpp | 271 +++ twin-styles/icewm/config/config.h | 77 + twin-styles/icewm/icewm-themes/CMakeLists.txt | 21 + twin-styles/icewm/icewm-themes/Makefile.am | 12 + twin-styles/icewm/icewm-themes/closeA.xpm | 69 + twin-styles/icewm/icewm-themes/closeI.xpm | 69 + twin-styles/icewm/icewm-themes/default.theme | 48 + twin-styles/icewm/icewm-themes/depthA.xpm | 69 + twin-styles/icewm/icewm-themes/depthI.xpm | 69 + twin-styles/icewm/icewm-themes/maximizeA.xpm | 68 + twin-styles/icewm/icewm-themes/maximizeI.xpm | 68 + twin-styles/icewm/icewm-themes/menuButtonA.xpm | 68 + twin-styles/icewm/icewm-themes/menuButtonI.xpm | 68 + twin-styles/icewm/icewm-themes/minimizeA.xpm | 68 + twin-styles/icewm/icewm-themes/minimizeI.xpm | 68 + twin-styles/icewm/icewm-themes/restoreA.xpm | 68 + twin-styles/icewm/icewm-themes/restoreI.xpm | 68 + twin-styles/icewm/icewm-themes/rolldownA.xpm | 68 + twin-styles/icewm/icewm-themes/rolldownI.xpm | 68 + twin-styles/icewm/icewm-themes/rollupA.xpm | 68 + twin-styles/icewm/icewm-themes/rollupI.xpm | 68 + twin-styles/icewm/icewm-themes/titleAB.xpm | 32 + twin-styles/icewm/icewm-themes/titleAJ.xpm | 37 + twin-styles/icewm/icewm-themes/titleAM.xpm | 73 + twin-styles/icewm/icewm-themes/titleAP.xpm | 73 + twin-styles/icewm/icewm-themes/titleAQ.xpm | 37 + twin-styles/icewm/icewm-themes/titleAR.xpm | 37 + twin-styles/icewm/icewm-themes/titleAS.xpm | 32 + twin-styles/icewm/icewm-themes/titleAT.xpm | 38 + twin-styles/icewm/icewm-themes/titleIB.xpm | 32 + twin-styles/icewm/icewm-themes/titleIJ.xpm | 37 + twin-styles/icewm/icewm-themes/titleIM.xpm | 66 + twin-styles/icewm/icewm-themes/titleIP.xpm | 66 + twin-styles/icewm/icewm-themes/titleIQ.xpm | 37 + twin-styles/icewm/icewm-themes/titleIR.xpm | 37 + twin-styles/icewm/icewm-themes/titleIS.xpm | 32 + twin-styles/icewm/icewm-themes/titleIT.xpm | 38 + twin-styles/icewm/icewm.cpp | 1703 ++++++++++++++++++ twin-styles/icewm/icewm.desktop | 11 + twin-styles/icewm/icewm.h | 193 +++ twin-styles/kde1/CMakeLists.txt | 32 + twin-styles/kde1/Makefile.am | 16 + twin-styles/kde1/kde1.desktop | 7 + twin-styles/kde1/kde1client.cpp | 809 +++++++++ twin-styles/kde1/kde1client.h | 158 ++ twin-styles/kde1/kde1client_bitmaps.h | 149 ++ twin-styles/kstep/CMakeLists.txt | 32 + twin-styles/kstep/Makefile.am | 22 + twin-styles/kstep/kstep.desktop | 12 + twin-styles/kstep/nextclient.cpp | 987 +++++++++++ twin-styles/kstep/nextclient.h | 126 ++ twin-styles/openlook/CMakeLists.txt | 33 + twin-styles/openlook/Makefile.am | 16 + twin-styles/openlook/OpenLook.cpp | 728 ++++++++ twin-styles/openlook/OpenLook.h | 116 ++ twin-styles/openlook/openlook.desktop | 14 + twin-styles/riscos/AboveButton.cpp | 65 + twin-styles/riscos/AboveButton.h | 51 + twin-styles/riscos/Button.cpp | 153 ++ twin-styles/riscos/Button.h | 82 + twin-styles/riscos/CMakeLists.txt | 52 + twin-styles/riscos/CloseButton.cpp | 66 + twin-styles/riscos/CloseButton.h | 53 + twin-styles/riscos/HelpButton.cpp | 66 + twin-styles/riscos/HelpButton.h | 53 + twin-styles/riscos/IconifyButton.cpp | 66 + twin-styles/riscos/IconifyButton.h | 53 + twin-styles/riscos/LowerButton.cpp | 66 + twin-styles/riscos/LowerButton.h | 53 + twin-styles/riscos/Makefile.am | 39 + twin-styles/riscos/Manager.cpp | 767 +++++++++ twin-styles/riscos/Manager.h | 125 ++ twin-styles/riscos/MaximiseButton.cpp | 98 ++ twin-styles/riscos/MaximiseButton.h | 61 + twin-styles/riscos/Palette.h | 69 + twin-styles/riscos/README | 90 + twin-styles/riscos/Static.cpp | 540 ++++++ twin-styles/riscos/Static.h | 134 ++ twin-styles/riscos/StickyButton.cpp | 99 ++ twin-styles/riscos/StickyButton.h | 61 + twin-styles/riscos/riscos.desktop | 11 + twin-styles/smooth-blend/AUTHORS | 1 + twin-styles/smooth-blend/CMakeLists.txt | 12 + twin-styles/smooth-blend/COPYING | 340 ++++ twin-styles/smooth-blend/CREDITS | 5 + twin-styles/smooth-blend/ChangeLog | 22 + twin-styles/smooth-blend/INSTALL | 167 ++ twin-styles/smooth-blend/Makefile.am | 1 + twin-styles/smooth-blend/NEWS | 0 twin-styles/smooth-blend/README | 15 + twin-styles/smooth-blend/TODO | 4 + twin-styles/smooth-blend/client/CMakeLists.txt | 38 + twin-styles/smooth-blend/client/Makefile.am | 20 + twin-styles/smooth-blend/client/buttons.h | 1798 ++++++++++++++++++++ .../smooth-blend/client/config/CMakeLists.txt | 32 + twin-styles/smooth-blend/client/config/Makefile.am | 15 + .../smooth-blend/client/config/configdialog.ui | 421 +++++ .../client/config/smoothblendconfig.cc | 180 ++ .../smooth-blend/client/config/smoothblendconfig.h | 56 + twin-styles/smooth-blend/client/smoothblend.cc | 1396 +++++++++++++++ .../smooth-blend/client/smoothblend.desktop | 40 + twin-styles/smooth-blend/client/smoothblend.h | 256 +++ twin-styles/system/CMakeLists.txt | 32 + twin-styles/system/Makefile.am | 21 + twin-styles/system/system.desktop | 27 + twin-styles/system/systemclient.cpp | 737 ++++++++ twin-styles/system/systemclient.h | 113 ++ 246 files changed, 20132 insertions(+) create mode 100644 twin-styles/CMakeLists.txt create mode 100644 twin-styles/Makefile.am create mode 100644 twin-styles/cde/CMakeLists.txt create mode 100644 twin-styles/cde/Makefile.am create mode 100644 twin-styles/cde/cde.desktop create mode 100644 twin-styles/cde/cdeclient.cpp create mode 100644 twin-styles/cde/cdeclient.h create mode 100644 twin-styles/cde/config/CMakeLists.txt create mode 100644 twin-styles/cde/config/Makefile.am create mode 100644 twin-styles/cde/config/config.cpp create mode 100644 twin-styles/cde/config/config.h create mode 100644 twin-styles/configure.in.in create mode 100644 twin-styles/glow/CMakeLists.txt create mode 100644 twin-styles/glow/Makefile.am create mode 100644 twin-styles/glow/config/CMakeLists.txt create mode 100644 twin-styles/glow/config/Makefile.am create mode 100644 twin-styles/glow/config/bitmaps.h create mode 100644 twin-styles/glow/config/glowconfigdialog.cpp create mode 100644 twin-styles/glow/config/glowconfigdialog.h create mode 100644 twin-styles/glow/glow.desktop create mode 100644 twin-styles/glow/glowbutton.cpp create mode 100644 twin-styles/glow/glowbutton.h create mode 100644 twin-styles/glow/glowclient.cpp create mode 100644 twin-styles/glow/glowclient.h create mode 100644 twin-styles/glow/resources.h create mode 100644 twin-styles/glow/themes/CMakeLists.txt create mode 100644 twin-styles/glow/themes/Makefile.am create mode 100644 twin-styles/glow/themes/default/CMakeLists.txt create mode 100644 twin-styles/glow/themes/default/Makefile.am create mode 100644 twin-styles/glow/themes/default/background.png create mode 100644 twin-styles/glow/themes/default/close.png create mode 100644 twin-styles/glow/themes/default/close_glow.png create mode 100644 twin-styles/glow/themes/default/default.theme create mode 100644 twin-styles/glow/themes/default/help.png create mode 100644 twin-styles/glow/themes/default/help_glow.png create mode 100644 twin-styles/glow/themes/default/iconify.png create mode 100644 twin-styles/glow/themes/default/iconify_glow.png create mode 100644 twin-styles/glow/themes/default/maximizeoff.png create mode 100644 twin-styles/glow/themes/default/maximizeoff_glow.png create mode 100644 twin-styles/glow/themes/default/maximizeon.png create mode 100644 twin-styles/glow/themes/default/maximizeon_glow.png create mode 100644 twin-styles/glow/themes/default/stickyoff.png create mode 100644 twin-styles/glow/themes/default/stickyoff_glow.png create mode 100644 twin-styles/glow/themes/default/stickyon.png create mode 100644 twin-styles/glow/themes/default/stickyon_glow.png create mode 100644 twin-styles/glow/themes/glass/CMakeLists.txt create mode 100644 twin-styles/glow/themes/glass/Makefile.am create mode 100644 twin-styles/glow/themes/glass/background.png create mode 100644 twin-styles/glow/themes/glass/close.png create mode 100644 twin-styles/glow/themes/glass/close_glow.png create mode 100644 twin-styles/glow/themes/glass/glass.theme create mode 100644 twin-styles/glow/themes/glass/help.png create mode 100644 twin-styles/glow/themes/glass/help_glow.png create mode 100644 twin-styles/glow/themes/glass/iconify.png create mode 100644 twin-styles/glow/themes/glass/iconify_glow.png create mode 100644 twin-styles/glow/themes/glass/maximizeoff.png create mode 100644 twin-styles/glow/themes/glass/maximizeoff_glow.png create mode 100644 twin-styles/glow/themes/glass/maximizeon.png create mode 100644 twin-styles/glow/themes/glass/maximizeon_glow.png create mode 100644 twin-styles/glow/themes/glass/stickyoff.png create mode 100644 twin-styles/glow/themes/glass/stickyoff_glow.png create mode 100644 twin-styles/glow/themes/glass/stickyon.png create mode 100644 twin-styles/glow/themes/glass/stickyon_glow.png create mode 100644 twin-styles/glow/themes/glass_huge/CMakeLists.txt create mode 100644 twin-styles/glow/themes/glass_huge/Makefile.am create mode 100644 twin-styles/glow/themes/glass_huge/background.png create mode 100644 twin-styles/glow/themes/glass_huge/close.png create mode 100644 twin-styles/glow/themes/glass_huge/close_glow.png create mode 100644 twin-styles/glow/themes/glass_huge/glass_huge.theme create mode 100644 twin-styles/glow/themes/glass_huge/help.png create mode 100644 twin-styles/glow/themes/glass_huge/help_glow.png create mode 100644 twin-styles/glow/themes/glass_huge/iconify.png create mode 100644 twin-styles/glow/themes/glass_huge/iconify_glow.png create mode 100644 twin-styles/glow/themes/glass_huge/maximizeoff.png create mode 100644 twin-styles/glow/themes/glass_huge/maximizeoff_glow.png create mode 100644 twin-styles/glow/themes/glass_huge/maximizeon.png create mode 100644 twin-styles/glow/themes/glass_huge/maximizeon_glow.png create mode 100644 twin-styles/glow/themes/glass_huge/stickyoff.png create mode 100644 twin-styles/glow/themes/glass_huge/stickyoff_glow.png create mode 100644 twin-styles/glow/themes/glass_huge/stickyon.png create mode 100644 twin-styles/glow/themes/glass_huge/stickyon_glow.png create mode 100644 twin-styles/glow/themes/glass_large/CMakeLists.txt create mode 100644 twin-styles/glow/themes/glass_large/Makefile.am create mode 100644 twin-styles/glow/themes/glass_large/background.png create mode 100644 twin-styles/glow/themes/glass_large/close.png create mode 100644 twin-styles/glow/themes/glass_large/close_glow.png create mode 100644 twin-styles/glow/themes/glass_large/glass_large.theme create mode 100644 twin-styles/glow/themes/glass_large/help.png create mode 100644 twin-styles/glow/themes/glass_large/help_glow.png create mode 100644 twin-styles/glow/themes/glass_large/iconify.png create mode 100644 twin-styles/glow/themes/glass_large/iconify_glow.png create mode 100644 twin-styles/glow/themes/glass_large/maximizeoff.png create mode 100644 twin-styles/glow/themes/glass_large/maximizeoff_glow.png create mode 100644 twin-styles/glow/themes/glass_large/maximizeon.png create mode 100644 twin-styles/glow/themes/glass_large/maximizeon_glow.png create mode 100644 twin-styles/glow/themes/glass_large/stickyoff.png create mode 100644 twin-styles/glow/themes/glass_large/stickyoff_glow.png create mode 100644 twin-styles/glow/themes/glass_large/stickyon.png create mode 100644 twin-styles/glow/themes/glass_large/stickyon_glow.png create mode 100644 twin-styles/glow/themes/glass_verylarge/CMakeLists.txt create mode 100644 twin-styles/glow/themes/glass_verylarge/Makefile.am create mode 100644 twin-styles/glow/themes/glass_verylarge/background.png create mode 100644 twin-styles/glow/themes/glass_verylarge/close.png create mode 100644 twin-styles/glow/themes/glass_verylarge/close_glow.png create mode 100644 twin-styles/glow/themes/glass_verylarge/glass_verylarge.theme create mode 100644 twin-styles/glow/themes/glass_verylarge/help.png create mode 100644 twin-styles/glow/themes/glass_verylarge/help_glow.png create mode 100644 twin-styles/glow/themes/glass_verylarge/iconify.png create mode 100644 twin-styles/glow/themes/glass_verylarge/iconify_glow.png create mode 100644 twin-styles/glow/themes/glass_verylarge/maximizeoff.png create mode 100644 twin-styles/glow/themes/glass_verylarge/maximizeoff_glow.png create mode 100644 twin-styles/glow/themes/glass_verylarge/maximizeon.png create mode 100644 twin-styles/glow/themes/glass_verylarge/maximizeon_glow.png create mode 100644 twin-styles/glow/themes/glass_verylarge/stickyoff.png create mode 100644 twin-styles/glow/themes/glass_verylarge/stickyoff_glow.png create mode 100644 twin-styles/glow/themes/glass_verylarge/stickyon.png create mode 100644 twin-styles/glow/themes/glass_verylarge/stickyon_glow.png create mode 100644 twin-styles/glow/themes/square/CMakeLists.txt create mode 100644 twin-styles/glow/themes/square/Makefile.am create mode 100644 twin-styles/glow/themes/square/background.png create mode 100644 twin-styles/glow/themes/square/close.png create mode 100644 twin-styles/glow/themes/square/close_glow.png create mode 100644 twin-styles/glow/themes/square/help.png create mode 100644 twin-styles/glow/themes/square/help_glow.png create mode 100644 twin-styles/glow/themes/square/iconify.png create mode 100644 twin-styles/glow/themes/square/iconify_glow.png create mode 100644 twin-styles/glow/themes/square/maximizeoff.png create mode 100644 twin-styles/glow/themes/square/maximizeoff_glow.png create mode 100644 twin-styles/glow/themes/square/maximizeon.png create mode 100644 twin-styles/glow/themes/square/maximizeon_glow.png create mode 100644 twin-styles/glow/themes/square/square.theme create mode 100644 twin-styles/glow/themes/square/stickyoff.png create mode 100644 twin-styles/glow/themes/square/stickyoff_glow.png create mode 100644 twin-styles/glow/themes/square/stickyon.png create mode 100644 twin-styles/glow/themes/square/stickyon_glow.png create mode 100644 twin-styles/icewm/CMakeLists.txt create mode 100644 twin-styles/icewm/Makefile.am create mode 100644 twin-styles/icewm/config/CMakeLists.txt create mode 100644 twin-styles/icewm/config/Makefile.am create mode 100644 twin-styles/icewm/config/config.cpp create mode 100644 twin-styles/icewm/config/config.h create mode 100644 twin-styles/icewm/icewm-themes/CMakeLists.txt create mode 100644 twin-styles/icewm/icewm-themes/Makefile.am create mode 100644 twin-styles/icewm/icewm-themes/closeA.xpm create mode 100644 twin-styles/icewm/icewm-themes/closeI.xpm create mode 100644 twin-styles/icewm/icewm-themes/default.theme create mode 100644 twin-styles/icewm/icewm-themes/depthA.xpm create mode 100644 twin-styles/icewm/icewm-themes/depthI.xpm create mode 100644 twin-styles/icewm/icewm-themes/maximizeA.xpm create mode 100644 twin-styles/icewm/icewm-themes/maximizeI.xpm create mode 100644 twin-styles/icewm/icewm-themes/menuButtonA.xpm create mode 100644 twin-styles/icewm/icewm-themes/menuButtonI.xpm create mode 100644 twin-styles/icewm/icewm-themes/minimizeA.xpm create mode 100644 twin-styles/icewm/icewm-themes/minimizeI.xpm create mode 100644 twin-styles/icewm/icewm-themes/restoreA.xpm create mode 100644 twin-styles/icewm/icewm-themes/restoreI.xpm create mode 100644 twin-styles/icewm/icewm-themes/rolldownA.xpm create mode 100644 twin-styles/icewm/icewm-themes/rolldownI.xpm create mode 100644 twin-styles/icewm/icewm-themes/rollupA.xpm create mode 100644 twin-styles/icewm/icewm-themes/rollupI.xpm create mode 100644 twin-styles/icewm/icewm-themes/titleAB.xpm create mode 100644 twin-styles/icewm/icewm-themes/titleAJ.xpm create mode 100644 twin-styles/icewm/icewm-themes/titleAM.xpm create mode 100644 twin-styles/icewm/icewm-themes/titleAP.xpm create mode 100644 twin-styles/icewm/icewm-themes/titleAQ.xpm create mode 100644 twin-styles/icewm/icewm-themes/titleAR.xpm create mode 100644 twin-styles/icewm/icewm-themes/titleAS.xpm create mode 100644 twin-styles/icewm/icewm-themes/titleAT.xpm create mode 100644 twin-styles/icewm/icewm-themes/titleIB.xpm create mode 100644 twin-styles/icewm/icewm-themes/titleIJ.xpm create mode 100644 twin-styles/icewm/icewm-themes/titleIM.xpm create mode 100644 twin-styles/icewm/icewm-themes/titleIP.xpm create mode 100644 twin-styles/icewm/icewm-themes/titleIQ.xpm create mode 100644 twin-styles/icewm/icewm-themes/titleIR.xpm create mode 100644 twin-styles/icewm/icewm-themes/titleIS.xpm create mode 100644 twin-styles/icewm/icewm-themes/titleIT.xpm create mode 100644 twin-styles/icewm/icewm.cpp create mode 100644 twin-styles/icewm/icewm.desktop create mode 100644 twin-styles/icewm/icewm.h create mode 100644 twin-styles/kde1/CMakeLists.txt create mode 100644 twin-styles/kde1/Makefile.am create mode 100644 twin-styles/kde1/kde1.desktop create mode 100644 twin-styles/kde1/kde1client.cpp create mode 100644 twin-styles/kde1/kde1client.h create mode 100644 twin-styles/kde1/kde1client_bitmaps.h create mode 100644 twin-styles/kstep/CMakeLists.txt create mode 100644 twin-styles/kstep/Makefile.am create mode 100644 twin-styles/kstep/kstep.desktop create mode 100644 twin-styles/kstep/nextclient.cpp create mode 100644 twin-styles/kstep/nextclient.h create mode 100644 twin-styles/openlook/CMakeLists.txt create mode 100644 twin-styles/openlook/Makefile.am create mode 100644 twin-styles/openlook/OpenLook.cpp create mode 100644 twin-styles/openlook/OpenLook.h create mode 100644 twin-styles/openlook/openlook.desktop create mode 100644 twin-styles/riscos/AboveButton.cpp create mode 100644 twin-styles/riscos/AboveButton.h create mode 100644 twin-styles/riscos/Button.cpp create mode 100644 twin-styles/riscos/Button.h create mode 100644 twin-styles/riscos/CMakeLists.txt create mode 100644 twin-styles/riscos/CloseButton.cpp create mode 100644 twin-styles/riscos/CloseButton.h create mode 100644 twin-styles/riscos/HelpButton.cpp create mode 100644 twin-styles/riscos/HelpButton.h create mode 100644 twin-styles/riscos/IconifyButton.cpp create mode 100644 twin-styles/riscos/IconifyButton.h create mode 100644 twin-styles/riscos/LowerButton.cpp create mode 100644 twin-styles/riscos/LowerButton.h create mode 100644 twin-styles/riscos/Makefile.am create mode 100644 twin-styles/riscos/Manager.cpp create mode 100644 twin-styles/riscos/Manager.h create mode 100644 twin-styles/riscos/MaximiseButton.cpp create mode 100644 twin-styles/riscos/MaximiseButton.h create mode 100644 twin-styles/riscos/Palette.h create mode 100644 twin-styles/riscos/README create mode 100644 twin-styles/riscos/Static.cpp create mode 100644 twin-styles/riscos/Static.h create mode 100644 twin-styles/riscos/StickyButton.cpp create mode 100644 twin-styles/riscos/StickyButton.h create mode 100644 twin-styles/riscos/riscos.desktop create mode 100644 twin-styles/smooth-blend/AUTHORS create mode 100644 twin-styles/smooth-blend/CMakeLists.txt create mode 100644 twin-styles/smooth-blend/COPYING create mode 100644 twin-styles/smooth-blend/CREDITS create mode 100644 twin-styles/smooth-blend/ChangeLog create mode 100644 twin-styles/smooth-blend/INSTALL create mode 100644 twin-styles/smooth-blend/Makefile.am create mode 100644 twin-styles/smooth-blend/NEWS create mode 100644 twin-styles/smooth-blend/README create mode 100644 twin-styles/smooth-blend/TODO create mode 100644 twin-styles/smooth-blend/client/CMakeLists.txt create mode 100644 twin-styles/smooth-blend/client/Makefile.am create mode 100644 twin-styles/smooth-blend/client/buttons.h create mode 100644 twin-styles/smooth-blend/client/config/CMakeLists.txt create mode 100644 twin-styles/smooth-blend/client/config/Makefile.am create mode 100644 twin-styles/smooth-blend/client/config/configdialog.ui create mode 100644 twin-styles/smooth-blend/client/config/smoothblendconfig.cc create mode 100644 twin-styles/smooth-blend/client/config/smoothblendconfig.h create mode 100644 twin-styles/smooth-blend/client/smoothblend.cc create mode 100644 twin-styles/smooth-blend/client/smoothblend.desktop create mode 100644 twin-styles/smooth-blend/client/smoothblend.h create mode 100644 twin-styles/system/CMakeLists.txt create mode 100644 twin-styles/system/Makefile.am create mode 100644 twin-styles/system/system.desktop create mode 100644 twin-styles/system/systemclient.cpp create mode 100644 twin-styles/system/systemclient.h (limited to 'twin-styles') diff --git a/twin-styles/CMakeLists.txt b/twin-styles/CMakeLists.txt new file mode 100644 index 00000000..255bbf18 --- /dev/null +++ b/twin-styles/CMakeLists.txt @@ -0,0 +1,22 @@ +################################################# +# +# (C) 2011 Golubev Alexander +# fatzer2 (AT) gmail.com +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +include( "${TDE_CMAKE_DIR}/twin.cmake" ) + +add_subdirectory( cde ) +add_subdirectory( glow ) +add_subdirectory( icewm ) +add_subdirectory( kde1 ) +add_subdirectory( kstep ) +add_subdirectory( openlook ) +add_subdirectory( riscos ) +add_subdirectory( smooth-blend ) +add_subdirectory( system ) diff --git a/twin-styles/Makefile.am b/twin-styles/Makefile.am new file mode 100644 index 00000000..76abee7d --- /dev/null +++ b/twin-styles/Makefile.am @@ -0,0 +1,4 @@ +SUBDIRS = kstep glow cde icewm openlook kde1 system riscos smooth-blend + +messages: + $(XGETTEXT) `find . -name \*.cpp` -o $(podir)/twin_art_clients.pot diff --git a/twin-styles/cde/CMakeLists.txt b/twin-styles/cde/CMakeLists.txt new file mode 100644 index 00000000..790ff84c --- /dev/null +++ b/twin-styles/cde/CMakeLists.txt @@ -0,0 +1,34 @@ +################################################# +# +# (C) 2011 Golubev Alexander +# fatzer2 (AT) gmail.com +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +add_subdirectory( config ) + +include_directories( + ${CMAKE_CURRENT_BINARY_DIR} + ${TDE_INCLUDE_DIR} + ${TQT_INCLUDE_DIRS} +) + +link_directories( + ${TQT_LIBRARY_DIRS} +) + +##### other data ################################ + +install( FILES cde.desktop DESTINATION ${DATA_INSTALL_DIR}/twin ) + +##### twin3_cde ################################## + +tde_add_kpart( twin3_cde AUTOMOC + SOURCES cdeclient.cpp + LINK tdecorations-shared + DESTINATION ${PLUGIN_INSTALL_DIR} +) diff --git a/twin-styles/cde/Makefile.am b/twin-styles/cde/Makefile.am new file mode 100644 index 00000000..129a22bc --- /dev/null +++ b/twin-styles/cde/Makefile.am @@ -0,0 +1,22 @@ + +INCLUDES = $(all_includes) + +SUBDIRS = . config + +kde_module_LTLIBRARIES = twin3_cde.la + +twin3_cde_la_SOURCES = cdeclient.cpp +twin3_cde_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module $(LIB_QT) $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx +twin3_cde_la_LIBADD = -ltdecorations + +METASOURCES = AUTO +noinst_HEADERS = cdeclient.h + +lnkdir = $(kde_datadir)/twin/ +lnk_DATA = cde.desktop + +EXTRA_DIST = $(lnk_DATA) + +###KMAKE-start (don't edit or delete this block) + +###KMAKE-end diff --git a/twin-styles/cde/cde.desktop b/twin-styles/cde/cde.desktop new file mode 100644 index 00000000..a5f1ac66 --- /dev/null +++ b/twin-styles/cde/cde.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Name=CDE +Name[af]=Cde +Name[hi]=सीडीई +Name[ne]=सीडीई +X-KDE-Library=twin3_cde diff --git a/twin-styles/cde/cdeclient.cpp b/twin-styles/cde/cdeclient.cpp new file mode 100644 index 00000000..03eb14fa --- /dev/null +++ b/twin-styles/cde/cdeclient.cpp @@ -0,0 +1,863 @@ +/* + * $Id$ + * + * CDE KWin client - emulates the look and feel + * of dtwm, the CDE window manager. + * + * Copyright (c) 2000-2001, 2002 + * Chris Lee + * Lennart Kudling + * Fredrik H�glund + * + * Copyright (c) 2003,2004 + * Luciano Montanaro + * + * Originally based on the KStep client. + * + * Distributed under the terms of the BSD license. + */ + +#include "cdeclient.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern "C" KDE_EXPORT KDecorationFactory* create_factory() +{ + return new CDE::CdeClientFactory(); +} + +namespace CDE { + +static int s_frameWidth = 5; +static int s_buttonSize = 19; +static bool titlebarButtonMode = true; +static bool coloredFrame = true; +static TQt::AlignmentFlags textAlignment = TQt::AlignHCenter; + +// Precomputed border sizes for accessibility +// The sizes are applied for tiny -> normal -> large -> very large -> huge -> +// very huge -> oversized +static const int borderSizes[] = { 4, 6, 9, 12, 18, 26, 42 }; + +// Parameters needed to draw the widgets (offsets from the border) +static int s_o1 = 4; +static int s_o2 = 7; +static int s_w1 = 11; +static int s_w2 = 5; + +// These are the line segments for the X on the close button + +static const int NUM_CLOSEL_COORDS = 2 * 14; +static const TQCOORD closeLLinesTemplate[NUM_CLOSEL_COORDS] = + { 14,3, 12,3, 12,3, 9,6, 5,3, 3,3, 3,3, 3,5, + 3,5, 6,8, 6,9, 3,12, 3,12, 3,14 }; + +static const int NUM_CLOSED_COORDS = 2 * 18; +static const TQCOORD closeDLinesTemplate[NUM_CLOSED_COORDS] = + { 5,3, 8,6, 14,4, 14,5, 14,5, 11,8, 11,9, 14,12, 14,12, 14,14, + 14,14, 12,14, 12,14, 9,11, 8,11, 5,14, 5,14, 4,14 }; + +static TQCOORD closeLLines[NUM_CLOSEL_COORDS]; + +static TQCOORD closeDLines[NUM_CLOSED_COORDS]; + +// These are the line segments for the ? on the help button +static const int NUM_HELPL_COORDS = 2 * 16; +static const TQCOORD helpLLinesTemplate[NUM_HELPL_COORDS] = + { 4,6, 4,5, 4,5, 6,3, 6,3, 9,3, 10,3, 11,4, + 9,7, 7,9, 7,9, 7,10, 7,14, 7,13, 8,12, 9,12 }; + +static const int NUM_HELPD_COORDS = 2 * 14; +static const TQCOORD helpDLinesTemplate[NUM_HELPD_COORDS] = + { 5,7, 8,6, 12,5, 12,8, 12,8, 10,10, 10,10, 10,11, + 10,11, 8,11, 10,14, 10,13, 9,15, 8,15 }; + +static TQCOORD helpLLines[NUM_HELPL_COORDS]; + +static TQCOORD helpDLines[NUM_HELPD_COORDS]; + + +// This question mark is taller than the one above and +// is positioned one pixel higher on the button +/* +static const TQCOORD helpLLines[] = + { 4,5, 4,4, 4,4, 6,2, 6,2, 9,2, 10,2, 11,3, + 9,6, 7,8, 7,9, 7,10, 7,13, 8,12, 8,12, 9,12 }; + +static const TQCOORD helpDLines[] = + { 5,6, 8,5, 12,4, 12,7, 12,7, 10,9, 10,10, 10,11, + 10,11, 8,11, 10,13, 9,14, 9,14, 8,14 }; +*/ +// Same as the one above but with a larger dot under +// the question mark +/* +static const TQCOORD helpLLines[] = + { 4,5, 4,4, 4,4, 6,2, 6,2, 9,2, 10,2, 11,3, + 9,6, 7,8, 7,9, 7,10, 7,14, 7,13, 8,12, 9,12 }; + +static const TQCOORD helpDLines[] = + { 5,6, 8,5, 12,4, 12,7, 12,7, 10,9, 10,10, 10,11, + 10,11, 8,11, 10,13, 10,14, 9,15, 8,15 }; +*/ + +static inline const KDecorationOptions* options() +{ + return KDecoration::options(); +} + +static void fixColorGroup(TQColorGroup & tqcolorGroup) +{ + TQColor light = tqcolorGroup.light(); + + int hue, saturation, value; + + light.hsv(&hue, &saturation, &value); + + if (value < 128) + { + light.setHsv(hue, saturation, 128); + tqcolorGroup.setColor(TQColorGroup::Light, light); + } + + TQColor dark = tqcolorGroup.dark(); + + dark.hsv(&hue, &saturation, &value); + + if (value < 84) + { + dark.setHsv(hue, saturation, 84); + tqcolorGroup.setColor(TQColorGroup::Dark, dark); + } +} + +// scaling helper function used to scale the close 'X' glyph + +static int scaleCoord(int c) +{ + if (c < 6) return c; + if (c <= 11) return c + (s_buttonSize - 19) / 2; + return c + s_buttonSize - 19; +} + +static void readConfig(CdeClientFactory *f) +{ + KConfig conf( "twincderc" ); + + conf.setGroup("General"); + coloredFrame = conf.readBoolEntry( "UseTitleBarBorderColors", true ); + titlebarButtonMode = conf.readBoolEntry( "TitlebarButtonMode", true ); + + TQString value = conf.readEntry( "TextAlignment", "AlignHCenter" ); + if ( value == "AlignLeft" ) + textAlignment = TQt::AlignLeft; + else if ( value == "AlignHCenter" ) + textAlignment = TQt::AlignHCenter; + else if ( value == "AlignRight" ) + textAlignment = TQt::AlignRight; + + + // find preferred border size + int i = options()->preferredBorderSize(f); + if (i >= 0 && i <= 6) s_frameWidth = borderSizes[i]; + + // Do not allow malicious users or corrupt config files to + // go past the domain of the valid border sizes. + + // Size limit increased for accessability. LM + if (s_frameWidth < 0) s_frameWidth = 0; + if (s_frameWidth > 30) s_frameWidth = 30; + + // Force button size to be in a reasonable range. + // If the frame width is large, the button size must be large too. + s_buttonSize = TQFontMetrics(options()->font( true )).height() + 2; + if (s_buttonSize < 19) s_buttonSize = 19; + if (s_buttonSize < s_frameWidth) s_buttonSize = s_frameWidth; + s_buttonSize |= 1; // Be sure the button size is odd. + + // Calculate widths and offsets for the button icons + s_o1 = s_buttonSize * 4 / 19; + s_o2 = s_buttonSize * 7 / 19; + s_w1 = s_buttonSize - 2 * s_o1; + s_w2 = s_buttonSize - 2 * s_o2; + + // Copy and scale the close icon + int offset = (s_buttonSize - 19) / 2; + for (int i = 0; i < NUM_CLOSEL_COORDS; i++) { + closeLLines[i] = scaleCoord(closeLLinesTemplate[i]); + } + for (int i = 0; i < NUM_CLOSED_COORDS; i++) { + closeDLines[i] = scaleCoord(closeDLinesTemplate[i]); + } + // Copy and center the help icon + for (int i = 0; i < NUM_HELPL_COORDS; i++) { + helpLLines[i] = helpLLinesTemplate[i] + offset; + } + for (int i = 0; i < NUM_HELPD_COORDS; i++) { + helpDLines[i] = helpDLinesTemplate[i] + offset; + } +} + +// --------------------------------------- + +CdeClientFactory::CdeClientFactory() +{ + CDE::readConfig(this); +} + +CdeClientFactory::~CdeClientFactory() +{ +} + +KDecoration *CdeClientFactory::createDecoration(KDecorationBridge *b) +{ + return new CdeClient(b, this); +} + +bool CdeClientFactory::reset(unsigned long /*changed*/) +{ + // TODO Do not recreate decorations if it is not needed. Look at + // ModernSystem for how to do that + // For now just return true. + CDE::readConfig(this); + return true; +} + +bool CdeClientFactory::supports( Ability ability ) +{ + switch( ability ) + { + case AbilityAnnounceButtons: + case AbilityButtonMenu: + case AbilityButtonOnAllDesktops: + case AbilityButtonHelp: + case AbilityButtonMinimize: + case AbilityButtonMaximize: + case AbilityButtonClose: + return true; + default: + return false; + }; +} + +TQValueList< CdeClientFactory::BorderSize > +CdeClientFactory::borderSizes() const +{ + // the list must be sorted + return TQValueList< BorderSize >() << BorderTiny << BorderNormal << + BorderLarge << BorderVeryLarge << BorderHuge << + BorderVeryHuge << BorderOversized; +} + +// --------------------------------------- + +CdeClient::CdeClient(KDecorationBridge *b, KDecorationFactory *f) + : KDecoration(b, f) +{ +} + +void CdeClient::init() +{ + createMainWidget(WStaticContents | WResizeNoErase | WRepaintNoErase); + widget()->installEventFilter(this); + + widget()->setBackgroundMode(NoBackground); + + mainLayout = new TQVBoxLayout(widget()); + TQBoxLayout* windowLayout = new TQBoxLayout(0, TQBoxLayout::LeftToRight, 0, 0, 0); + titleLayout = new TQBoxLayout(0, TQBoxLayout::LeftToRight, 0, 0, 0); + + // TODO Check if this stuff can be simplified. + // Border sizes are from a fixed set now. + if ( s_frameWidth > 1 ) + { + // the style normally draws a black frame around the window, so we + // need 1 line of space for that in addition to the normal window frame + mainLayout->setMargin( s_frameWidth+1 ); + } + else + { + // but if the frame is set to just 1 pixel we just draw the black frame + // instead of the normal window frame, so no extra space is needed. if + // its 0 we don't draw anything. + mainLayout->setMargin( s_frameWidth ); + } + + mainLayout->addLayout( titleLayout ); + mainLayout->addLayout( windowLayout, 1 ); + + if (isPreview()) + windowLayout->addWidget(new TQLabel(i18n( + "
CDE preview
"), widget()), 1); + else + windowLayout->addItem( new TQSpacerItem( 0, 0 )); + + for ( int i=0; i < BtnCount; i++ ) + button[i] = NULL; + + addClientButtons( options()->titleButtonsLeft() ); + + titlebar = new TQSpacerItem( 10, 16, TQSizePolicy::Expanding, TQSizePolicy::Minimum ); + titleLayout->addItem( titlebar ); + + addClientButtons( options()->titleButtonsRight() ); + + titlebarPressed = false; + closing = false; +} + +void CdeClient::addClientButtons( const TQString& s ) +{ + if ( s.length() > 0 ) + for ( unsigned int i = 0; i < s.length(); i++ ) + { + switch( s[i].latin1() ) + { + // Menu button + case 'M': + if ( ! button[BtnMenu] ) + { + button[BtnMenu] = new CdeButton( this, "menu", BtnMenu, i18n("Menu"), Qt::LeftButton|Qt::RightButton ); + connect( button[BtnMenu], TQT_SIGNAL(pressed()), TQT_SLOT(menuButtonPressed()) ); + connect( button[BtnMenu], TQT_SIGNAL(released()), TQT_SLOT(menuButtonReleased()) ); + titleLayout->addWidget( button[BtnMenu] ); + } + break; + + //Help button + case 'H': + if ( providesContextHelp() && (! button[BtnHelp] ) ) + { + button[BtnHelp] = new CdeButton( this, "help", BtnHelp, i18n("Help") ); + connect(button[BtnHelp], + TQT_SIGNAL(clicked()), TQT_SLOT(showContextHelp())); + titleLayout->addWidget( button[BtnHelp] ); + } + break; + + //Minimize button + case 'I': + if ( (! button[BtnIconify] ) && isMinimizable() ) + { + button[BtnIconify] = new CdeButton( this, "iconify", BtnIconify, i18n("Minimize") ); + connect(button[BtnIconify], + TQT_SIGNAL(clicked()), TQT_SLOT(minimize())); + titleLayout->addWidget( button[BtnIconify] ); + } + break; + + // Maximize button + case 'A': + if ( (! button[BtnMax] ) && isMaximizable() ) + { + button[BtnMax] = new CdeButton(this, "maximize", BtnMax, i18n("Maximize"), Qt::LeftButton|Qt::MidButton|Qt::RightButton); + connect(button[BtnMax], TQT_SIGNAL(clicked()), + TQT_SLOT(maximizeButtonClicked())); + titleLayout->addWidget( button[BtnMax] ); + } + break; + + // Close button + case 'X': + if ( !button[BtnClose] && isCloseable()) + { + button[BtnClose] = new CdeButton(this, "close", BtnClose, i18n("Close")); + connect( button[BtnClose], TQT_SIGNAL( clicked()), TQT_SLOT(closeWindow()) ); + titleLayout->addWidget( button[BtnClose] ); + } + // Add onAlldesktops button and spacers + } + } + +} + +void CdeClient::captionChange() +{ + widget()->tqrepaint(titlebar->tqgeometry(), false); +} + +void CdeClient::activeChange() +{ + for ( int i=0; i < BtnCount; i++ ) + if ( button[i] ) button[i]->reset(); + + widget()->tqrepaint(false); +} + +void CdeClient::maximizeChange() +{ + if ( button[BtnMax] ) { + bool m = maximizeMode() == MaximizeFull; + TQToolTip::remove(button[BtnMax]); + TQToolTip::add(button[BtnMax], m ? i18n("Restore") : i18n("Maximize")); + button[BtnMax]->tqrepaint(); + } +} + +void CdeClient::iconChange() +{ +} + +void CdeClient::shadeChange() +{ +} + +void CdeClient::showEvent(TQShowEvent *) +{ + widget()->tqrepaint(); +} + +void CdeClient::desktopChange() +{ + // Nothing to do yet +} + +TQSize CdeClient::tqminimumSize() const +{ + return TQSize(2 * (s_buttonSize + s_frameWidth), + 2 * s_frameWidth + s_buttonSize); +} + +void CdeClient::resize(const TQSize& s) +{ + widget()->resize(s); +} + +void CdeClient::maximizeButtonClicked() +{ + if (button[BtnMax]) { + maximize(button[BtnMax]->lastButton()); + } +} + +void CdeClient::menuButtonPressed() +{ + static TQTime* t = NULL; + static CdeClient* lastClient = NULL; + if( t == NULL ) + t = new TQTime; + bool dbl = ( lastClient == this && t->elapsed() <= TQApplication::doubleClickInterval()); + lastClient = this; + t->start(); + if( !dbl ) + { + TQRect menuRect = button[BtnMenu]->rect(); + TQPoint menuTop = button[BtnMenu]->mapToGlobal(menuRect.topLeft()); + TQPoint menuBottom = + button[BtnMenu]->mapToGlobal(menuRect.bottomRight()); + KDecorationFactory* f = factory(); + showWindowMenu(TQRect(menuTop, menuBottom)); + if( !f->exists( this )) // 'this' was deleted + return; + button[BtnMenu]->setDown(false); + } + else + closing = true; +} + +void CdeClient::menuButtonReleased() +{ + if( closing ) + closeWindow(); +} + +void CdeClient::resizeEvent( TQResizeEvent* e) +{ + if (widget()->isVisibleToTLW()) { + widget()->update(); + int dx = 0; + int dy = 0; + + if ( e->oldSize().width() != 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()))); + + // Titlebar needs no paint event + TQApplication::postEvent( this, new TQPaintEvent( titlebar->tqgeometry(), false ) ); + } + } +} + +void CdeClient::paintEvent( TQPaintEvent* ) +{ + TQPainter p(widget()); + + TQColorGroup tqcolorGroup; + + if ( coloredFrame ) + tqcolorGroup = options()->tqcolorGroup( KDecoration::ColorTitleBar, isActive() ); + else + tqcolorGroup = options()->tqcolorGroup( KDecoration::ColorFrame, isActive() ); + + fixColorGroup( tqcolorGroup ); + + TQRect trect = titlebar->tqgeometry(); + TQRect mrect = widget()->rect(); + + if ( s_frameWidth > 0 ) + { + // draw black frame: + p.setPen( TQt::black ); + p.drawRect( mrect ); + } + + p.setPen( TQt::NoPen ); + p.setBrush( tqcolorGroup.background() ); + + + if ( s_frameWidth > 1 ) + { + bool shaded = isShade(); + int longSide = s_frameWidth + s_buttonSize; + + // draw frame-background: + p.drawRect( 1, 1, + mrect.width() - 2, s_frameWidth ); + p.drawRect( 1, mrect.height() - s_frameWidth - 1, + mrect.width() - 2, s_frameWidth ); + p.drawRect( 1, s_frameWidth + 1, + s_frameWidth, mrect.height() - 2*s_frameWidth - 2 ); + p.drawRect( mrect.width() - s_frameWidth - 1, s_frameWidth + 1, + s_frameWidth, mrect.height() - 2*s_frameWidth - 2 ); + + if ( ! shaded ) + { + // draw left and right frames: + qDrawShadePanel( &p, 1, longSide + 1, + s_frameWidth, mrect.height() - 2 * (longSide + 1), + tqcolorGroup ); + + qDrawShadePanel( &p, mrect.width() - s_frameWidth - 1, longSide + 1, + s_frameWidth, mrect.height() - 2 * (longSide + 1), + tqcolorGroup ); + } + + // draw top and bottom frames: + qDrawShadePanel( &p, longSide + 1, 1, + mrect.width() - 2 * (longSide + 1), s_frameWidth, + tqcolorGroup ); + + qDrawShadePanel( &p, longSide + 1, mrect.height() - s_frameWidth - 1, + mrect.width() - 2 * (longSide + 1), s_frameWidth, + tqcolorGroup ); + + // draw light corner parts: + p.setPen( tqcolorGroup.light() ); + + // tl corner: + p.drawLine( 1, 1, longSide - 1, 1 ); + p.drawLine( 1, 1, 1, longSide - 1 ); + + // tr corner: + p.drawLine( mrect.width() - 3, 1, mrect.width() - longSide - 1, 1 ); + p.drawLine( mrect.width() - longSide - 1, 1, + mrect.width() - longSide - 1, s_frameWidth - 1 ); + p.drawLine( mrect.width() - s_frameWidth - 1, s_frameWidth, + mrect.width() - s_frameWidth - 1, longSide - 1 ); + + // br corner: + if ( !shaded ) + { + p.drawLine( mrect.width() - 3, mrect.height() - longSide - 1, + mrect.width() - s_frameWidth - 1, mrect.height() - longSide - 1 ); + } + p.drawLine( mrect.width() - s_frameWidth - 1, mrect.height() - longSide, + mrect.width() - s_frameWidth - 1, mrect.height() - s_frameWidth - 1 ); + p.drawLine( mrect.width() - s_frameWidth - 2, mrect.height() - s_frameWidth - 1, + mrect.width() - longSide - 1, mrect.height() - s_frameWidth - 1 ); + p.drawLine( mrect.width() - longSide - 1, mrect.height() - s_frameWidth, + mrect.width() - longSide - 1, mrect.height() - 2 ); + + // bl corner: + if ( !shaded ) + { + p.drawLine( s_frameWidth-1, mrect.height() - longSide - 1, + 2, mrect.height() - longSide - 1 ); + } + p.drawLine( 1, mrect.height() - longSide - 1, + 1, mrect.height() - 3 ); + p.drawLine( longSide - 1, mrect.height() - s_frameWidth - 1, + s_frameWidth + 1, mrect.height() - s_frameWidth - 1 ); + + // draw dark corner parts: + p.setPen( tqcolorGroup.dark() ); + + // tl corner: + if ( !shaded ) + p.drawLine( 1, longSide, s_frameWidth, longSide ); + p.drawLine( s_frameWidth, longSide - 1, s_frameWidth, s_frameWidth ); + p.drawLine( s_frameWidth + 1, s_frameWidth, longSide, s_frameWidth ); + p.drawLine( s_frameWidth + s_buttonSize, s_frameWidth, longSide, 1 ); + + // tr corner: + p.drawLine( mrect.width() - longSide - 1, s_frameWidth, + mrect.width() - s_frameWidth - 2, s_frameWidth ); + if ( !shaded ) + { + p.drawLine( mrect.width() - s_frameWidth - 1, longSide, + mrect.width() - 2, longSide ); + } + p.drawLine( mrect.width() - 2, longSide, mrect.width() - 2, 1 ); + + // br corner: + p.drawLine( mrect.width() - longSide - 1, mrect.height() - 2, + mrect.width() - 3, mrect.height() - 2 ); + p.drawLine( mrect.width() - 2, mrect.height() - 2, + mrect.width() - 2, mrect.height() - longSide - 2 ); + + // bl corner: + p.drawLine( 1, mrect.height() - 2, + longSide, mrect.height() - 2 ); + p.drawLine( s_frameWidth + s_buttonSize, mrect.height() - 3, + longSide, mrect.height() - s_frameWidth - 1 ); + p.drawLine( s_frameWidth, mrect.height() - s_frameWidth - 1, + s_frameWidth, mrect.height() - longSide - 1 ); + } + + + p.setPen( TQt::NoPen ); + + if ( !coloredFrame ) + { + tqcolorGroup = options()->tqcolorGroup( KDecoration::ColorTitleBar, isActive() ); + fixColorGroup( tqcolorGroup ); + p.setBrush( tqcolorGroup.background() ); + } + + // draw titlebar: + p.drawRect( trect ); + qDrawShadePanel( &p, trect, tqcolorGroup, titlebarPressed ); + + // draw caption: + if ( titlebarPressed ) // move the caption right and down if the titlebar is pressed + trect.moveBy( 1,1 ); // Note: the real Mwm doesn't actually do this + + p.setFont( options()->font( true ) ); + p.setPen( options()->color( KDecoration::ColorFont, isActive() ) ); + if ( p.fontMetrics().width( caption() ) > trect.width() - 6 ) + { + // left align the text if its too wide to fit in the titlebar + p.drawText( trect.x() + 3, trect.y(), + trect.width() - 6, trect.height(), + AlignLeft | AlignVCenter, caption() ); + } + else + { + // otherwise we'll draw it according to the user settings + p.drawText( trect.x() + 3, trect.y(), + trect.width() - 6, trect.height(), + textAlignment | AlignVCenter, caption() ); + } + + // Draw a line behind the wrapped window to prevent having + // unpainted areas when we're shaded. + p.setPen( tqcolorGroup.dark() ); + p.drawLine(s_frameWidth + 1, mrect.height() - s_frameWidth - 2, + mrect.width() - s_frameWidth - 2, mrect.height() - s_frameWidth - 2); + +} + +KDecoration::Position CdeClient::mousePosition( const TQPoint& p ) const +{ + const int range = s_frameWidth + s_buttonSize; + const int border = s_frameWidth + 1; + + Position m = PositionCenter; + + if ((p.x() > border && p.x() < width() - border) + && (p.y() > border && p.y() < height() - border)) + return PositionCenter; + + if (p.y() < range && p.x() <= range) + m = PositionTopLeft; + else if (p.y() >= height() - range && p.x() >= width() - range) + m = PositionBottomRight; + else if (p.y() >= height()-range && p.x() <= range) + m = PositionBottomLeft; + else if (p.y() < range && p.x() >= width() - range) + m = PositionTopRight; + else if (p.y() < border) + m = PositionTop; + else if (p.y() >= height() - border) + m = PositionBottom; + else if (p.x() <= border) + m = PositionLeft; + else if (p.x() >= width() - border) + m = PositionRight; + else + m = PositionCenter; + return m; +} + +void CdeClient::mouseDoubleClickEvent( TQMouseEvent * e ) +{ + if ( e->button() == Qt::LeftButton && titlebar->tqgeometry().contains( e->pos() ) ) + titlebarDblClickOperation(); +} + +void CdeClient::wheelEvent( TQWheelEvent * e ) +{ + if (isSetShade() || titleLayout->tqgeometry().contains( e->pos() ) ) + titlebarMouseWheelOperation( e->delta()); +} + +void CdeClient::mousePressEvent( TQMouseEvent * e ) +{ + if ( e->button() == Qt::LeftButton && titlebar->tqgeometry().contains( e->pos() ) ) + { + if ( titlebarButtonMode ) + { + titlebarPressed = true; + widget()->tqrepaint(titlebar->tqgeometry(), false); + } + } +} + +void CdeClient::borders(int &left, int &right, int &top, int &bottom) const +{ + left = right = bottom = s_frameWidth + 1; + top = s_buttonSize + s_frameWidth + 1; +} + +void CdeClient::mouseReleaseEvent( TQMouseEvent * e ) +{ + if ( e->button() == Qt::LeftButton && titlebarPressed ) + { + titlebarPressed = false; + widget()->tqrepaint(titlebar->tqgeometry(), false); + } +} + +bool CdeClient::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::Show: + showEvent(TQT_TQSHOWEVENT(e)); + return true; + case TQEvent::Wheel: + wheelEvent( TQT_TQWHEELEVENT( e )); + return true; + default: + break; + } + return false; +} + +// --------------------------------------- + +CdeButton::CdeButton(CdeClient* parent, + const char* name, int btnType, const TQString& tip, int realize_btns) + : TQButton(parent->widget(), name), m_btnType(btnType), last_button(Qt::NoButton) +{ + setBackgroundMode( TQWidget::NoBackground ); + setFixedSize( s_buttonSize, s_buttonSize ); + resize( s_buttonSize, s_buttonSize ); + m_parent = parent; + + setCursor(ArrowCursor); + TQToolTip::add(this, tip); + + m_realize_buttons = realize_btns; +} + +void CdeButton::reset() +{ + tqrepaint( false ); +} + +void CdeButton::drawButton( TQPainter* p ) +{ + p->setBrush( options()->color( KDecoration::ColorTitleBar, m_parent->isActive() ) ); + p->drawRect( 0, 0, s_buttonSize, s_buttonSize ); + + TQColorGroup tqcolorGroup = + options()->tqcolorGroup( KDecoration::ColorTitleBar, m_parent->isActive() ); + + fixColorGroup(tqcolorGroup); + + qDrawShadePanel( p, 0, 0, s_buttonSize, s_buttonSize, + tqcolorGroup, isDown() ); + + switch ( m_btnType ) + { + case (BtnMenu): + qDrawShadePanel( p, s_o1, s_o2, s_w1, s_w2, tqcolorGroup ); + break; + case (BtnHelp): + p->setPen( tqcolorGroup.light() ); + p->drawLineSegments( TQPointArray(16, helpLLines) ); + p->setPen( tqcolorGroup.dark() ); + p->drawLineSegments( TQPointArray(14, helpDLines) ); + break; + case (BtnIconify): + qDrawShadePanel( p, s_o2, s_o2, s_w2, s_w2, tqcolorGroup ); + break; + case (BtnMax): + qDrawShadePanel( p, s_o1, s_o1, s_w1, s_w1, tqcolorGroup, + m_parent->maximizeMode() == KDecoration::MaximizeFull ); + break; + case (BtnClose): + p->setPen( tqcolorGroup.dark() ); + p->drawLineSegments( TQPointArray(18, closeDLines) ); + p->setPen( tqcolorGroup.light() ); + p->drawLineSegments( TQPointArray(15, closeLLines) ); + break; + } +} + +void CdeButton::mousePressEvent(TQMouseEvent *e) +{ + last_button = e->button(); + TQMouseEvent me(e->type(), e->pos(), + e->globalPos(), (e->button()&m_realize_buttons)?Qt::LeftButton:Qt::NoButton, e->state()); + TQButton::mousePressEvent(&me); +} + +void CdeButton::mouseReleaseEvent(TQMouseEvent * e) +{ + last_button = e->button(); + TQMouseEvent me(e->type(), e->pos(), + e->globalPos(), (e->button()&m_realize_buttons)?Qt::LeftButton:Qt::NoButton, e->state()); + TQButton::mouseReleaseEvent(&me); +} + +} // CDE namespace + +#include "cdeclient.moc" + +// vim: sw=4 diff --git a/twin-styles/cde/cdeclient.h b/twin-styles/cde/cdeclient.h new file mode 100644 index 00000000..e3a0e9ad --- /dev/null +++ b/twin-styles/cde/cdeclient.h @@ -0,0 +1,119 @@ +/* + * CDE KWin client - emulates the look and feel + * of dtwm, the CDE window manager. + * + * Copyright (c) 2000-2001, 2002 + * Chris Lee + * Lennart Kudling + * Fredrik H�glund + * + * Copyright (c) 2003 + * Luciano Montanaro + * + * Originally based on the KStep client. + * + * Distributed under the terms of the BSD license. + */ + +#ifndef __CDECLIENT_H +#define __CDECLIENT_H + +#include +#include +#include +#include +#include + +class TQLabel; +class TQBoxLayout; +class TQVBoxLayout; +class TQSpacerItem; + +namespace CDE { + +class CdeClient; + +enum Buttons { BtnMenu=0, BtnHelp, BtnIconify, BtnMax, BtnClose, BtnCount }; + +class CdeButton : public TQButton +{ +public: + CdeButton( CdeClient* parent=0, const char* name=0, int btnType=0, + const TQString& tip=NULL, int realize_btns = Qt::LeftButton ); + void reset(); + ButtonState lastButton() { return last_button; } + +protected: + void mousePressEvent(TQMouseEvent *e); + void mouseReleaseEvent(TQMouseEvent *e); + virtual void drawButton(TQPainter *p); + +private: + CdeClient *m_parent; + int m_btnType; + int m_realize_buttons; + ButtonState last_button; +}; + +class CdeClient : public KDecoration +{ + Q_OBJECT + TQ_OBJECT +public: + CdeClient(KDecorationBridge *b, KDecorationFactory *f); + ~CdeClient() {}; + void init(); + +protected: + bool eventFilter(TQObject *o, TQEvent *e); + void resizeEvent( TQResizeEvent* ); + void paintEvent( TQPaintEvent* ); + + void showEvent(TQShowEvent *); + void addClientButtons( const TQString& ); + void mouseDoubleClickEvent( TQMouseEvent* ); + void wheelEvent( TQWheelEvent * ); + void captionChange(); + void desktopChange(); + void activeChange(); + void shadeChange(); + void iconChange(); + TQSize tqminimumSize() const; + void resize(const TQSize &size); + void borders(int &left, int &right, int &top, int &bottom) const; + void mousePressEvent( TQMouseEvent* ); + void mouseReleaseEvent( TQMouseEvent* ); + void maximizeChange(); + Position mousePosition( const TQPoint& p ) const; + +protected slots: + void menuButtonPressed(); + void menuButtonReleased(); + void maximizeButtonClicked(); + +private: + CdeButton* button[BtnCount]; + TQVBoxLayout* mainLayout; + TQBoxLayout* titleLayout; + TQSpacerItem* titlebar; + bool titlebarPressed; + bool closing; +}; + +class CdeClientFactory: public TQObject, public KDecorationFactory +{ +public: + CdeClientFactory(); + virtual ~CdeClientFactory(); + virtual KDecoration *createDecoration(KDecorationBridge *); + virtual bool supports( Ability ability ); + virtual bool reset(unsigned long changed); + + TQValueList< CdeClientFactory::BorderSize > borderSizes() const; + +}; + +} + +#endif + diff --git a/twin-styles/cde/config/CMakeLists.txt b/twin-styles/cde/config/CMakeLists.txt new file mode 100644 index 00000000..5faec263 --- /dev/null +++ b/twin-styles/cde/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_cde_config (module) ################### + +tde_add_kpart( twin_cde_config AUTOMOC + SOURCES config.cpp + LINK tdeui-shared + DESTINATION ${PLUGIN_INSTALL_DIR} +) diff --git a/twin-styles/cde/config/Makefile.am b/twin-styles/cde/config/Makefile.am new file mode 100644 index 00000000..3e5bd243 --- /dev/null +++ b/twin-styles/cde/config/Makefile.am @@ -0,0 +1,17 @@ +INCLUDES = $(all_includes) + +kde_module_LTLIBRARIES = twin_cde_config.la + +twin_cde_config_la_SOURCES = config.cpp +twin_cde_config_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module $(LIB_QT) $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx +twin_cde_config_la_LIBADD = $(LIB_TDEUI) + +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/cde/config/config.cpp b/twin-styles/cde/config/config.cpp new file mode 100644 index 00000000..fcd2de42 --- /dev/null +++ b/twin-styles/cde/config/config.cpp @@ -0,0 +1,131 @@ +// $Id$ +#include "config.h" +#include +#include +#include +#include +#include + +extern "C" KDE_EXPORT TQObject* allocate_config( KConfig* conf, TQWidget* parent ) +{ + return new CdeConfig(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 + */ + +CdeConfig::CdeConfig( KConfig* conf, TQWidget* parent ) + : TQObject( parent ) +{ + cdeConfig = new KConfig("twincderc"); + KGlobal::locale()->insertCatalogue("twin_art_clients"); + + groupBox = new TQVBox( parent ); + + bgAlign = new TQButtonGroup( 3, Qt::Horizontal, i18n("Text &Alignment"), groupBox ); + bgAlign->setExclusive( true ); + TQWhatsThis::add( bgAlign, i18n("Use these buttons to set the tqalignment of the titlebar caption text.") ); + new TQRadioButton( i18n("Left"), bgAlign, "AlignLeft" ); + TQRadioButton *radio2 = new TQRadioButton( i18n("Centered"), bgAlign, "AlignHCenter" ); + radio2->setChecked( true ); + new TQRadioButton( i18n("Right"), bgAlign, "AlignRight" ); + + cbColorBorder = new TQCheckBox( i18n("Draw window frames using &titlebar colors"), groupBox ); + TQWhatsThis::add( cbColorBorder, i18n("When selected, the window decoration borders " + "are drawn using the titlebar colors. Otherwise, they are " + "drawn using normal border colors instead.") ); + +// cbTitlebarButton = new TQCheckBox( i18n("Titlebar acts like a &pushbutton when clicked"), groupBox ); +// TQWhatsThis::add( cbTitlebarButton, i18n("When selected, this option causes the window titlebar to behave " +// "as if it was a pushbutton when you click it to move the window.") ); + + (void) new TQLabel( i18n("Tip: If you want the look of the original Motif(tm) Window Manager,\n" + "click the \"Buttons\" tab above and remove the help\n" + "and close buttons from the titlebar."), groupBox ); + + // Load configuration options + load( conf ); + + // Ensure we track user changes properly + connect( cbColorBorder, TQT_SIGNAL(clicked()), TQT_SLOT(slotSelectionChanged()) ); +// connect( cbTitlebarButton, TQT_SIGNAL(clicked()), TQT_SLOT(slotSelectionChanged()) ); + connect( bgAlign, TQT_SIGNAL(clicked(int)), TQT_SLOT(slotSelectionChanged(int)) ); + + // Make the widgets visible in twindecoration + groupBox->show(); +} + + +CdeConfig::~CdeConfig() +{ + delete bgAlign; + delete groupBox; + delete cdeConfig; +} + + +void CdeConfig::slotSelectionChanged() +{ + emit changed(); +} + +void CdeConfig::slotSelectionChanged( int ) +{ + emit changed(); +} + +// Loads the configurable options from the twinrc config file +// It is passed the open config from twindecoration to improve efficiency +void CdeConfig::load( KConfig* /*conf*/ ) +{ + cdeConfig->setGroup("General"); + + TQString value = cdeConfig->readEntry( "TextAlignment", "AlignHCenter" ); + TQRadioButton *button = (TQRadioButton*)bgAlign->child( (const char *)value.latin1() ); + if ( button ) + button->setChecked( true ); + + bool coloredFrame = cdeConfig->readBoolEntry( "UseTitleBarBorderColors", true ); + cbColorBorder->setChecked( coloredFrame ); + +// bool titlebarButton = cdeConfig->readBoolEntry( "TitlebarButtonMode", true ); +// cbTitlebarButton->setChecked( titlebarButton ); +} + + +// Saves the configurable options to the twinrc config file +void CdeConfig::save( KConfig* /*conf*/ ) +{ + cdeConfig->setGroup("General"); + + TQRadioButton *button = (TQRadioButton*)bgAlign->selected(); + if ( button ) + cdeConfig->writeEntry( "TextAlignment", TQString(button->name()) ); + + cdeConfig->writeEntry( "UseTitleBarBorderColors", cbColorBorder->isChecked() ); +// cdeConfig->writeEntry( "TitlebarButtonMode", cbTitlebarButton->isChecked() ); + + // Ensure others trying to read this config get updated + cdeConfig->sync(); +} + + +// Sets UI widget defaults which must correspond to style defaults +void CdeConfig::defaults() +{ + TQRadioButton *button = (TQRadioButton*)bgAlign->child( "AlignHCenter" ); + if ( button ) + button->setChecked( true ); + + cbColorBorder->setChecked( true ); +// cbTitlebarButton->setChecked( true ); +} + +#include "config.moc" +// vim: ts=4 diff --git a/twin-styles/cde/config/config.h b/twin-styles/cde/config/config.h new file mode 100644 index 00000000..fc7fa136 --- /dev/null +++ b/twin-styles/cde/config/config.h @@ -0,0 +1,52 @@ +#ifndef __KDE_CDECONFIG_H +#define __KDE_CDECONFIG_H + +#include +#include +#include +#include +#include +#include +#include + +class TQCheckBox; +class TQGroupBox; +class TQVBox; +class TQLabel; +class TQRadioButton; + +class CdeConfig: public TQObject +{ + Q_OBJECT + TQ_OBJECT + + public: + CdeConfig( KConfig* conf, TQWidget* parent ); + ~CdeConfig(); + + // 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 slotSelectionChanged( int ); + + private: + KConfig* cdeConfig; + TQCheckBox* cbColorBorder; +// TQCheckBox* cbTitlebarButton; + TQHBox* groupBox; + TQGroupBox* gbSlider; + TQButtonGroup* bgAlign; +}; + + +#endif + +// vim: ts=4 diff --git a/twin-styles/configure.in.in b/twin-styles/configure.in.in new file mode 100644 index 00000000..e93b34e6 --- /dev/null +++ b/twin-styles/configure.in.in @@ -0,0 +1,3 @@ +if test "x$kde_use_qt_mac" = "xyes"; then + DO_NOT_COMPILE="$DO_NOT_COMPILE twin-styles" +fi diff --git a/twin-styles/glow/CMakeLists.txt b/twin-styles/glow/CMakeLists.txt new file mode 100644 index 00000000..76d0a23e --- /dev/null +++ b/twin-styles/glow/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( themes ) + +include_directories( + ${CMAKE_CURRENT_BINARY_DIR} + ${TDE_INCLUDE_DIR} + ${TQT_INCLUDE_DIRS} +) + +link_directories( + ${TQT_LIBRARY_DIRS} +) + +##### other data ################################ + +install( FILES glow.desktop DESTINATION ${DATA_INSTALL_DIR}/twin ) + +##### twin3_glow ################################ + +tde_add_kpart( twin3_glow AUTOMOC + SOURCES glowbutton.cpp glowclient.cpp + LINK tdecorations-shared + DESTINATION ${PLUGIN_INSTALL_DIR} +) diff --git a/twin-styles/glow/Makefile.am b/twin-styles/glow/Makefile.am new file mode 100644 index 00000000..bb624e59 --- /dev/null +++ b/twin-styles/glow/Makefile.am @@ -0,0 +1,22 @@ + +INCLUDES = $(all_includes) + +SUBDIRS = . config themes + +kde_module_LTLIBRARIES = twin3_glow.la + +twin3_glow_la_SOURCES = glowclient.cpp glowbutton.cpp +twin3_glow_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module $(LIB_QT) $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx +twin3_glow_la_LIBADD = $(LIB_TDECORE) -ltdecorations + +METASOURCES = AUTO +noinst_HEADERS = glowclient.h glowbutton.h resources.h + +linkdir = $(kde_datadir)/twin/ +link_DATA = glow.desktop + +EXTRA_DIST = $(link_DATA) + +###KMAKE-start (don't edit or delete this block) + +###KMAKE-end diff --git a/twin-styles/glow/config/CMakeLists.txt b/twin-styles/glow/config/CMakeLists.txt new file mode 100644 index 00000000..bfcc2633 --- /dev/null +++ b/twin-styles/glow/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_glow_config (module) ################## + +tde_add_kpart( twin_glow_config AUTOMOC + SOURCES glowconfigdialog.cpp + LINK tdeui-shared + DESTINATION ${PLUGIN_INSTALL_DIR} +) diff --git a/twin-styles/glow/config/Makefile.am b/twin-styles/glow/config/Makefile.am new file mode 100644 index 00000000..bf3d334b --- /dev/null +++ b/twin-styles/glow/config/Makefile.am @@ -0,0 +1,17 @@ +INCLUDES = $(all_includes) + +kde_module_LTLIBRARIES = twin_glow_config.la + +twin_glow_config_la_SOURCES = glowconfigdialog.cpp +twin_glow_config_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module $(LIB_QT) $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx +twin_glow_config_la_LIBADD = $(LIB_TDEUI) + +METASOURCES = AUTO +noinst_HEADERS = glowconfigdialog.h + +lnkdir = $(kde_datadir)/twin/ + + +###KMAKE-start (don't edit or delete this block) + +###KMAKE-end diff --git a/twin-styles/glow/config/bitmaps.h b/twin-styles/glow/config/bitmaps.h new file mode 100644 index 00000000..7ecb262a --- /dev/null +++ b/twin-styles/glow/config/bitmaps.h @@ -0,0 +1,55 @@ +/*************************************************************************** + bitmaps.h - description + ------------------- + begin : Thu Sep 12 2001 + copyright : (C) 2001 by Henning Burchardt + email : h_burchardt@gmx.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. * + * * + ***************************************************************************/ + +#ifndef BITMAPS_H +#define BITMAPS_H + +#define BITMAP_SIZE 17 + +static unsigned char close_bits[] = { + 0x00,0x00,0x16,0x00,0x00,0x16,0x00,0x00,0xf8,0x00,0x00,0x0c,0x10,0x10,0x60, + 0x30,0x18,0x00,0x60,0x0c,0xc8,0xc0,0x07,0x16,0x80,0x03,0x60,0xc0,0x07,0x00, + 0x60,0x0c,0x00,0x30,0x18,0xf8,0x10,0x10,0x00,0x00,0x00,0x46,0x00,0x00,0xfe, + 0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0xf3,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; +static unsigned char help_bits[] = { + 0x00,0x00,0x16,0x00,0x00,0x16,0x00,0x00,0x10,0x00,0x00,0x0c,0x80,0x07,0xb6, + 0x40,0x0c,0x00,0x00,0x0c,0xc8,0x00,0x0c,0x16,0x00,0x06,0xb6,0x00,0x03,0x00, + 0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x01,0x00,0x00,0x00,0xac,0x00,0x00,0xfe, + 0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x24,0xc4,0x3f,0x40,0x01,0xf3,0x00,0x00, + 0x70,0xb9,0x65,0x40,0x70,0xb9,0x65,0x40 }; +static unsigned char maximizeoff_bits[] = { + 0x00,0x00,0x16,0x00,0x00,0x16,0x00,0x00,0x1e,0x00,0x00,0x0c,0xf0,0x1f,0x60, + 0xf0,0x1f,0x00,0x10,0x10,0xc8,0x10,0x10,0x16,0x10,0x10,0x60,0x10,0x10,0x00, + 0x10,0x10,0x00,0x10,0x10,0x1e,0xf0,0x1f,0x00,0x00,0x00,0x50,0x00,0x00,0xfe, + 0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x68,0xb9,0x65,0x40,0x01,0xf2,0x00,0x00, + 0x00,0x00,0x00,0x00,0xe0,0xb1,0x65,0x40 }; +static unsigned char minimize_bits[] = { + 0x00,0x00,0x16,0x00,0x00,0x16,0x00,0x00,0x10,0x00,0x00,0x0c,0x00,0x00,0xb6, + 0xe0,0x0f,0x00,0x00,0x00,0xc8,0x20,0x08,0x16,0x60,0x0c,0xb6,0xc0,0x06,0x00, + 0x80,0x03,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0xfe, + 0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0xf2,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; +static unsigned char stickyoff_bits[] = { + 0x00,0x00,0x16,0x00,0x00,0x16,0x00,0x00,0x1e,0x00,0x00,0x0c,0x50,0x15,0x60, + 0xe0,0x00,0x00,0xf0,0x11,0xc8,0xe0,0x00,0x16,0x50,0x15,0x60,0x00,0x00,0x00, + 0x10,0x11,0x00,0x00,0x00,0x1e,0x50,0x15,0x00,0x00,0x00,0x46,0x00,0x00,0xfe, + 0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x08,0x31,0xf2,0x00,0x00, + 0x00,0x00,0x00,0x00,0x29,0xf2,0x00,0x00 }; + +#endif + diff --git a/twin-styles/glow/config/glowconfigdialog.cpp b/twin-styles/glow/config/glowconfigdialog.cpp new file mode 100644 index 00000000..f8ff62fd --- /dev/null +++ b/twin-styles/glow/config/glowconfigdialog.cpp @@ -0,0 +1,369 @@ +/*************************************************************************** + glowconfigdialog.cpp - description + ------------------- + begin : Thu Sep 12 2001 + copyright : (C) 2001 by Henning Burchardt + email : h_burchardt@gmx.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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bitmaps.h" +#include "glowconfigdialog.h" +#include "../resources.h" + +#define NUMBER_OF_BUTTONS 5 + +extern "C" +{ + KDE_EXPORT TQObject* allocate_config( KConfig* conf, TQWidget* parent ) + { + return(new GlowConfigDialog(conf, parent)); + } +} + +GlowConfigDialog::GlowConfigDialog( KConfig * conf, TQWidget * parent ) + : TQObject(parent) +{ + _glowConfig = new KConfig("twinglowrc"); + KGlobal::locale()->insertCatalogue("twin_glow_config"); + + _main_group_box = new TQWidget(parent); + TQVBoxLayout *main_group_boxLayout = new TQVBoxLayout(_main_group_box); + main_group_boxLayout->tqsetAlignment(TQt::AlignTop | TQt::AlignLeft); + main_group_boxLayout->setSpacing(6); + + //------------------------------------------------------------------------- + // themes + + _theme_list_view = new TQListView (_main_group_box, "theme_list_view"); + _theme_list_view->addColumn (i18n("Theme")); + _theme_list_view->addColumn (i18n("Button Size")); + _theme_list_view->setAllColumnsShowFocus(true); + _theme_list_view->setResizeMode(TQListView::AllColumns); + + main_group_boxLayout->addWidget (_theme_list_view); + TQObject::connect (_theme_list_view, TQT_SIGNAL(selectionChanged()), + this, TQT_SLOT(slotThemeListViewSelectionChanged())); + slotLoadThemeList(); + + _button_glow_color_group_box = new TQGroupBox( + 0, Qt::Horizontal, i18n("Button Glow Colors"), _main_group_box); + TQHBoxLayout *colorHBoxLayout = + new TQHBoxLayout(_button_glow_color_group_box->tqlayout()); + + // create buttons + TQSize buttonSize(BITMAP_SIZE, BITMAP_SIZE); + TQPixmap pm(buttonSize); + pm.fill(TQt::black); + + _stickyButton = new TQPushButton(_button_glow_color_group_box); + pm.setMask(TQBitmap(buttonSize, stickyoff_bits, true)); + _stickyButton->setPixmap(pm); + colorHBoxLayout->addWidget(_stickyButton); + _titleButtonList.push_back(_stickyButton); + + _helpButton = new TQPushButton(_button_glow_color_group_box); + pm.setMask(TQBitmap(buttonSize, help_bits, true)); + _helpButton->setPixmap(pm); + colorHBoxLayout->addWidget(_helpButton); + _titleButtonList.push_back(_helpButton); + + _iconifyButton = new TQPushButton(_button_glow_color_group_box); + pm.setMask(TQBitmap(buttonSize, minimize_bits, true)); + _iconifyButton->setPixmap(pm); + colorHBoxLayout->addWidget(_iconifyButton); + _titleButtonList.push_back(_iconifyButton); + + _maximizeButton = new TQPushButton(_button_glow_color_group_box); + pm.setMask(TQBitmap(buttonSize, maximizeoff_bits, true)); + _maximizeButton->setPixmap(pm); + colorHBoxLayout->addWidget(_maximizeButton); + _titleButtonList.push_back(_maximizeButton); + + _closeButton = new TQPushButton(_button_glow_color_group_box); + pm.setMask(TQBitmap(buttonSize, close_bits, true)); + _closeButton->setPixmap(pm); + colorHBoxLayout->addWidget(_closeButton); + _titleButtonList.push_back(_closeButton); + + // create signal mapper + _titleButtonMapper = new TQSignalMapper(this); + for( uint i=0; i<_titleButtonList.size(); i++ ) { + _titleButtonMapper->setMapping(TQT_TQOBJECT(_titleButtonList[i]), i); + connect(_titleButtonList[i], TQT_SIGNAL(clicked()),_titleButtonMapper, TQT_SLOT(map())); + } + connect(_titleButtonMapper, TQT_SIGNAL(mapped(int)),this, TQT_SLOT(slotTitleButtonClicked(int))); + + _colorButton = new KColorButton(_button_glow_color_group_box); + _colorButton->setEnabled(false); + connect(_colorButton, TQT_SIGNAL(changed(const TQColor&)), + this, TQT_SLOT(slotColorButtonChanged(const TQColor&))); + + colorHBoxLayout->addItem(new TQSpacerItem( + 200, 20, TQSizePolicy::Expanding, TQSizePolicy::Minimum)); + colorHBoxLayout->addWidget(_colorButton); + + main_group_boxLayout->addWidget(_button_glow_color_group_box); + + TQHBoxLayout *titlebarGradientTypeLayout = new TQHBoxLayout(); + _titlebarGradientTypeComboBox = new TQComboBox(_main_group_box); + + KConfig *c = KGlobal::config(); + KConfigGroupSaver cgs( c, TQString::tqfromLatin1("WM") ); + TQColor activeBackground = c->readColorEntry("activeBackground"); + TQColor activeBlend = c->readColorEntry("activeBlend"); + + // If the colors are equal, change one to get a gradient effect + if (activeBackground==activeBlend) { + activeBackground = activeBackground.dark(); + } + for (int i=0; i< KPixmapEffect::EllipticGradient; i++ ) { + KPixmap gradPixmap(TQSize(196,20)); + KPixmapEffect::gradient(gradPixmap, activeBackground, + activeBlend, (KPixmapEffect::GradientType) i); + + _titlebarGradientTypeComboBox->insertItem(gradPixmap, i); + } + + connect(_titlebarGradientTypeComboBox, TQT_SIGNAL(activated(int)), + this, TQT_SLOT(slotTitlebarGradientTypeChanged(int))); + titlebarGradientTypeLayout->addWidget( + new TQLabel(i18n("Titlebar gradient:"), _main_group_box)); + titlebarGradientTypeLayout->addWidget(_titlebarGradientTypeComboBox, 0, TQt::AlignLeft); + titlebarGradientTypeLayout->addStretch(10); + main_group_boxLayout->addLayout(titlebarGradientTypeLayout); + + + _showResizeHandleCheckBox = new TQCheckBox( + i18n("Show resize handle"), _main_group_box); + connect(_showResizeHandleCheckBox, TQT_SIGNAL(clicked()), + this, TQT_SLOT(slotResizeHandleCheckBoxChanged())); + main_group_boxLayout->addWidget(_showResizeHandleCheckBox); + + // load config and update user interface + load(conf); + + _main_group_box->show(); +} + +GlowConfigDialog::~GlowConfigDialog() +{ + delete _main_group_box; + delete _glowConfig; + delete[] _buttonConfigMap; +} + +void GlowConfigDialog::load( KConfig* /* conf */ ) +{ + TQColor color; + const TQColor defaultCloseButtonColor(DEFAULT_CLOSE_BUTTON_COLOR); + const TQColor defaultMaximizeButtonColor(DEFAULT_MAXIMIZE_BUTTON_COLOR); + const TQColor defaultIconifyButtonColor(DEFAULT_ICONIFY_BUTTON_COLOR); + const TQColor defaultHelpButtonColor(DEFAULT_HELP_BUTTON_COLOR); + const TQColor defaultStickyButtonColor(DEFAULT_STICKY_BUTTON_COLOR); + + _glowConfig->setGroup("General"); + + _buttonConfigMap = new TQColor[NUMBER_OF_BUTTONS]; + color = _glowConfig->readColorEntry("stickyButtonGlowColor", + &defaultStickyButtonColor); + _buttonConfigMap[stickyButton] = color; + + color = _glowConfig->readColorEntry("helpButtonGlowColor", + &defaultHelpButtonColor); + _buttonConfigMap[helpButton] = color; + + color = _glowConfig->readColorEntry("iconifyButtonGlowColor", + &defaultIconifyButtonColor); + _buttonConfigMap[iconifyButton] = color; + + color = _glowConfig->readColorEntry("maximizeButtonGlowColor", + &defaultMaximizeButtonColor); + _buttonConfigMap[maximizeButton] = color; + + color = _glowConfig->readColorEntry("closeButtonGlowColor", + &defaultCloseButtonColor); + _buttonConfigMap[closeButton] = color; + + _showResizeHandle = _glowConfig->readBoolEntry("showResizeHandle", true); + _titlebarGradientType = static_cast + (_glowConfig->readNumEntry("titlebarGradientType", + KPixmapEffect::DiagonalGradient)); + + _showResizeHandleCheckBox->setChecked(_showResizeHandle); + _titlebarGradientTypeComboBox->setCurrentItem(_titlebarGradientType); + + _theme_name = _glowConfig->readEntry ("themeName", "default"); + _theme_list_view->setSelected ( + _theme_list_view->findItem (_theme_name, 0), true); + slotTitleButtonClicked(0); +} + +void GlowConfigDialog::save( KConfig* /* conf */ ) +{ + _glowConfig->setGroup("General"); + + _glowConfig->writeEntry("stickyButtonGlowColor", _buttonConfigMap[stickyButton]); + _glowConfig->writeEntry("helpButtonGlowColor", _buttonConfigMap[helpButton]); + _glowConfig->writeEntry("iconifyButtonGlowColor", _buttonConfigMap[iconifyButton]); + _glowConfig->writeEntry("maximizeButtonGlowColor", _buttonConfigMap[maximizeButton]); + _glowConfig->writeEntry("closeButtonGlowColor", _buttonConfigMap[closeButton]); + + _glowConfig->writeEntry("showResizeHandle", _showResizeHandle); + _glowConfig->writeEntry("titlebarGradientType", _titlebarGradientType); + + _glowConfig->writeEntry ("themeName", _theme_name); + + _glowConfig->sync(); +} + +void GlowConfigDialog::defaults() +{ + const TQColor defaultCloseButtonColor = DEFAULT_CLOSE_BUTTON_COLOR; + const TQColor defaultMaximizeButtonColor(DEFAULT_MAXIMIZE_BUTTON_COLOR); + const TQColor defaultIconifyButtonColor(DEFAULT_ICONIFY_BUTTON_COLOR); + const TQColor defaultHelpButtonColor(DEFAULT_HELP_BUTTON_COLOR); + const TQColor defaultStickyButtonColor(DEFAULT_STICKY_BUTTON_COLOR); + + _buttonConfigMap[stickyButton] = defaultStickyButtonColor; + _buttonConfigMap[helpButton] = defaultHelpButtonColor; + _buttonConfigMap[iconifyButton] = defaultIconifyButtonColor; + _buttonConfigMap[maximizeButton] = defaultMaximizeButtonColor; + _buttonConfigMap[closeButton] = defaultCloseButtonColor; + + _showResizeHandle = true; + _titlebarGradientType = KPixmapEffect::DiagonalGradient; + + _showResizeHandleCheckBox->setChecked(_showResizeHandle); + _titlebarGradientTypeComboBox->setCurrentItem(_titlebarGradientType); + + _theme_list_view->setSelected ( + _theme_list_view->findItem("default", 0), true); +} + +void GlowConfigDialog::slotLoadThemeList () +{ + TQStringList dir_list=KGlobal::dirs()->findDirs("data", "twin/glow-themes"); + + TQStringList::ConstIterator it; + + _theme_list_view->clear(); + new TQListViewItem (_theme_list_view, "default", "17x17"); + + for (it=dir_list.begin(); it!=dir_list.end(); ++it) + { + TQDir dir (*it, TQString("*"), TQDir::Unsorted, + TQDir::Dirs | TQDir::Readable); + if (dir.exists()) + { + TQFileInfoListIterator it2(*dir.entryInfoList()); + TQFileInfo * finfo; + + while ((finfo=it2.current())) + { + if (finfo->fileName() == "." || finfo->fileName() == "..") { + ++it2; + continue; + } + + if (! _theme_list_view->findItem (finfo->fileName(), 0)) + { + KConfig conf (dir.path() + "/" + finfo->fileName() + "/" + + finfo->fileName() + ".theme"); + TQSize button_size = conf.readSizeEntry ( + "buttonSize", new TQSize (-1, -1)); + if (button_size.width() == -1) + { + ++it2; + continue; + } + TQString size_string = TQString("") + + TQString::number(button_size.width()) + + "x" + TQString::number(button_size.height()); + new TQListViewItem (_theme_list_view, + finfo->fileName(), size_string); + } + + ++it2; + } + } + } +} + +void GlowConfigDialog::slotTitlebarGradientTypeChanged(int index) +{ + _titlebarGradientType = static_cast(index); + emit changed(); +} + +void GlowConfigDialog::slotResizeHandleCheckBoxChanged() +{ + _showResizeHandle = _showResizeHandleCheckBox->isChecked(); + emit changed(); +} + +void GlowConfigDialog::slotTitleButtonClicked(int index) +{ + for( int i=0; i< ((int) _titleButtonList.size()); i++ ) { + _titleButtonList[i]->setDown(i==index); + } + _colorButton->setEnabled(true); + _colorButton->setColor(_buttonConfigMap[index]); +} + +void GlowConfigDialog::slotColorButtonChanged(const TQColor& glowColor) +{ + if( _stickyButton->isDown() ) { + _buttonConfigMap[stickyButton] = glowColor; + } else if( _helpButton->isDown() ) { + _buttonConfigMap[helpButton] = glowColor; + } else if( _iconifyButton->isDown() ) { + _buttonConfigMap[iconifyButton] = glowColor; + } else if( _maximizeButton->isDown() ) { + _buttonConfigMap[maximizeButton] = glowColor; + } else { + _buttonConfigMap[closeButton] = glowColor; + } + emit changed(); +} + +void GlowConfigDialog::slotThemeListViewSelectionChanged () +{ + if( _theme_list_view->selectedItem() != 0 ) { + _theme_name = _theme_list_view->selectedItem()->text (0); + + emit changed(); + } +} + +#include "glowconfigdialog.moc" diff --git a/twin-styles/glow/config/glowconfigdialog.h b/twin-styles/glow/config/glowconfigdialog.h new file mode 100644 index 00000000..81747a4c --- /dev/null +++ b/twin-styles/glow/config/glowconfigdialog.h @@ -0,0 +1,92 @@ +/*************************************************************************** + glowconfigdialog.h - description + ------------------- + begin : Thu Sep 12 2001 + copyright : (C) 2001 by Henning Burchardt + email : h_burchardt@gmx.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. * + * * + ***************************************************************************/ + +#ifndef GLOW_CONFIG_DIALOG_H +#define GLOW_CONFIG_DIALOG_H + +#include +#include + +class TQListView; +class TQPushButton; +class TQSignalMapper; +class TQCheckBox; +class TQComboBox; +class KConfig; +class KColorButton; + +class GlowConfigDialog : public TQObject +{ + Q_OBJECT + TQ_OBJECT + +public: + GlowConfigDialog( KConfig* conf, TQWidget* parent ); + ~GlowConfigDialog(); + +signals: + void changed(); + +public slots: + void load( KConfig* conf ); + void save( KConfig* conf ); + void defaults(); + +protected slots: + void slotTitleButtonClicked(int); + void slotColorButtonChanged(const TQColor&); + void slotTitlebarGradientTypeChanged(int); + void slotResizeHandleCheckBoxChanged(); + void slotThemeListViewSelectionChanged (); + +private slots: + void slotLoadThemeList (); + +private: + enum ButtonType{stickyButton, helpButton, iconifyButton, + maximizeButton, closeButton }; + + KConfig *_glowConfig; + + bool _showResizeHandle; + KPixmapEffect::GradientType _titlebarGradientType; + TQString _theme_name; + + TQWidget *_main_group_box; + TQGroupBox *_button_glow_color_group_box; + TQGroupBox *_theme_group_box; + + TQListView * _theme_list_view; + + TQCheckBox *_showResizeHandleCheckBox; + TQComboBox *_titlebarGradientTypeComboBox; + + TQPushButton *_stickyButton; + TQPushButton *_helpButton; + TQPushButton *_iconifyButton; + TQPushButton *_maximizeButton; + TQPushButton *_closeButton; + TQSignalMapper *_titleButtonMapper; + + TQColor* _buttonConfigMap; + TQValueVector _titleButtonList; + + KColorButton *_colorButton; +}; + +#endif + diff --git a/twin-styles/glow/glow.desktop b/twin-styles/glow/glow.desktop new file mode 100644 index 00000000..9659e5d6 --- /dev/null +++ b/twin-styles/glow/glow.desktop @@ -0,0 +1,49 @@ +[Desktop Entry] +Name=Glow +Name[af]=Gloei +Name[br]=Lufrus +Name[ca]=Lluïssor +Name[cs]=Záře +Name[cy]=Gwrid +Name[da]=Glød +Name[el]=Λάμψη +Name[es]=Brillo +Name[et]=Helendus +Name[eu]=Dirdira +Name[fa]=درخشندگی +Name[fi]=Hehku +Name[fr]=Lueur +Name[fy]=Gloede +Name[hi]=ग्लो +Name[is]=Glóð +Name[it]=Bagliore +Name[ja]=輝き +Name[ka]=გავარვარება +Name[lt]=Švytėjimas +Name[lv]=Kvēlot +Name[mk]=Отсјај +Name[ms]=Kilau +Name[mt]=Dija +Name[nb]=Glød +Name[ne]=चमक +Name[nl]=Gloed +Name[nn]=Glød +Name[pl]=Blask +Name[ro]=Licărire +Name[ru]=Зарево +Name[sk]=Plameň +Name[sl]=Lesk +Name[sr]=Сијање +Name[sr@Latn]=Sijanje +Name[sv]=Glöd +Name[ta]=ஒளிப்பெற்று +Name[tg]=Шафақ +Name[th]=เรืองแสง +Name[tr]=Parlama +Name[uk]=Заграва +Name[ven]=Tshedza +Name[vi]=Hào quang +Name[xh]=Qukuqela +Name[zh_CN]=光芒 +Name[zu]=Khanya +X-KDE-Library=twin3_glow diff --git a/twin-styles/glow/glowbutton.cpp b/twin-styles/glow/glowbutton.cpp new file mode 100644 index 00000000..87079c2e --- /dev/null +++ b/twin-styles/glow/glowbutton.cpp @@ -0,0 +1,339 @@ +/*************************************************************************** + glowbutton.cpp - description + ------------------- + begin : Thu Sep 6 2001 + copyright : (C) 2001 by Henning Burchardt + email : h_burchardt@gmx.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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "glowbutton.h" + +namespace Glow +{ + +//----------------------------------------------------------------------------- +// PixmapCache +//----------------------------------------------------------------------------- + +TQMap PixmapCache::m_pixmapMap; + +const TQPixmap* PixmapCache::find(const TQString& key) +{ + TQMap::const_iterator it = + m_pixmapMap.find(key); + if( it != m_pixmapMap.end() ) + return *it; + else + return 0; +} + +void PixmapCache::insert(const TQString& key, const TQPixmap *pixmap) +{ + m_pixmapMap[key] = pixmap; +} + +void PixmapCache::erase(const TQString& key) +{ + TQMap::iterator it = + m_pixmapMap.find(key); + if (it != m_pixmapMap.end()) + { + delete *it; + m_pixmapMap.erase(it); + } +} + +void PixmapCache::clear() +{ + // delete all pixmaps in the cache + TQMap::const_iterator it + = m_pixmapMap.begin(); + for(; it != m_pixmapMap.end(); ++it) + delete *it; + m_pixmapMap.clear(); +} + +//----------------------------------------------------------------------------- +// GlowButton +//----------------------------------------------------------------------------- + +GlowButton::GlowButton(TQWidget *parent, const char *name, + const TQString& tip, const int realizeBtns) + : TQButton(parent, name) +{ + m_realizeButtons = realizeBtns; + + _steps = 0; + m_updateTime = 50; + m_pixmapName = TQString(); + + m_timer = new TQTimer(this); + connect(m_timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotTimeout())); + m_pos = 0; + m_timertqStatus = Stop; + + setTipText (tip); + setCursor(arrowCursor); +} + +GlowButton::~GlowButton() +{ +} + +void GlowButton::setTipText( const TQString& tip ) +{ + if (KDecoration::options()->showTooltips()) + { + TQToolTip::remove( this ); + TQToolTip::add( this, tip ); + } +} + +TQString GlowButton::getPixmapName() const +{ + return m_pixmapName; +} + +TQt::ButtonState GlowButton::lastButton() const +{ + return _last_button; +} + +void GlowButton::setPixmapName(const TQString& pixmapName) +{ + m_pixmapName = pixmapName; + + const TQPixmap *pixmap = PixmapCache::find(pixmapName); + if( ! pixmap ) + return; + + // set steps + _steps = pixmap->height()/pixmap->width() - 1; + + tqrepaint(false); +} + +void GlowButton::paintEvent( TQPaintEvent *e ) +{ + TQWidget::paintEvent(e); + const TQPixmap *pixmap = PixmapCache::find(m_pixmapName); + if( pixmap != 0 ) + { + int pos = m_pos>=0?m_pos:-m_pos; + TQPainter p; + TQPixmap pm (pixmap->size()); + p.begin(&pm); + const TQPixmap * bg_pixmap = PixmapCache::find( + TQString::number(parentWidget()->winId())); + p.drawPixmap (0, 0, *bg_pixmap, x(), y(), width(), height()); + p.drawPixmap (0, 0, *pixmap, 0, pos*height(), width(), height()); + p.end(); + p.begin(this); + p.drawPixmap (0, 0, pm); + p.end(); + } +} + +void GlowButton::enterEvent( TQEvent *e ) +{ + if( m_pos<0 ) + m_pos=-m_pos; + m_timertqStatus = Run; + if( ! m_timer->isActive() ) + m_timer->start(m_updateTime); + TQButton::enterEvent(e); +} + +void GlowButton::leaveEvent( TQEvent *e ) +{ + m_timertqStatus = Stop; + if( ! m_timer->isActive() ) + m_timer->start(m_updateTime); + TQButton::leaveEvent(e); +} + +void GlowButton::mousePressEvent( TQMouseEvent *e ) +{ + _last_button = e->button(); + if( m_timer->isActive() ) + m_timer->stop(); + m_pos = _steps; + tqrepaint(false); + // without pretending LeftButton, clicking on the button with MidButton + // or RightButton would cause unwanted titlebar action + TQMouseEvent me (e->type(), e->pos(), e->globalPos(), + (e->button()&m_realizeButtons)?Qt::LeftButton:Qt::NoButton, e->state()); + TQButton::mousePressEvent(&me); +} + +void GlowButton::mouseReleaseEvent( TQMouseEvent *e ) +{ + _last_button = e->button(); + TQPoint p = mapToParent(mapFromGlobal(e->globalPos())); + if( ! m_timer->isActive() ) { + m_timer->start(m_updateTime); + } + if( ! tqgeometry().contains(p) ) { + m_timertqStatus = Stop; + } + TQMouseEvent me (e->type(), e->pos(), e->globalPos(), + (e->button()&m_realizeButtons)?Qt::LeftButton:Qt::NoButton, e->state()); + TQButton::mouseReleaseEvent(&me); +} + +void GlowButton::slotTimeout() +{ + tqrepaint(false); + + if( m_pos>=_steps-1 ) { + m_pos = -m_pos; + } + if( m_timertqStatus==Stop ) { + if( m_pos==0 ) { + m_timer->stop(); + return; + } else if( m_pos>0 ) { + m_pos = -m_pos; + } + } + + m_pos++; +} + +//----------------------------------------------------------------------------- +// GlowButtonFactory +//----------------------------------------------------------------------------- + +GlowButtonFactory::GlowButtonFactory() +{ + _steps = 20; +} + +int GlowButtonFactory::getSteps() +{ + return _steps; +} + +void GlowButtonFactory::setSteps(int steps) +{ + _steps = steps; +} + +TQPixmap * GlowButtonFactory::createGlowButtonPixmap( + const TQImage & bg_image, + const TQImage & fg_image, + const TQImage & glow_image, + const TQColor & color, + const TQColor & glow_color) +{ + if (bg_image.size() != fg_image.size() + || fg_image.size() != glow_image.size()) { + std::cerr << "Image size error" << std::endl; + return new TQPixmap(); + } + + TQImage colorized_bg_image = bg_image.copy(); + KIconEffect::colorize (colorized_bg_image, color, 1.0); + + int w = colorized_bg_image.width(); + int h = colorized_bg_image.height(); + + TQImage image (w, (_steps+1)*h, 32); + image.setAlphaBuffer (true); + for (int i=0; i<_steps+1; ++i) { + for (int y=0; y +#include +#include + +class TQPixmap; +class TQBitmap; +class TQTimer; +class TQString; + +namespace Glow +{ + +class PixmapCache +{ +public: + static const TQPixmap* find(const TQString& key); + static void insert(const TQString& key, const TQPixmap *pixmap); + static void erase(const TQString& key); + static void clear(); +private: + static TQMap m_pixmapMap; +}; + + +//----------------------------------------------------------------------------- + +class GlowButton : public TQButton +{ + Q_OBJECT + TQ_OBJECT + +public: + GlowButton(TQWidget *parent, const char* name, const TQString& tip, const int realizeBtns); + ~GlowButton(); + + void setTipText( const TQString& tip ); + + TQString getPixmapName() const; + ButtonState lastButton() const; + + /** Sets the name of the pixmap in the pixmap cache. + * If no background pixmap is wanted use TQString() as name. */ + void setPixmapName(const TQString& pixmapName); + +protected: + virtual void paintEvent( TQPaintEvent * ); + virtual void enterEvent( TQEvent * ); + virtual void leaveEvent( TQEvent * ); + virtual void mousePressEvent( TQMouseEvent * ); + virtual void mouseReleaseEvent( TQMouseEvent * ); + +protected slots: + void slotTimeout(); + +private: + enum TimertqStatus { Run, Stop }; + + int m_updateTime; + int _steps; + TQString m_pixmapName; + + TQTimer *m_timer; + int m_pos; + TimertqStatus m_timertqStatus; + + int m_realizeButtons; + ButtonState _last_button; +}; + +//----------------------------------------------------------------------------- + +class GlowButtonFactory +{ +public: + GlowButtonFactory(); + + int getSteps(); + + /** + * Sets the number of pixmaps used to create the glow effect of the + * glow buttons. + */ + void setSteps(int steps); + + /** + * Creates a background pixmap for a glow button. + * The pixmap will consist of sub pixmaps of the size of the button which + * are placed one below the other. Each sub pixmap is copied on the button + * in succession to create the glow effect. The last sub pixmap is used + * when the button is pressed. + */ + TQPixmap * createGlowButtonPixmap( + const TQImage & bg_image, +// const TQImage & bg_alpha_image, + const TQImage & fg_image, + const TQImage & glow_image, + const TQColor & color, + const TQColor & glow_color); + + GlowButton* createGlowButton( + TQWidget *parent, const char* name, const TQString& tip, const int realizeBtns = Qt::LeftButton); + +private: + int _steps; +}; + +} // namespace + +#endif diff --git a/twin-styles/glow/glowclient.cpp b/twin-styles/glow/glowclient.cpp new file mode 100644 index 00000000..98133221 --- /dev/null +++ b/twin-styles/glow/glowclient.cpp @@ -0,0 +1,902 @@ +/*************************************************************************** + glowclient.cpp - description + ------------------- + begin : Thu Sep 6 2001 + copyright : (C) 2001 by Henning Burchardt + email : h_burchardt@gmx.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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resources.h" +#include "glowclient.h" +#include "glowbutton.h" + +namespace Glow +{ + +static int titleHeight; +static int SIDE_MARGIN; +static int BOTTOM_MARGIN; +static const int TITLE_MARGIN = 2; +static const int TITLE_SPACING = 1; +static int RESIZE_HANDLE_HEIGHT; + +//----------------------------------------------------------------------------- + +GlowClientConfig::GlowClientConfig() +{ + themeName = "default"; +} + +void GlowClientConfig::load(KDecorationFactory *factory) +{ + KConfig conf("twinglowrc"); + conf.setGroup("General"); + + const TQColor defaultCloseButtonColor(DEFAULT_CLOSE_BUTTON_COLOR); + const TQColor defaultMaximizeButtonColor(DEFAULT_MAXIMIZE_BUTTON_COLOR); + const TQColor defaultIconifyButtonColor(DEFAULT_ICONIFY_BUTTON_COLOR); + const TQColor defaultHelpButtonColor(DEFAULT_HELP_BUTTON_COLOR); + const TQColor defaultStickyButtonColor(DEFAULT_STICKY_BUTTON_COLOR); + + stickyButtonGlowColor = conf.readColorEntry( + "stickyButtonGlowColor", &defaultStickyButtonColor); + + helpButtonGlowColor = conf.readColorEntry( + "helpButtonGlowColor", &defaultHelpButtonColor); + + iconifyButtonGlowColor = conf.readColorEntry( + "iconifyButtonGlowColor", &defaultIconifyButtonColor); + + maximizeButtonGlowColor = conf.readColorEntry( + "maximizeButtonGlowColor", &defaultMaximizeButtonColor); + + closeButtonGlowColor = conf.readColorEntry( + "closeButtonGlowColor", &defaultCloseButtonColor); + + showResizeHandle = conf.readBoolEntry("showResizeHandle", true); + titlebarGradientType = conf.readNumEntry("titlebarGradientType", + KPixmapEffect::DiagonalGradient); + + themeName = conf.readEntry ("themeName", "default"); + + switch(KDecoration::options()->preferredBorderSize (factory)) { + case KDecoration::BorderLarge: + SIDE_MARGIN = 8; + BOTTOM_MARGIN = 6; + RESIZE_HANDLE_HEIGHT = 10; + break; + case KDecoration::BorderVeryLarge: + SIDE_MARGIN = 12; + BOTTOM_MARGIN = 12; + RESIZE_HANDLE_HEIGHT = 18; + break; + case KDecoration::BorderHuge: + SIDE_MARGIN = 18; + BOTTOM_MARGIN = 18; + RESIZE_HANDLE_HEIGHT = 27; + break; + case KDecoration::BorderVeryHuge: + SIDE_MARGIN = 27; + BOTTOM_MARGIN = 27; + RESIZE_HANDLE_HEIGHT = 40; + break; + case KDecoration::BorderOversized: + SIDE_MARGIN = 40; + BOTTOM_MARGIN = 40; + RESIZE_HANDLE_HEIGHT = 60; + break; + case KDecoration::BorderNormal: + default: + SIDE_MARGIN = 4; + BOTTOM_MARGIN = 2; + RESIZE_HANDLE_HEIGHT = 4; + } +} + +//----------------------------------------------------------------------------- + +GlowClientGlobals::~GlowClientGlobals() +{ + deletePixmaps(); + m_instance = 0; +} + +TQString GlowClientGlobals::getPixmapName(PixmapType type, bool isActive) +{ + TQString s = getPixmapTypeName(static_cast(type)); + s += "|"; + s += isActive ? "Active" : "NotActive"; + return s; +} + +GlowClientGlobals::GlowClientGlobals() + : KDecorationFactory() +{ + _button_factory = new GlowButtonFactory(); + readConfig(); + readTheme (); + if (!createPixmaps()) + { + deletePixmaps(); + delete _theme; + config()->themeName = "default"; + readTheme(); + createPixmaps(); + } +} + +void GlowClientGlobals::readConfig() +{ + _config = new GlowClientConfig(); + _config->load(this); +} + +TQValueList< GlowClientGlobals::BorderSize > +GlowClientGlobals::borderSizes() const +{ + // the list must be sorted + return TQValueList< BorderSize >() << BorderNormal << + BorderLarge << BorderVeryLarge << BorderHuge << + BorderVeryHuge << BorderOversized; +} + +void GlowClientGlobals::readTheme() +{ + TQString theme_config_file = KGlobal::dirs()->findResource ("data", + TQString("twin/glow-themes/") + config()->themeName + "/" + + config()->themeName + ".theme"); + if (theme_config_file.isNull()) + { + config()->themeName = "default"; + return; + } + + KConfig conf (theme_config_file); + _theme = new GlowTheme(default_glow_theme); + + _theme->buttonSize = conf.readSizeEntry ("buttonSize", + &_theme->buttonSize); + _theme->stickyOnPixmap = conf.readEntry ("stickyOnPixmap", + _theme->stickyOnPixmap); + _theme->stickyOffPixmap = conf.readEntry ("stickyOffPixmap", + _theme->stickyOffPixmap); + _theme->maximizeOnPixmap = conf.readEntry ("maximizeOnPixmap", + _theme->maximizeOnPixmap); + _theme->maximizeOffPixmap = conf.readEntry ("maximizeOffPixmap", + _theme->maximizeOffPixmap); + _theme->helpPixmap = conf.readEntry ("helpPixmap", + _theme->helpPixmap); + _theme->closePixmap = conf.readEntry ("closePixmap", + _theme->closePixmap); + _theme->iconifyPixmap = conf.readEntry ("iconifyPixmap", + _theme->iconifyPixmap); + _theme->stickyOnGlowPixmap = conf.readEntry ("stickyOnGlowPixmap", + _theme->stickyOnGlowPixmap); + _theme->stickyOffGlowPixmap = conf.readEntry ("stickyOffGlowPixmap", + _theme->stickyOffGlowPixmap); + _theme->maximizeOnGlowPixmap = conf.readEntry ("maximizeOnGlowPixmap", + _theme->maximizeOnGlowPixmap); + _theme->maximizeOffGlowPixmap = conf.readEntry ("maximizeOffGlowPixmap", + _theme->maximizeOffGlowPixmap); + _theme->helpGlowPixmap = conf.readEntry ("helpGlowPixmap", + _theme->helpGlowPixmap); + _theme->closeGlowPixmap = conf.readEntry ("closeGlowPixmap", + _theme->closeGlowPixmap); + _theme->iconifyGlowPixmap = conf.readEntry ("iconifyGlowPixmap", + _theme->iconifyGlowPixmap); + + titleHeight = TQFontMetrics(KDecoration::options()->font(true)).height(); + if (titleHeight < SIDE_MARGIN) + titleHeight = SIDE_MARGIN; + if (titleHeight < _theme->buttonSize.height()) + titleHeight = _theme->buttonSize.height(); +} + +bool GlowClientGlobals::reset( unsigned long /*changed*/ ) +{ + deletePixmaps(); + delete _config; + readConfig(); + delete _theme; + readTheme (); + if (! createPixmaps()) + { + deletePixmaps(); + delete _theme; + _config->themeName = "default"; + readTheme(); + createPixmaps(); + } + return true; // FRAME +} + +bool GlowClientGlobals::supports( Ability ability ) +{ + switch( ability ) + { + case AbilityAnnounceButtons: + case AbilityButtonOnAllDesktops: + case AbilityButtonSpacer: + case AbilityButtonHelp: + case AbilityButtonMinimize: + case AbilityButtonMaximize: + case AbilityButtonClose: + return true; + default: + return false; + }; +} + +bool GlowClientGlobals::createPixmaps() +{ + for( int type=0; type<=Close; type++ ) { + if (! createPixmap(static_cast(type), false)) + return false; + if (! createPixmap(static_cast(type), true)) + return false; + } + + return true; +} + +void GlowClientGlobals::deletePixmaps() +{ + PixmapCache::clear(); +} + +const TQString GlowClientGlobals::getPixmapTypeName(PixmapType type) +{ + switch(type) { + case (StickyOn): + return "StickyOn"; + case(StickyOff ): + return "StickyOff"; + case(Help): + return "Help"; + case(Iconify): + return "Iconify"; + case(MaximizeOn): + return "MaximizeOn"; + case(MaximizeOff): + return "MaximizeOff"; + case(Close): + return "Close"; + default: + return TQString(); + } +} + +bool GlowClientGlobals::createPixmap(PixmapType type, bool isActive) +{ + TQString theme_dir = KGlobal::dirs()->findResource ("data", + TQString("twin/glow-themes/") + _config->themeName + "/"); + + TQColor glow_color; + TQColor color = options()->color(ColorButtonBg, isActive); + + TQImage bg_image (theme_dir+_theme->backgroundPixmap); + TQImage fg_image; + TQImage glow_image; + + switch(type) { + case (StickyOn): + { + fg_image = TQImage (theme_dir+_theme->stickyOnPixmap); + glow_image = TQImage (theme_dir+_theme->stickyOnGlowPixmap); + glow_color = _config->stickyButtonGlowColor; + break; + } + case (StickyOff): + { + fg_image = TQImage (theme_dir+_theme->stickyOffPixmap); + glow_image = TQImage (theme_dir+_theme->stickyOffGlowPixmap); + glow_color = _config->stickyButtonGlowColor; + break; + } + case (Help): + { + fg_image = TQImage (theme_dir+_theme->helpPixmap); + glow_image = TQImage (theme_dir+_theme->helpGlowPixmap); + glow_color = _config->helpButtonGlowColor; + break; + } + case (Iconify): + { + fg_image = TQImage (theme_dir+_theme->iconifyPixmap); + glow_image = TQImage (theme_dir+_theme->iconifyGlowPixmap); + glow_color = _config->iconifyButtonGlowColor; + break; + } + case (MaximizeOn): + { + fg_image = TQImage (theme_dir+_theme->maximizeOnPixmap); + glow_image = TQImage (theme_dir+_theme->maximizeOnGlowPixmap); + glow_color = _config->maximizeButtonGlowColor; + break; + } + case (MaximizeOff): + { + fg_image = TQImage (theme_dir+_theme->maximizeOffPixmap); + glow_image = TQImage (theme_dir+_theme->maximizeOffGlowPixmap); + glow_color = _config->maximizeButtonGlowColor; + break; + } + case (Close): + { + fg_image = TQImage (theme_dir+_theme->closePixmap); + glow_image = TQImage (theme_dir+_theme->closeGlowPixmap); + glow_color = _config->closeButtonGlowColor; + break; + } + } + + if (bg_image.size() != _theme->buttonSize + || fg_image.size() != _theme->buttonSize + || glow_image.size() != _theme->buttonSize) + return false; + + TQPixmap * glowPm = buttonFactory()->createGlowButtonPixmap( + bg_image, fg_image, glow_image, + color, glow_color); + if (glowPm->isNull()) + return false; + PixmapCache::insert(getPixmapName(type, isActive), glowPm); + return true; +} + +GlowClientGlobals *GlowClientGlobals::m_instance = 0; + +GlowClientGlobals *GlowClientGlobals::instance() +{ + if( ! m_instance ) + { + m_instance = new GlowClientGlobals(); + } + return m_instance; +} + +//----------------------------------------------------------------------------- + +GlowClient::GlowClient( KDecorationBridge* b, KDecorationFactory* f ) + : KDecoration( b, f ), + m_stickyButton(0), m_helpButton(0), m_minimizeButton(0), + m_maximizeButton(0), m_closeButton(0), + m_leftButtonLayout(0), m_rightButtonLayout(0), _main_layout(0) +{ +} + +void GlowClient::init() +{ + createMainWidget(WResizeNoErase | WStaticContents | WRepaintNoErase); + widget()->installEventFilter(this); + + createButtons(); + resetLayout(); +} + +GlowClient::~GlowClient() +{ + PixmapCache::erase(TQString::number(widget()->winId())); +} + +void GlowClient::resizeEvent( TQResizeEvent * ) +{ + doShape(); + widget()->tqrepaint(false); +} + +void GlowClient::paintEvent( TQPaintEvent * ) +{ + GlowClientConfig *conf = GlowClientGlobals::instance()->config(); + TQRect r_this = widget()->rect(); + TQRect r_title = _title_spacer->tqgeometry(); + TQColorGroup titleCg = options()->tqcolorGroup(ColorTitleBar, isActive()); + TQColorGroup titleBlendCg=options()->tqcolorGroup(ColorTitleBlend, isActive()); + TQColorGroup cg = widget()->tqcolorGroup(); + TQColor titleColor = options()->color(ColorTitleBar, isActive()); + TQColor titleBlendColor = options()->color(ColorTitleBlend, isActive()); + TQColor bgColor = widget()->tqcolorGroup().background(); + TQPainter p; + TQPointArray pArray, pArray2, pArray3, pArray4; + + // pixmap for title bar + TQSize tBSize(width(), r_title.height()); + TQSize gradientPixmapSize (tBSize-TQSize(3,3)); + if (! gradientPixmapSize.isValid()) + gradientPixmapSize = TQSize(0,0); + KPixmap gradientPixmap(gradientPixmapSize); + if (! gradientPixmapSize.isNull()) + KPixmapEffect::gradient(gradientPixmap, titleColor, titleBlendColor, + (KPixmapEffect::GradientType) conf->titlebarGradientType); + + TQPixmap * title_buffer = new TQPixmap(tBSize); + p.begin(title_buffer); + if (! gradientPixmap.isNull()) + p.drawPixmap(2, 2, gradientPixmap); + + if (tBSize.width()>=3 && tBSize.height()>=3) + { + // draw caption + p.setFont(options()->font(isActive())); + p.setPen(options()->color(ColorFont, isActive())); + p.drawText(r_title.x(), 0, + r_title.width(), r_title.height(), + TQt::AlignLeft | TQt::AlignVCenter | TQt::SingleLine, caption()); + + // draw split color beneath buttons top right + pArray4 = TQPointArray(4); + pArray4.setPoint(0, tBSize.width()-1, tBSize.height()/2-1); + pArray4.setPoint(1, r_title.x()+r_title.width()-1+tBSize.height()/2, + tBSize.height()/2-1); + pArray4.setPoint(2, r_title.x()+r_title.width()-1, tBSize.height()); + pArray4.setPoint(3, tBSize.width()-1, tBSize.height()); + p.setPen(TQt::NoPen); + p.setBrush(bgColor); + p.drawPolygon(pArray4); + + // draw borders + pArray = TQPointArray(3); + pArray.setPoint(0, tBSize.width()-1, tBSize.height()/2-1); + pArray.setPoint(1, r_title.x()+r_title.width()-1+tBSize.height()/2, + tBSize.height()/2-1); + pArray.setPoint(2, r_title.x()+r_title.width()-1, tBSize.height()-1); + p.setPen(titleCg.mid()); + p.drawPolyline(pArray); + p.drawLine (0, tBSize.height()-1, r_title.x()+r_title.width()-1, tBSize.height()-1); + + pArray2 = TQPointArray(3); + pArray2.setPoint(0, 1, tBSize.height()-2); + pArray2.setPoint(1, 1, 1); + pArray2.setPoint(2, tBSize.width()-2, 1); + p.setPen(titleCg.light()); + p.drawPolyline(pArray2); + } + + pArray3 = TQPointArray(4); + pArray3.setPoint(0, 0, tBSize.height()-1); + pArray3.setPoint(1, 0, 0); + pArray3.setPoint(2, tBSize.width()-1, 0); + pArray3.setPoint(3, tBSize.width()-1, tBSize.height()-1); + p.setPen(TQt::black); + p.drawPolyline(pArray3); + p.end(); + + // insert title buffer in cache; before that, remove old buffer + PixmapCache::erase(TQString::number(widget()->winId())); + PixmapCache::insert(TQString::number(widget()->winId()), title_buffer); + + bitBlt(widget(), 0, 0, title_buffer); + for (unsigned int i=0; itqrepaint(false); + + p.begin(widget()); + p.setPen(TQt::black); + //----- + // draw borders + p.drawLine(0,tBSize.height(),0,r_this.height()-1); + p.drawLine(0,r_this.height()-1,r_this.width()-1,r_this.height()-1); + p.drawLine(r_this.width()-1,r_this.height()-1, + r_this.width()-1,tBSize.height()/2); + //----- + // fill content widget + p.fillRect(1, tBSize.height(), + r_this.width()-2, r_this.height()-tBSize.height()-1, + options()->tqcolorGroup(ColorFrame, isActive()).background()); + p.end(); + + // paint resize handle if necessary + if(conf->showResizeHandle && isResizable() && ! isShade() + && width()>=2 && height() >= RESIZE_HANDLE_HEIGHT) + { + p.begin(widget()); + p.setPen (TQt::black); + p.drawLine (1, height() - RESIZE_HANDLE_HEIGHT, + width()-2, height() - RESIZE_HANDLE_HEIGHT); + p.end(); + } +} + +void GlowClient::showEvent( TQShowEvent * ) +{ + doShape(); + widget()->tqrepaint(false); +} + +void GlowClient::mouseDoubleClickEvent( TQMouseEvent *e ) +{ + if(e->button() == Qt::LeftButton && _title_spacer->tqgeometry().contains(e->pos())) + titlebarDblClickOperation(); +} + +void GlowClient::wheelEvent( TQWheelEvent *e ) +{ + if (isSetShade() || TQRect( 0, 0, width(), titleHeight ).contains(e->pos())) + titlebarMouseWheelOperation( e->delta()); +} + +void GlowClient::activeChange() +{ + updateButtonPixmaps(); + widget()->tqrepaint(false); +} + +void GlowClient::iconChange() +{ + // we have no (t yet an) icon button, so do nothing +} + +void GlowClient::shadeChange() +{ +} + +void GlowClient::captionChange() +{ + widget()->update(_title_spacer->tqgeometry()); +} + +TQSize GlowClient::tqminimumSize() const +{ + return widget()->tqminimumSize(); +} + +void GlowClient::resize( const TQSize& s ) +{ + widget()->resize( s ); +} + +void GlowClient::borders( int& left, int& right, int& top, int& bottom ) const +{ + left = right = SIDE_MARGIN; + top = titleHeight + TITLE_MARGIN + 1; + if (GlowClientGlobals::instance()->config()->showResizeHandle + && isResizable()) + bottom = RESIZE_HANDLE_HEIGHT; + else + bottom = BOTTOM_MARGIN; +} + +void GlowClient::desktopChange() +{ + if (isOnAllDesktops()) { + m_stickyButton->setPixmapName( + GlowClientGlobals::instance()->getPixmapName( + GlowClientGlobals::StickyOn, isActive())); + m_stickyButton->setTipText(i18n("Not on all desktops")); + } else { + m_stickyButton->setPixmapName( + GlowClientGlobals::instance()->getPixmapName( + GlowClientGlobals::StickyOff, isActive())); + m_stickyButton->setTipText(i18n("On all desktops")); + } +} + +void GlowClient::maximizeChange() +{ + if (maximizeMode() == MaximizeFull) { + m_maximizeButton->setPixmapName( + GlowClientGlobals::instance()->getPixmapName( + GlowClientGlobals::MaximizeOn, isActive())); + m_maximizeButton->setTipText(i18n("Restore")); + } else { + m_maximizeButton->setPixmapName( + GlowClientGlobals::instance()->getPixmapName( + GlowClientGlobals::MaximizeOff, isActive())); + m_maximizeButton->setTipText(i18n("Maximize")); + } +} + +KDecoration::Position GlowClient::mousePosition(const TQPoint &pos) const +{ + Position m = PositionCenter; + + int bottomSize + = (GlowClientGlobals::instance()->config()->showResizeHandle) + ? RESIZE_HANDLE_HEIGHT : BOTTOM_MARGIN; + + const int range = 14 + 3*SIDE_MARGIN/2; + + if ( ( pos.x() > SIDE_MARGIN && pos.x() < width() - SIDE_MARGIN ) + && ( pos.y() > 4 && pos.y() < height() - bottomSize ) ) + m = PositionCenter; + else if ( pos.y() <= range && pos.x() <= range) + m = PositionTopLeft; + else if ( pos.y() >= height()-range && pos.x() >= width()-range) + m = PositionBottomRight; + else if ( pos.y() >= height()-range && pos.x() <= range) + m = PositionBottomLeft; + else if ( pos.y() <= range && pos.x() >= width()-range) + m = PositionTopRight; + else if ( pos.y() <= 4 ) + m = PositionTop; + else if ( pos.y() >= height()-bottomSize ) + m = PositionBottom; + else if ( pos.x() <= SIDE_MARGIN ) + m = PositionLeft; + else if ( pos.x() >= width()-SIDE_MARGIN ) + m = PositionRight; + else + m = PositionCenter; + + return m; +} + +void GlowClient::createButtons() +{ + GlowClientGlobals *globals = GlowClientGlobals::instance(); + GlowButtonFactory *factory = globals->buttonFactory(); + TQSize size = globals->theme()->buttonSize; + + m_stickyButton = factory->createGlowButton(widget(), + "StickyButton", isOnAllDesktops()?i18n("Not on all desktops"):i18n("On all desktops"), Qt::LeftButton|Qt::RightButton); + m_stickyButton->setFixedSize(size); + connect(m_stickyButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(toggleOnAllDesktops())); + m_buttonList.insert(m_buttonList.end(), m_stickyButton); + + m_helpButton = factory->createGlowButton(widget(), + "HelpButton", i18n("Help")); + m_helpButton->setFixedSize(size); + connect(m_helpButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(showContextHelp())); + m_buttonList.insert(m_buttonList.end(), m_helpButton); + + m_minimizeButton = factory->createGlowButton(widget(), + "IconifyButton", i18n("Minimize")); + m_minimizeButton->setFixedSize(size); + connect(m_minimizeButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(minimize())); + m_buttonList.insert(m_buttonList.end(), m_minimizeButton); + + m_maximizeButton=factory->createGlowButton(widget(), + "MaximizeButton", i18n("Maximize"), Qt::LeftButton|Qt::MidButton|Qt::RightButton); + m_maximizeButton->setFixedSize(size); + connect(m_maximizeButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotMaximize())); + m_buttonList.insert(m_buttonList.end(), m_maximizeButton); + + m_closeButton = factory->createGlowButton(widget(), + "CloseButton", i18n("Close")); + m_closeButton->setFixedSize(size); + connect(m_closeButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(closeWindow())); + m_buttonList.insert(m_buttonList.end(), m_closeButton); +} + +void GlowClient::resetLayout() +{ + _main_layout = new TQVBoxLayout(widget(), 0, 0); + _main_layout->setResizeMode (TQLayout::FreeResize); + + // update button positions and colors + updateButtonPositions(); + updateButtonPixmaps(); + + TQBoxLayout * topLayout = new TQBoxLayout(_main_layout, + TQBoxLayout::LeftToRight, 0, 0); + topLayout->setMargin(0); + topLayout->setSpacing(TITLE_SPACING); + topLayout->addSpacing(SIDE_MARGIN); + TQVBoxLayout *outerLeftLayout = new TQVBoxLayout(topLayout); + outerLeftLayout->addSpacing(TITLE_MARGIN); + outerLeftLayout->addItem(m_leftButtonLayout); + outerLeftLayout->addSpacing(1); + topLayout->addSpacing(SIDE_MARGIN); + + _title_spacer = new TQSpacerItem(0, titleHeight + TITLE_MARGIN + 1, + TQSizePolicy::Expanding, TQSizePolicy::Fixed); + topLayout->addItem(_title_spacer); + + topLayout->addSpacing(SIDE_MARGIN); + TQVBoxLayout *outerRightLayout = new TQVBoxLayout(topLayout); + outerRightLayout->addSpacing(TITLE_MARGIN); + outerRightLayout->addItem(m_rightButtonLayout); + outerRightLayout->addSpacing(1); + topLayout->addSpacing(SIDE_MARGIN); + + TQBoxLayout *midLayout = new TQBoxLayout( + _main_layout, TQBoxLayout::LeftToRight, 0, 0); + midLayout->addSpacing(SIDE_MARGIN); + if(isPreview()) + midLayout->addWidget( + new TQLabel( i18n( "
Glow preview
" ), widget())); + else + midLayout->addItem( new TQSpacerItem( 0, 0 )); + midLayout->addSpacing(SIDE_MARGIN); + + if(GlowClientGlobals::instance()->config()->showResizeHandle + && isResizable() ) { + _bottom_spacer = new TQSpacerItem(SIDE_MARGIN*2, + RESIZE_HANDLE_HEIGHT, TQSizePolicy::Expanding, TQSizePolicy::Minimum); + } else { + _bottom_spacer = new TQSpacerItem(SIDE_MARGIN*2, + BOTTOM_MARGIN, TQSizePolicy::Expanding, TQSizePolicy::Minimum); + } + _main_layout->addItem (_bottom_spacer); + _main_layout->setStretchFactor(topLayout, 0); + _main_layout->setStretchFactor(midLayout, 1); +} + +void GlowClient::updateButtonPositions() +{ + TQString buttons = options()->titleButtonsLeft() + "|" + + options()->titleButtonsRight(); + bool leftButtons=true; + + // hide all buttons + for( unsigned int i=0; ihide(); + + m_leftButtonList.clear(); + m_rightButtonList.clear(); + + // reset left and right button tqlayout + if(m_leftButtonLayout) + delete m_leftButtonLayout; + m_leftButtonLayout = new TQBoxLayout(0, TQBoxLayout::LeftToRight, 0, 0, 0); + m_leftButtonLayout->setMargin(0); + m_leftButtonLayout->setSpacing(TITLE_SPACING); + if(m_rightButtonLayout) + delete m_rightButtonLayout; + m_rightButtonLayout = new TQBoxLayout(0, TQBoxLayout::LeftToRight, 0, 0, 0); + m_rightButtonLayout->setMargin(0); + m_rightButtonLayout->setSpacing(TITLE_SPACING); + + for( unsigned int i=0; iaddSpacing(4); + else + m_rightButtonLayout->addSpacing(4); + } + else if( c=='|' ) + leftButtons = false; + + if (button) { + button->show(); // show visible buttons + if (leftButtons) { + m_leftButtonList.insert(m_leftButtonList.end(), button); + m_leftButtonLayout->addWidget(button); + } else { + m_rightButtonList.insert(m_rightButtonList.end(), button); + m_rightButtonLayout->addWidget(button); + } + } + } +} + +void GlowClient::updateButtonPixmaps() +{ + GlowClientGlobals *globals = GlowClientGlobals::instance(); + + if ( isOnAllDesktops() ) { + m_stickyButton->setPixmapName(globals->getPixmapName( + GlowClientGlobals::StickyOn, isActive())); + } else { + m_stickyButton->setPixmapName(globals->getPixmapName( + GlowClientGlobals::StickyOff, isActive())); + } + m_helpButton->setPixmapName(globals->getPixmapName( + GlowClientGlobals::Help, isActive())); + + m_minimizeButton->setPixmapName(globals->getPixmapName( + GlowClientGlobals::Iconify, isActive())); + + if ( maximizeMode() == MaximizeFull ) { + m_maximizeButton->setPixmapName(globals->getPixmapName( + GlowClientGlobals::MaximizeOn, isActive())); + } else { + m_maximizeButton->setPixmapName(globals->getPixmapName( + GlowClientGlobals::MaximizeOff, isActive())); + } + m_closeButton->setPixmapName(globals->getPixmapName( + GlowClientGlobals::Close, isActive())); +} + +void GlowClient::doShape() +{ + TQRegion mask(widget()->rect()); + // edges + + mask -= TQRegion(width()-1,0,1,1); + mask -= TQRegion(0,height()-1,1,1); + mask -= TQRegion(width()-1,height()-1,1,1); + setMask(mask); +} + +bool GlowClient::isLeft(GlowButton *button) +{ + for( unsigned int i=0; ilastButton()); +} + +bool GlowClient::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::Show: + showEvent( TQT_TQSHOWEVENT( e )); + return true; + case TQEvent::Wheel: + wheelEvent( TQT_TQWHEELEVENT( e )); + return true; + default: + break; + } + return false; +} + +KDecoration* GlowClientGlobals::createDecoration( KDecorationBridge* bridge ) +{ + return new GlowClient( bridge, this ); +} + +} // end of namespace + +extern "C" +KDE_EXPORT KDecorationFactory* create_factory() +{ + return Glow::GlowClientGlobals::instance(); +} + +#include "glowclient.moc" + diff --git a/twin-styles/glow/glowclient.h b/twin-styles/glow/glowclient.h new file mode 100644 index 00000000..9129dce0 --- /dev/null +++ b/twin-styles/glow/glowclient.h @@ -0,0 +1,206 @@ +/*************************************************************************** + glowclient.h - description + ------------------- + begin : Thu Sep 6 2001 + copyright : (C) 2001 by Henning Burchardt + email : h_burchardt@gmx.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. * + * * + ***************************************************************************/ + +#ifndef GLOW_CLIENT_H +#define GLOW_CLIENT_H + +#include +#include +#include +#include + +class TQPixmap; +class TQBitmap; +class TQTimer; +class TQBoxLayout; +class TQGridLayout; +class TQVBoxLayout; +class TQSpacerItem; + +namespace Glow +{ + +class GlowButton; +class GlowButtonFactory; + +//----------------------------------------------------------------------------- +// GlowTheme +//----------------------------------------------------------------------------- + +struct GlowTheme +{ + TQSize buttonSize; + + TQString backgroundPixmap; + TQString backgroundAlphaPixmap; + + TQString stickyOnPixmap; + TQString stickyOffPixmap; + TQString maximizeOnPixmap; + TQString maximizeOffPixmap; + TQString helpPixmap; + TQString closePixmap; + TQString iconifyPixmap; + + TQString stickyOnGlowPixmap; + TQString stickyOffGlowPixmap; + TQString maximizeOnGlowPixmap; + TQString maximizeOffGlowPixmap; + TQString helpGlowPixmap; + TQString closeGlowPixmap; + TQString iconifyGlowPixmap; +}; + +static GlowTheme default_glow_theme = { + TQSize (17, 17), + "background.png", "background_alpha.png", + "stickyon.png", "stickyoff.png", + "maximizeon.png", "maximizeoff.png", + "help.png", "close.png", "iconify.png", + "stickyon_glow.png", "stickyoff_glow.png", + "maximizeon_glow.png", "maximizeoff_glow.png", + "help_glow.png", "close_glow.png", "iconify_glow.png" }; + +//----------------------------------------------------------------------------- +// GlowClientConfig +//----------------------------------------------------------------------------- + +class GlowClientConfig +{ +public: + GlowClientConfig(); + + void load (KDecorationFactory *factory); + + TQColor stickyButtonGlowColor; + TQColor helpButtonGlowColor; + TQColor iconifyButtonGlowColor; + TQColor maximizeButtonGlowColor; + TQColor closeButtonGlowColor; + bool showResizeHandle; + int titlebarGradientType; + TQString themeName; +}; + +//----------------------------------------------------------------------------- +// GlowClientGlobals +//----------------------------------------------------------------------------- + +class GlowClientGlobals : public KDecorationFactory +{ +public: + enum PixmapType { StickyOn, StickyOff, Help, Iconify, MaximizeOn, + MaximizeOff, Close }; + + static GlowClientGlobals *instance(); + + ~GlowClientGlobals(); + + virtual KDecoration* createDecoration( KDecorationBridge* b ); + virtual bool reset( unsigned long changed ); + virtual bool supports( Ability ability ); + TQValueList< GlowClientGlobals::BorderSize > borderSizes() const; + + TQString getPixmapName(PixmapType type, bool isActive); + + GlowTheme * theme() const { return _theme; } + GlowClientConfig * config() const { return _config; } + GlowButtonFactory * buttonFactory() { return _button_factory; } + +private: + static GlowClientGlobals *m_instance; + + GlowTheme * _theme; + GlowClientConfig * _config; + GlowButtonFactory * _button_factory; + + GlowClientGlobals(); + void readConfig(); + void readTheme (); + bool createPixmaps(); + void deletePixmaps(); + bool createPixmap(PixmapType type,bool isActive); + const TQString getPixmapTypeName(PixmapType type); +}; + +//----------------------------------------------------------------------------- +// GlowClient +//----------------------------------------------------------------------------- + +class GlowClient : public KDecoration +{ + Q_OBJECT + TQ_OBJECT +public: + GlowClient( KDecorationBridge* b, KDecorationFactory* f ); + ~GlowClient(); + + virtual void init(); + virtual void borders( int&, int&, int&, int& ) const; + virtual void resize( const TQSize& ); + virtual TQSize tqminimumSize() const; + +protected: + virtual void resizeEvent( TQResizeEvent * ); + virtual void paintEvent( TQPaintEvent * ); + virtual void showEvent( TQShowEvent * ); + virtual void mouseDoubleClickEvent( TQMouseEvent * ); + virtual void wheelEvent( TQWheelEvent * ); + virtual void maximizeChange(); + virtual void activeChange(); + virtual void iconChange(); + virtual void desktopChange(); + virtual void shadeChange(); + virtual void captionChange(); + virtual Position mousePosition(const TQPoint &) const; + virtual bool eventFilter( TQObject* o, TQEvent* e ); + +private: + std::vector m_buttonList; + std::vector m_leftButtonList; + std::vector m_rightButtonList; + GlowButton *m_stickyButton; + GlowButton *m_helpButton; + GlowButton *m_minimizeButton; + GlowButton *m_maximizeButton; + GlowButton *m_closeButton; + TQBoxLayout *m_leftButtonLayout; + TQBoxLayout *m_rightButtonLayout; + TQSpacerItem * _bottom_spacer; + TQSpacerItem * _title_spacer; + TQVBoxLayout * _main_layout; + + void createButtons(); + void updateButtonPositions(); + /** + * Before this method is called we have to update the button + * positions with updateButtonPositions() because the pixmaps + * depend on the position + */ + void updateButtonPixmaps(); + void resetLayout(); + void doShape(); + bool isLeft(GlowButton *button); + bool isRight(GlowButton *button); + +protected slots: + void slotMaximize(); +}; + +} // namespace + +#endif diff --git a/twin-styles/glow/resources.h b/twin-styles/glow/resources.h new file mode 100644 index 00000000..a304b822 --- /dev/null +++ b/twin-styles/glow/resources.h @@ -0,0 +1,11 @@ +#ifndef RESOURCES_H +#define RESOURCES_H + +#define DEFAULT_CLOSE_BUTTON_COLOR TQt::red +#define DEFAULT_MAXIMIZE_BUTTON_COLOR TQt::yellow +#define DEFAULT_ICONIFY_BUTTON_COLOR TQt::green +#define DEFAULT_HELP_BUTTON_COLOR TQt::white +#define DEFAULT_STICKY_BUTTON_COLOR TQt::white + +#endif + diff --git a/twin-styles/glow/themes/CMakeLists.txt b/twin-styles/glow/themes/CMakeLists.txt new file mode 100644 index 00000000..2f725214 --- /dev/null +++ b/twin-styles/glow/themes/CMakeLists.txt @@ -0,0 +1,17 @@ +################################################# +# +# (C) 2011 Golubev Alexander +# fatzer2 (AT) gmail.com +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +add_subdirectory( default ) +add_subdirectory( glass ) +add_subdirectory( glass_huge ) +add_subdirectory( glass_large ) +add_subdirectory( glass_verylarge ) +add_subdirectory( square ) \ No newline at end of file diff --git a/twin-styles/glow/themes/Makefile.am b/twin-styles/glow/themes/Makefile.am new file mode 100644 index 00000000..ec2725a7 --- /dev/null +++ b/twin-styles/glow/themes/Makefile.am @@ -0,0 +1 @@ +SUBDIRS=default glass square glass_large glass_verylarge glass_huge diff --git a/twin-styles/glow/themes/default/CMakeLists.txt b/twin-styles/glow/themes/default/CMakeLists.txt new file mode 100644 index 00000000..433e22b6 --- /dev/null +++ b/twin-styles/glow/themes/default/CMakeLists.txt @@ -0,0 +1,22 @@ +################################################# +# +# (C) 2011 Golubev Alexander +# fatzer2 (AT) gmail.com +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +install( FILES + background.png + help.png help_glow.png + close.png close_glow.png + iconify.png iconify_glow.png + maximizeoff.png maximizeoff_glow.png + maximizeon.png maximizeon_glow.png + stickyon.png stickyon_glow.png + stickyoff.png stickyoff_glow.png + default.theme + DESTINATION ${DATA_INSTALL_DIR}/twin/glow-themes/default ) diff --git a/twin-styles/glow/themes/default/Makefile.am b/twin-styles/glow/themes/default/Makefile.am new file mode 100644 index 00000000..b3ef0fa5 --- /dev/null +++ b/twin-styles/glow/themes/default/Makefile.am @@ -0,0 +1,17 @@ +linkdir = $(kde_datadir)/twin/glow-themes/default +link_DATA = \ +background.png \ +help.png help_glow.png \ +close.png close_glow.png \ +iconify.png iconify_glow.png \ +maximizeoff.png maximizeoff_glow.png \ +maximizeon.png maximizeon_glow.png \ +stickyon.png stickyon_glow.png \ +stickyoff.png stickyoff_glow.png \ +default.theme + +EXTRA_DIST = $(link_DATA) + +###KMAKE-start (don't edit or delete this block) + +###KMAKE-end diff --git a/twin-styles/glow/themes/default/background.png b/twin-styles/glow/themes/default/background.png new file mode 100644 index 00000000..3fcbcdf5 Binary files /dev/null and b/twin-styles/glow/themes/default/background.png differ diff --git a/twin-styles/glow/themes/default/close.png b/twin-styles/glow/themes/default/close.png new file mode 100644 index 00000000..898a368a Binary files /dev/null and b/twin-styles/glow/themes/default/close.png differ diff --git a/twin-styles/glow/themes/default/close_glow.png b/twin-styles/glow/themes/default/close_glow.png new file mode 100644 index 00000000..69b36e92 Binary files /dev/null and b/twin-styles/glow/themes/default/close_glow.png differ diff --git a/twin-styles/glow/themes/default/default.theme b/twin-styles/glow/themes/default/default.theme new file mode 100644 index 00000000..26f00feb --- /dev/null +++ b/twin-styles/glow/themes/default/default.theme @@ -0,0 +1,19 @@ +buttonSize=17,17 + +backgroundPixmap=background.png + +stickyOnPixmap=stickyon.png +stickyOffPixmap=stickyoff.png +maximizeOnPixmap=maximizeon.png +maximizeOffPixmap=maximizeoff.png +helpPixmap=help.png +closePixmap=close.png +iconifyPixmap=iconify.png + +stickyOnGlowPixmap=stickyon_glow.png +stickyOffGlowPixmap=stickyoff_glow.png +maximizeOnGlowPixmap=maximizeon_glow.png +maximizeOffGlowPixmap=maximizeoff_glow.png +helpGlowPixmap=help_glow.png +closeGlowPixmap=close_glow.png +iconifyGlowPixmap=iconify_glow.png diff --git a/twin-styles/glow/themes/default/help.png b/twin-styles/glow/themes/default/help.png new file mode 100644 index 00000000..c3ed65ee Binary files /dev/null and b/twin-styles/glow/themes/default/help.png differ diff --git a/twin-styles/glow/themes/default/help_glow.png b/twin-styles/glow/themes/default/help_glow.png new file mode 100644 index 00000000..79a5006a Binary files /dev/null and b/twin-styles/glow/themes/default/help_glow.png differ diff --git a/twin-styles/glow/themes/default/iconify.png b/twin-styles/glow/themes/default/iconify.png new file mode 100644 index 00000000..94fc6338 Binary files /dev/null and b/twin-styles/glow/themes/default/iconify.png differ diff --git a/twin-styles/glow/themes/default/iconify_glow.png b/twin-styles/glow/themes/default/iconify_glow.png new file mode 100644 index 00000000..8b4d1413 Binary files /dev/null and b/twin-styles/glow/themes/default/iconify_glow.png differ diff --git a/twin-styles/glow/themes/default/maximizeoff.png b/twin-styles/glow/themes/default/maximizeoff.png new file mode 100644 index 00000000..e60cdc97 Binary files /dev/null and b/twin-styles/glow/themes/default/maximizeoff.png differ diff --git a/twin-styles/glow/themes/default/maximizeoff_glow.png b/twin-styles/glow/themes/default/maximizeoff_glow.png new file mode 100644 index 00000000..25f4c8ec Binary files /dev/null and b/twin-styles/glow/themes/default/maximizeoff_glow.png differ diff --git a/twin-styles/glow/themes/default/maximizeon.png b/twin-styles/glow/themes/default/maximizeon.png new file mode 100644 index 00000000..3976411f Binary files /dev/null and b/twin-styles/glow/themes/default/maximizeon.png differ diff --git a/twin-styles/glow/themes/default/maximizeon_glow.png b/twin-styles/glow/themes/default/maximizeon_glow.png new file mode 100644 index 00000000..941ed849 Binary files /dev/null and b/twin-styles/glow/themes/default/maximizeon_glow.png differ diff --git a/twin-styles/glow/themes/default/stickyoff.png b/twin-styles/glow/themes/default/stickyoff.png new file mode 100644 index 00000000..3600e326 Binary files /dev/null and b/twin-styles/glow/themes/default/stickyoff.png differ diff --git a/twin-styles/glow/themes/default/stickyoff_glow.png b/twin-styles/glow/themes/default/stickyoff_glow.png new file mode 100644 index 00000000..5c9861a0 Binary files /dev/null and b/twin-styles/glow/themes/default/stickyoff_glow.png differ diff --git a/twin-styles/glow/themes/default/stickyon.png b/twin-styles/glow/themes/default/stickyon.png new file mode 100644 index 00000000..a84941a3 Binary files /dev/null and b/twin-styles/glow/themes/default/stickyon.png differ diff --git a/twin-styles/glow/themes/default/stickyon_glow.png b/twin-styles/glow/themes/default/stickyon_glow.png new file mode 100644 index 00000000..905653e5 Binary files /dev/null and b/twin-styles/glow/themes/default/stickyon_glow.png differ diff --git a/twin-styles/glow/themes/glass/CMakeLists.txt b/twin-styles/glow/themes/glass/CMakeLists.txt new file mode 100644 index 00000000..279668d3 --- /dev/null +++ b/twin-styles/glow/themes/glass/CMakeLists.txt @@ -0,0 +1,22 @@ +################################################# +# +# (C) 2011 Golubev Alexander +# fatzer2 (AT) gmail.com +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +install( FILES + background.png + help.png help_glow.png + close.png close_glow.png + iconify.png iconify_glow.png + maximizeoff.png maximizeoff_glow.png + maximizeon.png maximizeon_glow.png + stickyon.png stickyon_glow.png + stickyoff.png stickyoff_glow.png + glass.theme + DESTINATION ${DATA_INSTALL_DIR}/twin/glow-themes/glass ) diff --git a/twin-styles/glow/themes/glass/Makefile.am b/twin-styles/glow/themes/glass/Makefile.am new file mode 100644 index 00000000..aeff2c35 --- /dev/null +++ b/twin-styles/glow/themes/glass/Makefile.am @@ -0,0 +1,17 @@ +linkdir = $(kde_datadir)/twin/glow-themes/glass +link_DATA = \ +background.png \ +help.png help_glow.png \ +close.png close_glow.png \ +iconify.png iconify_glow.png \ +maximizeoff.png maximizeoff_glow.png \ +maximizeon.png maximizeon_glow.png \ +stickyon.png stickyon_glow.png \ +stickyoff.png stickyoff_glow.png \ +glass.theme + +EXTRA_DIST = $(link_DATA) + +###KMAKE-start (don't edit or delete this block) + +###KMAKE-end diff --git a/twin-styles/glow/themes/glass/background.png b/twin-styles/glow/themes/glass/background.png new file mode 100644 index 00000000..97d278a0 Binary files /dev/null and b/twin-styles/glow/themes/glass/background.png differ diff --git a/twin-styles/glow/themes/glass/close.png b/twin-styles/glow/themes/glass/close.png new file mode 100644 index 00000000..8b61cfd2 Binary files /dev/null and b/twin-styles/glow/themes/glass/close.png differ diff --git a/twin-styles/glow/themes/glass/close_glow.png b/twin-styles/glow/themes/glass/close_glow.png new file mode 100644 index 00000000..2be50e89 Binary files /dev/null and b/twin-styles/glow/themes/glass/close_glow.png differ diff --git a/twin-styles/glow/themes/glass/glass.theme b/twin-styles/glow/themes/glass/glass.theme new file mode 100644 index 00000000..9facf271 --- /dev/null +++ b/twin-styles/glow/themes/glass/glass.theme @@ -0,0 +1,19 @@ +buttonSize=19,19 + +backgroundPixmap=background.png + +stickyOnPixmap=stickyon.png +stickyOffPixmap=stickyoff.png +maximizeOnPixmap=maximizeon.png +maximizeOffPixmap=maximizeoff.png +helpPixmap=help.png +closePixmap=close.png +iconifyPixmap=iconify.png + +stickyOnGlowPixmap=stickyon_glow.png +stickyOffGlowPixmap=stickyoff_glow.png +maximizeOnGlowPixmap=maximizeon_glow.png +maximizeOffGlowPixmap=maximizeoff_glow.png +helpGlowPixmap=help_glow.png +closeGlowPixmap=close_glow.png +iconifyGlowPixmap=iconify_glow.png diff --git a/twin-styles/glow/themes/glass/help.png b/twin-styles/glow/themes/glass/help.png new file mode 100644 index 00000000..7a12fe88 Binary files /dev/null and b/twin-styles/glow/themes/glass/help.png differ diff --git a/twin-styles/glow/themes/glass/help_glow.png b/twin-styles/glow/themes/glass/help_glow.png new file mode 100644 index 00000000..77976ff1 Binary files /dev/null and b/twin-styles/glow/themes/glass/help_glow.png differ diff --git a/twin-styles/glow/themes/glass/iconify.png b/twin-styles/glow/themes/glass/iconify.png new file mode 100644 index 00000000..55b9f6a9 Binary files /dev/null and b/twin-styles/glow/themes/glass/iconify.png differ diff --git a/twin-styles/glow/themes/glass/iconify_glow.png b/twin-styles/glow/themes/glass/iconify_glow.png new file mode 100644 index 00000000..ff741dbe Binary files /dev/null and b/twin-styles/glow/themes/glass/iconify_glow.png differ diff --git a/twin-styles/glow/themes/glass/maximizeoff.png b/twin-styles/glow/themes/glass/maximizeoff.png new file mode 100644 index 00000000..b08d34c1 Binary files /dev/null and b/twin-styles/glow/themes/glass/maximizeoff.png differ diff --git a/twin-styles/glow/themes/glass/maximizeoff_glow.png b/twin-styles/glow/themes/glass/maximizeoff_glow.png new file mode 100644 index 00000000..8ff43447 Binary files /dev/null and b/twin-styles/glow/themes/glass/maximizeoff_glow.png differ diff --git a/twin-styles/glow/themes/glass/maximizeon.png b/twin-styles/glow/themes/glass/maximizeon.png new file mode 100644 index 00000000..8894007e Binary files /dev/null and b/twin-styles/glow/themes/glass/maximizeon.png differ diff --git a/twin-styles/glow/themes/glass/maximizeon_glow.png b/twin-styles/glow/themes/glass/maximizeon_glow.png new file mode 100644 index 00000000..7fe3c840 Binary files /dev/null and b/twin-styles/glow/themes/glass/maximizeon_glow.png differ diff --git a/twin-styles/glow/themes/glass/stickyoff.png b/twin-styles/glow/themes/glass/stickyoff.png new file mode 100644 index 00000000..d87cfe9d Binary files /dev/null and b/twin-styles/glow/themes/glass/stickyoff.png differ diff --git a/twin-styles/glow/themes/glass/stickyoff_glow.png b/twin-styles/glow/themes/glass/stickyoff_glow.png new file mode 100644 index 00000000..f682df78 Binary files /dev/null and b/twin-styles/glow/themes/glass/stickyoff_glow.png differ diff --git a/twin-styles/glow/themes/glass/stickyon.png b/twin-styles/glow/themes/glass/stickyon.png new file mode 100644 index 00000000..f044c134 Binary files /dev/null and b/twin-styles/glow/themes/glass/stickyon.png differ diff --git a/twin-styles/glow/themes/glass/stickyon_glow.png b/twin-styles/glow/themes/glass/stickyon_glow.png new file mode 100644 index 00000000..0b468787 Binary files /dev/null and b/twin-styles/glow/themes/glass/stickyon_glow.png differ diff --git a/twin-styles/glow/themes/glass_huge/CMakeLists.txt b/twin-styles/glow/themes/glass_huge/CMakeLists.txt new file mode 100644 index 00000000..92021eff --- /dev/null +++ b/twin-styles/glow/themes/glass_huge/CMakeLists.txt @@ -0,0 +1,22 @@ +################################################# +# +# (C) 2011 Golubev Alexander +# fatzer2 (AT) gmail.com +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +install( FILES + background.png + help.png help_glow.png + close.png close_glow.png + iconify.png iconify_glow.png + maximizeoff.png maximizeoff_glow.png + maximizeon.png maximizeon_glow.png + stickyon.png stickyon_glow.png + stickyoff.png stickyoff_glow.png + glass_huge.theme + DESTINATION ${DATA_INSTALL_DIR}/twin/glow-themes/glass_huge ) diff --git a/twin-styles/glow/themes/glass_huge/Makefile.am b/twin-styles/glow/themes/glass_huge/Makefile.am new file mode 100644 index 00000000..244f67a0 --- /dev/null +++ b/twin-styles/glow/themes/glass_huge/Makefile.am @@ -0,0 +1,17 @@ +linkdir = $(kde_datadir)/twin/glow-themes/glass_huge +link_DATA = \ +background.png \ +help.png help_glow.png \ +close.png close_glow.png \ +iconify.png iconify_glow.png \ +maximizeoff.png maximizeoff_glow.png \ +maximizeon.png maximizeon_glow.png \ +stickyon.png stickyon_glow.png \ +stickyoff.png stickyoff_glow.png \ +glass_huge.theme + +EXTRA_DIST = $(link_DATA) + +###KMAKE-start (don't edit or delete this block) + +###KMAKE-end diff --git a/twin-styles/glow/themes/glass_huge/background.png b/twin-styles/glow/themes/glass_huge/background.png new file mode 100644 index 00000000..f69e109b Binary files /dev/null and b/twin-styles/glow/themes/glass_huge/background.png differ diff --git a/twin-styles/glow/themes/glass_huge/close.png b/twin-styles/glow/themes/glass_huge/close.png new file mode 100644 index 00000000..3f1c7369 Binary files /dev/null and b/twin-styles/glow/themes/glass_huge/close.png differ diff --git a/twin-styles/glow/themes/glass_huge/close_glow.png b/twin-styles/glow/themes/glass_huge/close_glow.png new file mode 100644 index 00000000..00b647dc Binary files /dev/null and b/twin-styles/glow/themes/glass_huge/close_glow.png differ diff --git a/twin-styles/glow/themes/glass_huge/glass_huge.theme b/twin-styles/glow/themes/glass_huge/glass_huge.theme new file mode 100644 index 00000000..d8c41f52 --- /dev/null +++ b/twin-styles/glow/themes/glass_huge/glass_huge.theme @@ -0,0 +1,19 @@ +buttonSize=40,40 + +backgroundPixmap=background.png + +stickyOnPixmap=stickyon.png +stickyOffPixmap=stickyoff.png +maximizeOnPixmap=maximizeon.png +maximizeOffPixmap=maximizeoff.png +helpPixmap=help.png +closePixmap=close.png +iconifyPixmap=iconify.png + +stickyOnGlowPixmap=stickyon_glow.png +stickyOffGlowPixmap=stickyoff_glow.png +maximizeOnGlowPixmap=maximizeon_glow.png +maximizeOffGlowPixmap=maximizeoff_glow.png +helpGlowPixmap=help_glow.png +closeGlowPixmap=close_glow.png +iconifyGlowPixmap=iconify_glow.png diff --git a/twin-styles/glow/themes/glass_huge/help.png b/twin-styles/glow/themes/glass_huge/help.png new file mode 100644 index 00000000..a391ce94 Binary files /dev/null and b/twin-styles/glow/themes/glass_huge/help.png differ diff --git a/twin-styles/glow/themes/glass_huge/help_glow.png b/twin-styles/glow/themes/glass_huge/help_glow.png new file mode 100644 index 00000000..a8237795 Binary files /dev/null and b/twin-styles/glow/themes/glass_huge/help_glow.png differ diff --git a/twin-styles/glow/themes/glass_huge/iconify.png b/twin-styles/glow/themes/glass_huge/iconify.png new file mode 100644 index 00000000..b3219692 Binary files /dev/null and b/twin-styles/glow/themes/glass_huge/iconify.png differ diff --git a/twin-styles/glow/themes/glass_huge/iconify_glow.png b/twin-styles/glow/themes/glass_huge/iconify_glow.png new file mode 100644 index 00000000..a5950bcc Binary files /dev/null and b/twin-styles/glow/themes/glass_huge/iconify_glow.png differ diff --git a/twin-styles/glow/themes/glass_huge/maximizeoff.png b/twin-styles/glow/themes/glass_huge/maximizeoff.png new file mode 100644 index 00000000..b6ca8c0b Binary files /dev/null and b/twin-styles/glow/themes/glass_huge/maximizeoff.png differ diff --git a/twin-styles/glow/themes/glass_huge/maximizeoff_glow.png b/twin-styles/glow/themes/glass_huge/maximizeoff_glow.png new file mode 100644 index 00000000..deb8b29f Binary files /dev/null and b/twin-styles/glow/themes/glass_huge/maximizeoff_glow.png differ diff --git a/twin-styles/glow/themes/glass_huge/maximizeon.png b/twin-styles/glow/themes/glass_huge/maximizeon.png new file mode 100644 index 00000000..bcccef1f Binary files /dev/null and b/twin-styles/glow/themes/glass_huge/maximizeon.png differ diff --git a/twin-styles/glow/themes/glass_huge/maximizeon_glow.png b/twin-styles/glow/themes/glass_huge/maximizeon_glow.png new file mode 100644 index 00000000..410296b1 Binary files /dev/null and b/twin-styles/glow/themes/glass_huge/maximizeon_glow.png differ diff --git a/twin-styles/glow/themes/glass_huge/stickyoff.png b/twin-styles/glow/themes/glass_huge/stickyoff.png new file mode 100644 index 00000000..db79fec8 Binary files /dev/null and b/twin-styles/glow/themes/glass_huge/stickyoff.png differ diff --git a/twin-styles/glow/themes/glass_huge/stickyoff_glow.png b/twin-styles/glow/themes/glass_huge/stickyoff_glow.png new file mode 100644 index 00000000..ff8377b1 Binary files /dev/null and b/twin-styles/glow/themes/glass_huge/stickyoff_glow.png differ diff --git a/twin-styles/glow/themes/glass_huge/stickyon.png b/twin-styles/glow/themes/glass_huge/stickyon.png new file mode 100644 index 00000000..c6b1f6bc Binary files /dev/null and b/twin-styles/glow/themes/glass_huge/stickyon.png differ diff --git a/twin-styles/glow/themes/glass_huge/stickyon_glow.png b/twin-styles/glow/themes/glass_huge/stickyon_glow.png new file mode 100644 index 00000000..46d8470b Binary files /dev/null and b/twin-styles/glow/themes/glass_huge/stickyon_glow.png differ diff --git a/twin-styles/glow/themes/glass_large/CMakeLists.txt b/twin-styles/glow/themes/glass_large/CMakeLists.txt new file mode 100644 index 00000000..597d15c1 --- /dev/null +++ b/twin-styles/glow/themes/glass_large/CMakeLists.txt @@ -0,0 +1,22 @@ +################################################# +# +# (C) 2011 Golubev Alexander +# fatzer2 (AT) gmail.com +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +install( FILES + background.png + help.png help_glow.png + close.png close_glow.png + iconify.png iconify_glow.png + maximizeoff.png maximizeoff_glow.png + maximizeon.png maximizeon_glow.png + stickyon.png stickyon_glow.png + stickyoff.png stickyoff_glow.png + glass_large.theme + DESTINATION ${DATA_INSTALL_DIR}/twin/glow-themes/glass_large ) diff --git a/twin-styles/glow/themes/glass_large/Makefile.am b/twin-styles/glow/themes/glass_large/Makefile.am new file mode 100644 index 00000000..353e4b6f --- /dev/null +++ b/twin-styles/glow/themes/glass_large/Makefile.am @@ -0,0 +1,17 @@ +linkdir = $(kde_datadir)/twin/glow-themes/glass_large +link_DATA = \ +background.png \ +help.png help_glow.png \ +close.png close_glow.png \ +iconify.png iconify_glow.png \ +maximizeoff.png maximizeoff_glow.png \ +maximizeon.png maximizeon_glow.png \ +stickyon.png stickyon_glow.png \ +stickyoff.png stickyoff_glow.png \ +glass_large.theme + +EXTRA_DIST = $(link_DATA) + +###KMAKE-start (don't edit or delete this block) + +###KMAKE-end diff --git a/twin-styles/glow/themes/glass_large/background.png b/twin-styles/glow/themes/glass_large/background.png new file mode 100644 index 00000000..860e346f Binary files /dev/null and b/twin-styles/glow/themes/glass_large/background.png differ diff --git a/twin-styles/glow/themes/glass_large/close.png b/twin-styles/glow/themes/glass_large/close.png new file mode 100644 index 00000000..4e180281 Binary files /dev/null and b/twin-styles/glow/themes/glass_large/close.png differ diff --git a/twin-styles/glow/themes/glass_large/close_glow.png b/twin-styles/glow/themes/glass_large/close_glow.png new file mode 100644 index 00000000..59976dd3 Binary files /dev/null and b/twin-styles/glow/themes/glass_large/close_glow.png differ diff --git a/twin-styles/glow/themes/glass_large/glass_large.theme b/twin-styles/glow/themes/glass_large/glass_large.theme new file mode 100644 index 00000000..1fdf6832 --- /dev/null +++ b/twin-styles/glow/themes/glass_large/glass_large.theme @@ -0,0 +1,19 @@ +buttonSize=23,23 + +backgroundPixmap=background.png + +stickyOnPixmap=stickyon.png +stickyOffPixmap=stickyoff.png +maximizeOnPixmap=maximizeon.png +maximizeOffPixmap=maximizeoff.png +helpPixmap=help.png +closePixmap=close.png +iconifyPixmap=iconify.png + +stickyOnGlowPixmap=stickyon_glow.png +stickyOffGlowPixmap=stickyoff_glow.png +maximizeOnGlowPixmap=maximizeon_glow.png +maximizeOffGlowPixmap=maximizeoff_glow.png +helpGlowPixmap=help_glow.png +closeGlowPixmap=close_glow.png +iconifyGlowPixmap=iconify_glow.png diff --git a/twin-styles/glow/themes/glass_large/help.png b/twin-styles/glow/themes/glass_large/help.png new file mode 100644 index 00000000..464a7d49 Binary files /dev/null and b/twin-styles/glow/themes/glass_large/help.png differ diff --git a/twin-styles/glow/themes/glass_large/help_glow.png b/twin-styles/glow/themes/glass_large/help_glow.png new file mode 100644 index 00000000..21e94cd0 Binary files /dev/null and b/twin-styles/glow/themes/glass_large/help_glow.png differ diff --git a/twin-styles/glow/themes/glass_large/iconify.png b/twin-styles/glow/themes/glass_large/iconify.png new file mode 100644 index 00000000..c148f4bb Binary files /dev/null and b/twin-styles/glow/themes/glass_large/iconify.png differ diff --git a/twin-styles/glow/themes/glass_large/iconify_glow.png b/twin-styles/glow/themes/glass_large/iconify_glow.png new file mode 100644 index 00000000..9daa831b Binary files /dev/null and b/twin-styles/glow/themes/glass_large/iconify_glow.png differ diff --git a/twin-styles/glow/themes/glass_large/maximizeoff.png b/twin-styles/glow/themes/glass_large/maximizeoff.png new file mode 100644 index 00000000..40580530 Binary files /dev/null and b/twin-styles/glow/themes/glass_large/maximizeoff.png differ diff --git a/twin-styles/glow/themes/glass_large/maximizeoff_glow.png b/twin-styles/glow/themes/glass_large/maximizeoff_glow.png new file mode 100644 index 00000000..164aadbf Binary files /dev/null and b/twin-styles/glow/themes/glass_large/maximizeoff_glow.png differ diff --git a/twin-styles/glow/themes/glass_large/maximizeon.png b/twin-styles/glow/themes/glass_large/maximizeon.png new file mode 100644 index 00000000..34e9425a Binary files /dev/null and b/twin-styles/glow/themes/glass_large/maximizeon.png differ diff --git a/twin-styles/glow/themes/glass_large/maximizeon_glow.png b/twin-styles/glow/themes/glass_large/maximizeon_glow.png new file mode 100644 index 00000000..6038c045 Binary files /dev/null and b/twin-styles/glow/themes/glass_large/maximizeon_glow.png differ diff --git a/twin-styles/glow/themes/glass_large/stickyoff.png b/twin-styles/glow/themes/glass_large/stickyoff.png new file mode 100644 index 00000000..a29cde1a Binary files /dev/null and b/twin-styles/glow/themes/glass_large/stickyoff.png differ diff --git a/twin-styles/glow/themes/glass_large/stickyoff_glow.png b/twin-styles/glow/themes/glass_large/stickyoff_glow.png new file mode 100644 index 00000000..76c4781e Binary files /dev/null and b/twin-styles/glow/themes/glass_large/stickyoff_glow.png differ diff --git a/twin-styles/glow/themes/glass_large/stickyon.png b/twin-styles/glow/themes/glass_large/stickyon.png new file mode 100644 index 00000000..c805faf4 Binary files /dev/null and b/twin-styles/glow/themes/glass_large/stickyon.png differ diff --git a/twin-styles/glow/themes/glass_large/stickyon_glow.png b/twin-styles/glow/themes/glass_large/stickyon_glow.png new file mode 100644 index 00000000..7a6b9ec4 Binary files /dev/null and b/twin-styles/glow/themes/glass_large/stickyon_glow.png differ diff --git a/twin-styles/glow/themes/glass_verylarge/CMakeLists.txt b/twin-styles/glow/themes/glass_verylarge/CMakeLists.txt new file mode 100644 index 00000000..5fd50a91 --- /dev/null +++ b/twin-styles/glow/themes/glass_verylarge/CMakeLists.txt @@ -0,0 +1,22 @@ +################################################# +# +# (C) 2011 Golubev Alexander +# fatzer2 (AT) gmail.com +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +install( FILES + background.png + help.png help_glow.png + close.png close_glow.png + iconify.png iconify_glow.png + maximizeoff.png maximizeoff_glow.png + maximizeon.png maximizeon_glow.png + stickyon.png stickyon_glow.png + stickyoff.png stickyoff_glow.png + glass_verylarge.theme + DESTINATION ${DATA_INSTALL_DIR}/twin/glow-themes/glass_verylarge ) diff --git a/twin-styles/glow/themes/glass_verylarge/Makefile.am b/twin-styles/glow/themes/glass_verylarge/Makefile.am new file mode 100644 index 00000000..ab67c5db --- /dev/null +++ b/twin-styles/glow/themes/glass_verylarge/Makefile.am @@ -0,0 +1,17 @@ +linkdir = $(kde_datadir)/twin/glow-themes/glass_verylarge +link_DATA = \ +background.png \ +help.png help_glow.png \ +close.png close_glow.png \ +iconify.png iconify_glow.png \ +maximizeoff.png maximizeoff_glow.png \ +maximizeon.png maximizeon_glow.png \ +stickyon.png stickyon_glow.png \ +stickyoff.png stickyoff_glow.png \ +glass_verylarge.theme + +EXTRA_DIST = $(link_DATA) + +###KMAKE-start (don't edit or delete this block) + +###KMAKE-end diff --git a/twin-styles/glow/themes/glass_verylarge/background.png b/twin-styles/glow/themes/glass_verylarge/background.png new file mode 100644 index 00000000..ed032232 Binary files /dev/null and b/twin-styles/glow/themes/glass_verylarge/background.png differ diff --git a/twin-styles/glow/themes/glass_verylarge/close.png b/twin-styles/glow/themes/glass_verylarge/close.png new file mode 100644 index 00000000..15dc4b50 Binary files /dev/null and b/twin-styles/glow/themes/glass_verylarge/close.png differ diff --git a/twin-styles/glow/themes/glass_verylarge/close_glow.png b/twin-styles/glow/themes/glass_verylarge/close_glow.png new file mode 100644 index 00000000..9207e37e Binary files /dev/null and b/twin-styles/glow/themes/glass_verylarge/close_glow.png differ diff --git a/twin-styles/glow/themes/glass_verylarge/glass_verylarge.theme b/twin-styles/glow/themes/glass_verylarge/glass_verylarge.theme new file mode 100644 index 00000000..36368a8d --- /dev/null +++ b/twin-styles/glow/themes/glass_verylarge/glass_verylarge.theme @@ -0,0 +1,19 @@ +buttonSize=30,30 + +backgroundPixmap=background.png + +stickyOnPixmap=stickyon.png +stickyOffPixmap=stickyoff.png +maximizeOnPixmap=maximizeon.png +maximizeOffPixmap=maximizeoff.png +helpPixmap=help.png +closePixmap=close.png +iconifyPixmap=iconify.png + +stickyOnGlowPixmap=stickyon_glow.png +stickyOffGlowPixmap=stickyoff_glow.png +maximizeOnGlowPixmap=maximizeon_glow.png +maximizeOffGlowPixmap=maximizeoff_glow.png +helpGlowPixmap=help_glow.png +closeGlowPixmap=close_glow.png +iconifyGlowPixmap=iconify_glow.png diff --git a/twin-styles/glow/themes/glass_verylarge/help.png b/twin-styles/glow/themes/glass_verylarge/help.png new file mode 100644 index 00000000..3a2d0c9d Binary files /dev/null and b/twin-styles/glow/themes/glass_verylarge/help.png differ diff --git a/twin-styles/glow/themes/glass_verylarge/help_glow.png b/twin-styles/glow/themes/glass_verylarge/help_glow.png new file mode 100644 index 00000000..29e6edf9 Binary files /dev/null and b/twin-styles/glow/themes/glass_verylarge/help_glow.png differ diff --git a/twin-styles/glow/themes/glass_verylarge/iconify.png b/twin-styles/glow/themes/glass_verylarge/iconify.png new file mode 100644 index 00000000..2d760e3d Binary files /dev/null and b/twin-styles/glow/themes/glass_verylarge/iconify.png differ diff --git a/twin-styles/glow/themes/glass_verylarge/iconify_glow.png b/twin-styles/glow/themes/glass_verylarge/iconify_glow.png new file mode 100644 index 00000000..01f474e5 Binary files /dev/null and b/twin-styles/glow/themes/glass_verylarge/iconify_glow.png differ diff --git a/twin-styles/glow/themes/glass_verylarge/maximizeoff.png b/twin-styles/glow/themes/glass_verylarge/maximizeoff.png new file mode 100644 index 00000000..4224aa05 Binary files /dev/null and b/twin-styles/glow/themes/glass_verylarge/maximizeoff.png differ diff --git a/twin-styles/glow/themes/glass_verylarge/maximizeoff_glow.png b/twin-styles/glow/themes/glass_verylarge/maximizeoff_glow.png new file mode 100644 index 00000000..9327994a Binary files /dev/null and b/twin-styles/glow/themes/glass_verylarge/maximizeoff_glow.png differ diff --git a/twin-styles/glow/themes/glass_verylarge/maximizeon.png b/twin-styles/glow/themes/glass_verylarge/maximizeon.png new file mode 100644 index 00000000..2d90482f Binary files /dev/null and b/twin-styles/glow/themes/glass_verylarge/maximizeon.png differ diff --git a/twin-styles/glow/themes/glass_verylarge/maximizeon_glow.png b/twin-styles/glow/themes/glass_verylarge/maximizeon_glow.png new file mode 100644 index 00000000..3b9a6bf4 Binary files /dev/null and b/twin-styles/glow/themes/glass_verylarge/maximizeon_glow.png differ diff --git a/twin-styles/glow/themes/glass_verylarge/stickyoff.png b/twin-styles/glow/themes/glass_verylarge/stickyoff.png new file mode 100644 index 00000000..a2c26583 Binary files /dev/null and b/twin-styles/glow/themes/glass_verylarge/stickyoff.png differ diff --git a/twin-styles/glow/themes/glass_verylarge/stickyoff_glow.png b/twin-styles/glow/themes/glass_verylarge/stickyoff_glow.png new file mode 100644 index 00000000..c6e57e21 Binary files /dev/null and b/twin-styles/glow/themes/glass_verylarge/stickyoff_glow.png differ diff --git a/twin-styles/glow/themes/glass_verylarge/stickyon.png b/twin-styles/glow/themes/glass_verylarge/stickyon.png new file mode 100644 index 00000000..56cde081 Binary files /dev/null and b/twin-styles/glow/themes/glass_verylarge/stickyon.png differ diff --git a/twin-styles/glow/themes/glass_verylarge/stickyon_glow.png b/twin-styles/glow/themes/glass_verylarge/stickyon_glow.png new file mode 100644 index 00000000..f3778479 Binary files /dev/null and b/twin-styles/glow/themes/glass_verylarge/stickyon_glow.png differ diff --git a/twin-styles/glow/themes/square/CMakeLists.txt b/twin-styles/glow/themes/square/CMakeLists.txt new file mode 100644 index 00000000..0343fa2a --- /dev/null +++ b/twin-styles/glow/themes/square/CMakeLists.txt @@ -0,0 +1,22 @@ +################################################# +# +# (C) 2011 Golubev Alexander +# fatzer2 (AT) gmail.com +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +install( FILES + background.png + help.png help_glow.png + close.png close_glow.png + iconify.png iconify_glow.png + maximizeoff.png maximizeoff_glow.png + maximizeon.png maximizeon_glow.png + stickyon.png stickyon_glow.png + stickyoff.png stickyoff_glow.png + square.theme + DESTINATION ${DATA_INSTALL_DIR}/twin/glow-themes/square ) diff --git a/twin-styles/glow/themes/square/Makefile.am b/twin-styles/glow/themes/square/Makefile.am new file mode 100644 index 00000000..01193d98 --- /dev/null +++ b/twin-styles/glow/themes/square/Makefile.am @@ -0,0 +1,17 @@ +linkdir = $(kde_datadir)/twin/glow-themes/square +link_DATA = \ +background.png \ +help.png help_glow.png \ +close.png close_glow.png \ +iconify.png iconify_glow.png \ +maximizeoff.png maximizeoff_glow.png \ +maximizeon.png maximizeon_glow.png \ +stickyon.png stickyon_glow.png \ +stickyoff.png stickyoff_glow.png \ +square.theme + +EXTRA_DIST = $(link_DATA) + +###KMAKE-start (don't edit or delete this block) + +###KMAKE-end diff --git a/twin-styles/glow/themes/square/background.png b/twin-styles/glow/themes/square/background.png new file mode 100644 index 00000000..225af3a5 Binary files /dev/null and b/twin-styles/glow/themes/square/background.png differ diff --git a/twin-styles/glow/themes/square/close.png b/twin-styles/glow/themes/square/close.png new file mode 100644 index 00000000..898a368a Binary files /dev/null and b/twin-styles/glow/themes/square/close.png differ diff --git a/twin-styles/glow/themes/square/close_glow.png b/twin-styles/glow/themes/square/close_glow.png new file mode 100644 index 00000000..4cd1f1cb Binary files /dev/null and b/twin-styles/glow/themes/square/close_glow.png differ diff --git a/twin-styles/glow/themes/square/help.png b/twin-styles/glow/themes/square/help.png new file mode 100644 index 00000000..c3ed65ee Binary files /dev/null and b/twin-styles/glow/themes/square/help.png differ diff --git a/twin-styles/glow/themes/square/help_glow.png b/twin-styles/glow/themes/square/help_glow.png new file mode 100644 index 00000000..4cd1f1cb Binary files /dev/null and b/twin-styles/glow/themes/square/help_glow.png differ diff --git a/twin-styles/glow/themes/square/iconify.png b/twin-styles/glow/themes/square/iconify.png new file mode 100644 index 00000000..94fc6338 Binary files /dev/null and b/twin-styles/glow/themes/square/iconify.png differ diff --git a/twin-styles/glow/themes/square/iconify_glow.png b/twin-styles/glow/themes/square/iconify_glow.png new file mode 100644 index 00000000..4cd1f1cb Binary files /dev/null and b/twin-styles/glow/themes/square/iconify_glow.png differ diff --git a/twin-styles/glow/themes/square/maximizeoff.png b/twin-styles/glow/themes/square/maximizeoff.png new file mode 100644 index 00000000..e60cdc97 Binary files /dev/null and b/twin-styles/glow/themes/square/maximizeoff.png differ diff --git a/twin-styles/glow/themes/square/maximizeoff_glow.png b/twin-styles/glow/themes/square/maximizeoff_glow.png new file mode 100644 index 00000000..4cd1f1cb Binary files /dev/null and b/twin-styles/glow/themes/square/maximizeoff_glow.png differ diff --git a/twin-styles/glow/themes/square/maximizeon.png b/twin-styles/glow/themes/square/maximizeon.png new file mode 100644 index 00000000..3976411f Binary files /dev/null and b/twin-styles/glow/themes/square/maximizeon.png differ diff --git a/twin-styles/glow/themes/square/maximizeon_glow.png b/twin-styles/glow/themes/square/maximizeon_glow.png new file mode 100644 index 00000000..4cd1f1cb Binary files /dev/null and b/twin-styles/glow/themes/square/maximizeon_glow.png differ diff --git a/twin-styles/glow/themes/square/square.theme b/twin-styles/glow/themes/square/square.theme new file mode 100644 index 00000000..26f00feb --- /dev/null +++ b/twin-styles/glow/themes/square/square.theme @@ -0,0 +1,19 @@ +buttonSize=17,17 + +backgroundPixmap=background.png + +stickyOnPixmap=stickyon.png +stickyOffPixmap=stickyoff.png +maximizeOnPixmap=maximizeon.png +maximizeOffPixmap=maximizeoff.png +helpPixmap=help.png +closePixmap=close.png +iconifyPixmap=iconify.png + +stickyOnGlowPixmap=stickyon_glow.png +stickyOffGlowPixmap=stickyoff_glow.png +maximizeOnGlowPixmap=maximizeon_glow.png +maximizeOffGlowPixmap=maximizeoff_glow.png +helpGlowPixmap=help_glow.png +closeGlowPixmap=close_glow.png +iconifyGlowPixmap=iconify_glow.png diff --git a/twin-styles/glow/themes/square/stickyoff.png b/twin-styles/glow/themes/square/stickyoff.png new file mode 100644 index 00000000..3600e326 Binary files /dev/null and b/twin-styles/glow/themes/square/stickyoff.png differ diff --git a/twin-styles/glow/themes/square/stickyoff_glow.png b/twin-styles/glow/themes/square/stickyoff_glow.png new file mode 100644 index 00000000..4cd1f1cb Binary files /dev/null and b/twin-styles/glow/themes/square/stickyoff_glow.png differ diff --git a/twin-styles/glow/themes/square/stickyon.png b/twin-styles/glow/themes/square/stickyon.png new file mode 100644 index 00000000..a84941a3 Binary files /dev/null and b/twin-styles/glow/themes/square/stickyon.png differ diff --git a/twin-styles/glow/themes/square/stickyon_glow.png b/twin-styles/glow/themes/square/stickyon_glow.png new file mode 100644 index 00000000..4cd1f1cb Binary files /dev/null and b/twin-styles/glow/themes/square/stickyon_glow.png differ 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 + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +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 http://icewm.themes.org/ 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 + * 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 +#include +#include +#include +#include +#include +#include + +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 ) +# 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 + 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#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( "
IceWM preview
" ), 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( "
IceWM preview
" ), 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 + 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 +#include +#include +#include +#include +#include +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 diff --git a/twin-styles/kde1/CMakeLists.txt b/twin-styles/kde1/CMakeLists.txt new file mode 100644 index 00000000..2cbae1eb --- /dev/null +++ b/twin-styles/kde1/CMakeLists.txt @@ -0,0 +1,32 @@ +################################################# +# +# (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} +) + +##### other data ################################ + +install( FILES kde1.desktop DESTINATION ${DATA_INSTALL_DIR}/twin ) + +##### twin3_cde ################################## + +tde_add_kpart( twin3_kde1 AUTOMOC + SOURCES kde1client.cpp + LINK tdecorations-shared + DESTINATION ${PLUGIN_INSTALL_DIR} +) diff --git a/twin-styles/kde1/Makefile.am b/twin-styles/kde1/Makefile.am new file mode 100644 index 00000000..131b71a4 --- /dev/null +++ b/twin-styles/kde1/Makefile.am @@ -0,0 +1,16 @@ + +INCLUDES = $(all_includes) + +kde_module_LTLIBRARIES = twin3_kde1.la + +twin3_kde1_la_SOURCES = kde1client.cpp +twin3_kde1_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module $(LIB_QT) $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx +twin3_kde1_la_LIBADD = -ltdecorations + +METASOURCES = AUTO +noinst_HEADERS = kde1client.h + +lnkdir = $(kde_datadir)/twin/ +lnk_DATA = kde1.desktop +EXTRA_DIST = $(lnk_DATA) + diff --git a/twin-styles/kde1/kde1.desktop b/twin-styles/kde1/kde1.desktop new file mode 100644 index 00000000..e0a1ffad --- /dev/null +++ b/twin-styles/kde1/kde1.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Name=KDE 1 +Name[fa]=KDE ۱ +Name[hi]=केडीई 1 +Name[ne]=केडीई १ +Name[th]=โปรแกรมจัดการหน้าต่าง KDE 1 +X-KDE-Library=twin3_kde1 diff --git a/twin-styles/kde1/kde1client.cpp b/twin-styles/kde1/kde1client.cpp new file mode 100644 index 00000000..c6a7db98 --- /dev/null +++ b/twin-styles/kde1/kde1client.cpp @@ -0,0 +1,809 @@ +/***************************************************************** +twin - the KDE window manager + +Copyright (C) 1999, 2000 Matthias Ettrich +******************************************************************/ +#include "kde1client.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "kde1client_bitmaps.h" + +// Default button tqlayout +const char default_left[] = "MS"; +const char default_right[] = "H_IAX"; + +namespace KDE1 +{ + +TQPixmap* close_pix = 0; +TQPixmap* maximize_pix = 0; +TQPixmap* minimize_pix = 0; +TQPixmap* normalize_pix = 0; +TQPixmap* pinup_pix = 0; +TQPixmap* pindown_pix = 0; +TQPixmap* menu_pix = 0; +TQPixmap* question_mark_pix = 0; + +TQPixmap* dis_close_pix = 0; +TQPixmap* dis_maximize_pix = 0; +TQPixmap* dis_minimize_pix = 0; +TQPixmap* dis_normalize_pix = 0; +TQPixmap* dis_pinup_pix = 0; +TQPixmap* dis_pindown_pix = 0; +TQPixmap* dis_menu_pix = 0; +TQPixmap* dis_question_mark_pix = 0; + +TQPixmap* titleBuffer = 0; + +bool pixmaps_created = FALSE; + +inline const KDecorationOptions* options() { return KDecoration::options(); } + +void create_pixmaps() +{ + if ( pixmaps_created ) + return; + pixmaps_created = true; + TQColorGroup aGrp = options()->tqcolorGroup(KDecorationOptions::ColorButtonBg, true); + TQColorGroup iGrp = options()->tqcolorGroup(KDecorationOptions::ColorButtonBg, false); + + TQPainter aPainter, iPainter; + close_pix = new TQPixmap(16, 16); + dis_close_pix = new TQPixmap(16, 16); + aPainter.begin(close_pix); iPainter.begin(dis_close_pix); + kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, close_white_bits, + NULL, NULL, close_dgray_bits, NULL, NULL); + kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, close_white_bits, + NULL, NULL, close_dgray_bits, NULL, NULL); + aPainter.end(); iPainter.end(); + close_pix->setMask(TQBitmap(16, 16, close_mask_bits, true)); + dis_close_pix->setMask(*close_pix->mask()); + + minimize_pix = new TQPixmap(16, 16); + dis_minimize_pix = new TQPixmap(16, 16); + aPainter.begin(minimize_pix); iPainter.begin(dis_minimize_pix); + kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, iconify_white_bits, + NULL, NULL, iconify_dgray_bits, NULL, NULL); + kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, iconify_white_bits, + NULL, NULL, iconify_dgray_bits, NULL, NULL); + aPainter.end(); iPainter.end(); + minimize_pix->setMask(TQBitmap(16, 16, iconify_mask_bits, true)); + dis_minimize_pix->setMask(*minimize_pix->mask()); + + maximize_pix = new TQPixmap(16, 16); + dis_maximize_pix = new TQPixmap(16, 16); + aPainter.begin(maximize_pix); iPainter.begin(dis_maximize_pix); + kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, maximize_white_bits, + NULL, NULL, maximize_dgray_bits, NULL, NULL); + kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, maximize_white_bits, + NULL, NULL, maximize_dgray_bits, NULL, NULL); + aPainter.end(); iPainter.end(); + maximize_pix->setMask(TQBitmap(16, 16, maximize_mask_bits, true)); + dis_maximize_pix->setMask(*maximize_pix->mask()); + + normalize_pix = new TQPixmap(16, 16); + dis_normalize_pix = new TQPixmap(16, 16); + aPainter.begin(normalize_pix); iPainter.begin(dis_normalize_pix); + kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, maximizedown_white_bits, + NULL, NULL, maximizedown_dgray_bits, NULL, NULL); + kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, maximizedown_white_bits, + NULL, NULL, maximizedown_dgray_bits, NULL, NULL); + aPainter.end(); iPainter.end(); + normalize_pix->setMask(TQBitmap(16, 16, maximizedown_mask_bits, true)); + dis_normalize_pix->setMask(*normalize_pix->mask()); + + menu_pix = new TQPixmap(16, 16); + dis_menu_pix = new TQPixmap(16, 16); + aPainter.begin(menu_pix); iPainter.begin(dis_menu_pix); + kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, menu_white_bits, + NULL, NULL, menu_dgray_bits, NULL, NULL); + kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, menu_white_bits, + NULL, NULL, menu_dgray_bits, NULL, NULL); + aPainter.end(); iPainter.end(); + menu_pix->setMask(TQBitmap(16, 16, menu_mask_bits, true)); + dis_menu_pix->setMask(*menu_pix->mask()); + + pinup_pix = new TQPixmap(16, 16); + dis_pinup_pix = new TQPixmap(16, 16); + aPainter.begin(pinup_pix); iPainter.begin(dis_pinup_pix); + kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, pinup_white_bits, + pinup_gray_bits, NULL, pinup_dgray_bits, NULL, NULL); + kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, pinup_white_bits, + pinup_gray_bits, NULL, pinup_dgray_bits, NULL, NULL); + aPainter.end(); iPainter.end(); + pinup_pix->setMask(TQBitmap(16, 16, pinup_mask_bits, true)); + dis_pinup_pix->setMask(*pinup_pix->mask()); + + pindown_pix = new TQPixmap(16, 16); + dis_pindown_pix = new TQPixmap(16, 16); + aPainter.begin(pindown_pix); iPainter.begin(dis_pindown_pix); + kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, pindown_white_bits, + pindown_gray_bits, NULL, pindown_dgray_bits, NULL, NULL); + kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, pindown_white_bits, + pindown_gray_bits, NULL, pindown_dgray_bits, NULL, NULL); + aPainter.end(); iPainter.end(); + pindown_pix->setMask(TQBitmap(16, 16, pindown_mask_bits, true)); + dis_pindown_pix->setMask(*pindown_pix->mask()); + + question_mark_pix = new TQPixmap(16, 16); + dis_question_mark_pix = new TQPixmap(16, 16); + aPainter.begin(question_mark_pix); iPainter.begin(dis_question_mark_pix); + kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, help_light_bits, + NULL, NULL, help_dark_bits, NULL, NULL); + kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, help_light_bits, + NULL, NULL, help_dark_bits, NULL, NULL); + aPainter.end(); iPainter.end(); + question_mark_pix->setMask(TQBitmap(16, 16, help_mask_bits, true)); + dis_question_mark_pix->setMask(*question_mark_pix->mask()); + + titleBuffer = new KPixmap; +} + +void delete_pixmaps() +{ + delete close_pix; + delete maximize_pix; + delete minimize_pix; + delete normalize_pix; + delete pinup_pix; + delete pindown_pix; + delete menu_pix; + delete question_mark_pix; + delete dis_close_pix; + delete dis_maximize_pix; + delete dis_minimize_pix; + delete dis_normalize_pix; + delete dis_pinup_pix; + delete dis_pindown_pix; + delete dis_menu_pix; + delete dis_question_mark_pix; + delete titleBuffer; + pixmaps_created = false; +} + +void drawGradient +( + TQPainter & p, + const TQRect & t, + const TQColor & c1, + const TQColor & c2 +) +{ + // Don't draw a million vertical lines if we don't need to. + + if (c1 == c2 || TQPixmap::defaultDepth() <= 8) + { + p.fillRect(t, c1); + return; + } + + // rikkus: Adapted from KPixmapEffect::gradient(). + + int rca = c1.red(); + int gca = c1.green(); + int bca = c1.blue(); + + int rDiff = c2.red() - rca; + int gDiff = c2.green() - gca; + int bDiff = c2.blue() - bca; + + int rl = rca << 16; + int gl = gca << 16; + int bl = bca << 16; + + int rcdelta = ((1 << 16) / t.width()) * rDiff; + int gcdelta = ((1 << 16) / t.width()) * gDiff; + int bcdelta = ((1 << 16) / t.width()) * bDiff; + + for (int x = 0; x < t.width(); x++) + { + rl += rcdelta; + gl += gcdelta; + bl += bcdelta; + + p.setPen(TQColor(rl >> 16, gl >> 16, bl >> 16)); + + p.drawLine(t.x() + x, 0, t.x() + x, t.y() + t.height() - 1); + } +} + + +void StdClient::reset( unsigned long ) +{ + if (button[ButtonMenu] && (icon().pixmap( TQIconSet::Small, TQIconSet::Normal ).isNull())) + button[ButtonMenu]->setIconSet(isActive() ? *menu_pix : *dis_menu_pix); + if (button[ButtonSticky]) + button[ButtonSticky]->setIconSet(isOnAllDesktops() ? isActive() ? *pindown_pix : *dis_pindown_pix : + isActive() ? *pinup_pix : *dis_pinup_pix ); + if (button[ButtonMinimize]) + button[ButtonMinimize]->setIconSet(isActive() ? *minimize_pix : *dis_minimize_pix); + if (button[ButtonMaximize]) + button[ButtonMaximize]->setIconSet(isActive() ? *maximize_pix : *dis_maximize_pix); + if (button[ButtonClose]) + button[ButtonClose]->setIconSet(isActive() ? *close_pix : *dis_close_pix); + if (button[ButtonHelp]) + button[ButtonHelp]->setIconSet(isActive() ? *question_mark_pix : *dis_question_mark_pix); + + widget()->setFont(options()->font(true)); +} + + +StdClient::StdClient( KDecorationBridge* b, KDecorationFactory* f ) + : KDecoration( b, f ) +{ +} + +void StdClient::init() +{ + createMainWidget(); + widget()->installEventFilter( this ); + + widget()->setFont(options()->font(isActive() )); + + TQGridLayout* g = new TQGridLayout( widget(), 0, 0, 3, 2 ); + g->setRowStretch( 1, 10 ); + if( isPreview()) + g->addWidget( new TQLabel( i18n( "
KDE 1 preview
" ), widget()), 1, 1 ); + else + g->addItem( new TQSpacerItem( 0, 0 ), 1, 1 ); //no widget in the middle + g->addItem( new TQSpacerItem( 0, 0, TQSizePolicy::Fixed, TQSizePolicy::Expanding ) ); + + g->addColSpacing(0, 1); + g->addColSpacing(2, 1); + g->addRowSpacing(2, 1); + + int fh = widget()->fontMetrics().lineSpacing(); + titlebar = new TQSpacerItem(10, fh, TQSizePolicy::Expanding, + TQSizePolicy::Minimum ); + + TQBoxLayout* hb = new TQBoxLayout(0, TQBoxLayout::LeftToRight, 0, 0, 0); + g->addLayout( hb, 0, 1 ); + + // setup titlebar buttons + for (int n=0; ncustomButtonPositions() ? options()->titleButtonsLeft() : TQString(default_left)); + hb->addItem(titlebar); + addButtons(hb, options()->customButtonPositions() ? options()->titleButtonsRight() : TQString(default_right)); + + for (int n=0; nsetBackgroundMode( PaletteBackground ); + button[n]->setMouseTracking( FALSE ); + button[n]->setAutoRaise( TRUE ); + button[n]->setFocusPolicy( TQ_NoFocus ); + button[n]->setFixedSize( 20, 20 ); + } + +#if 0 // not sure what this is supposed to mean (and why) + if ( isTransient() ) { + // lighter decoration for transient windows + button[1]->hide(); +// button[2]->hide(); + button[3]->hide(); + button[4]->hide(); + } +#endif +} + +void StdClient::addButtons(TQBoxLayout *hb, const TQString& s) +{ + if (s.length() > 0) { + for (unsigned n=0; n < s.length(); n++) { + switch (s[n]) { + case 'M': // Menu button + if (!button[ButtonMenu]) { + button[ButtonMenu] = new TQToolButton( widget(), 0 ); + TQToolTip::add( button[ButtonMenu], i18n("Menu") ); + button[ButtonMenu]->setCursor(ArrowCursor); + if( icon().pixmap( TQIconSet::Small, TQIconSet::Normal ).isNull()) + button[ButtonMenu]->setIconSet(isActive() ? *menu_pix : *dis_menu_pix); + else + button[ButtonMenu]->setIconSet( icon().pixmap( TQIconSet::Small, TQIconSet::Normal )); + connect( button[0], TQT_SIGNAL( pressed() ), this, TQT_SLOT( menuButtonPressed() ) ); + hb->addWidget(button[ButtonMenu]); + } + break; + + case 'S': // Sticky button + if (!button[ButtonSticky]) { + button[ButtonSticky] = new TQToolButton( widget(), 0 ); + button[ButtonSticky]->setIconSet( isOnAllDesktops()?*pindown_pix:*pinup_pix ); + TQToolTip::add( button[ButtonSticky], isOnAllDesktops()?i18n("Not On All Desktops"):i18n("On All Desktops") ); + button[ButtonSticky]->setCursor(ArrowCursor); + button[ButtonSticky]->setIconSet(isOnAllDesktops() ? isActive() ? *pindown_pix : *dis_pindown_pix : + isActive() ? *pinup_pix : *dis_pinup_pix ); + connect( button[ButtonSticky], TQT_SIGNAL( clicked() ), this, ( TQT_SLOT( toggleOnAllDesktops() ) ) ); + hb->addWidget(button[ButtonSticky]); + } + break; + + case 'H': // Help button + if ((!button[ButtonHelp]) && providesContextHelp()) { + button[ButtonHelp] = new TQToolButton( widget(), 0 ); + TQToolTip::add( button[ButtonHelp], i18n("Help") ); + button[ButtonHelp]->setIconSet( isActive() ? *question_mark_pix : *dis_question_mark_pix); + connect( button[ButtonHelp], TQT_SIGNAL( clicked() ), this, ( TQT_SLOT( showContextHelp() ) ) ); + button[ButtonHelp]->setCursor(ArrowCursor); + hb->addWidget(button[ButtonHelp]); + } + break; + + case 'I': // Minimize button + if ((!button[ButtonMinimize]) && isMinimizable()) { + button[ButtonMinimize] = new TQToolButton( widget(), 0 ); + TQToolTip::add( button[ButtonMinimize], i18n("Minimize") ); + button[ButtonMinimize]->setCursor(ArrowCursor); + button[ButtonMinimize]->setIconSet(isActive() ? *minimize_pix : *dis_minimize_pix); + connect( button[ButtonMinimize], TQT_SIGNAL( clicked() ), this, ( TQT_SLOT( minimize() ) ) ); + hb->addWidget(button[ButtonMinimize]); + } + break; + + case 'A': // Maximize button + if ((!button[ButtonMaximize]) && isMaximizable()) { + const bool max = maximizeMode()!=MaximizeRestore; + button[ButtonMaximize] = new ThreeButtonButton( widget(), 0 ); + TQToolTip::add( button[ButtonMaximize], max?i18n("Restore"):i18n("Maximize") ); + button[ButtonMaximize]->setCursor(ArrowCursor); + button[ButtonMaximize]->setIconSet( max?(isActive() ? *normalize_pix : *dis_normalize_pix):(isActive() ? *maximize_pix : *dis_maximize_pix) ); + connect( button[ButtonMaximize], TQT_SIGNAL( clicked(ButtonState) ), + this, ( TQT_SLOT( maxButtonClicked(ButtonState) ) ) ); + hb->addWidget(button[ButtonMaximize]); + } + break; + + case 'X': // Close button + if ((!button[ButtonClose]) && isCloseable()) { + button[ButtonClose] = new TQToolButton( widget(), 0 ); + TQToolTip::add( button[ButtonClose], i18n("Close") ); + button[ButtonClose]->setCursor(ArrowCursor); + button[ButtonClose]->setIconSet(isActive() ? *close_pix : *dis_close_pix); + connect( button[ButtonClose], TQT_SIGNAL( clicked() ), this, ( TQT_SLOT( closeWindow() ) ) ); + hb->addWidget(button[ButtonClose]); + } + break; + + case '_': // Spacer item + hb->addItem( new TQSpacerItem( 5, 0, TQSizePolicy::Fixed, TQSizePolicy::Expanding ) ); + } + } + } +} + +void StdClient::activeChange() +{ + bool on = isActive(); + if (button[ButtonMenu] && (icon().pixmap( TQIconSet::Small, TQIconSet::Normal ).isNull())) + button[ButtonMenu]->setIconSet(on ? *menu_pix : *dis_menu_pix); + if (button[ButtonSticky]) + button[ButtonSticky]->setIconSet(isOnAllDesktops() ? on ? *pindown_pix : *dis_pindown_pix : + on ? *pinup_pix : *dis_pinup_pix ); + if (button[ButtonMinimize]) + button[ButtonMinimize]->setIconSet(on ? *minimize_pix : *dis_minimize_pix); + if (button[ButtonMaximize]) + button[ButtonMaximize]->setIconSet(on ? *maximize_pix : *dis_maximize_pix); + if (button[ButtonClose]) + button[ButtonClose]->setIconSet(on ? *close_pix : *dis_close_pix); + if (button[ButtonHelp]) + button[ButtonHelp]->setIconSet(on ? *question_mark_pix : *dis_question_mark_pix); + widget()->tqrepaint( titlebar->tqgeometry(), false ); +} + + +StdClient::~StdClient() +{ + for (int n=0; nrect(); + TQRect t = titlebar->tqgeometry(); +// t.setTop( 0 ); +// TQRegion r = rr.subtract( TQRect( t.x()+1, 0, t.width()-2, 1 ) ); +// setMask( r ); + + if ( widget()->isVisibleToTLW() && !widget()->testWFlags( WStaticContents )) { + // manual clearing without the titlebar (we selected WResizeNoErase ) + TQRect cr( 2, 2, width()-4, height()- 4 ); + widget()->erase( TQRegion( cr ).subtract( t ) ); + } +} + +/*!\reimp + */ +void StdClient::captionChange() +{ + widget()->tqrepaint( titlebar->tqgeometry(), FALSE ); +} + + +/*!\reimp + */ +void StdClient::maximizeChange() +{ + bool m = maximizeMode() == MaximizeFull; + if (button[ButtonMaximize]) { + button[ButtonMaximize]->setIconSet( m?*normalize_pix:*maximize_pix ); + TQToolTip::remove( button[ButtonMaximize] ); + TQToolTip::add( button[ButtonMaximize], m ? i18n("Restore") : i18n("Maximize") ); + } +} + + +/*!\reimp + */ +void StdClient::desktopChange() +{ + bool s = isOnAllDesktops(); + if (button[ButtonSticky]) { + button[ButtonSticky]->setIconSet( s?*pindown_pix:*pinup_pix ); + TQToolTip::remove( button[ButtonSticky] ); + TQToolTip::add( button[ButtonSticky], s ? i18n("Not On All Desktops") : i18n("On All Desktops") ); + } +} + +void StdClient::paintEvent( TQPaintEvent* ) +{ + TQPainter p( widget() ); + TQRect t = titlebar->tqgeometry(); + TQRegion r = widget()->rect(); + r = r.subtract( t ); + p.setClipRegion( r ); + qDrawWinPanel( &p, widget()->rect(), widget()->tqcolorGroup() ); +// t.setTop( 1 ); +// p.setClipRegion( t ); +// t.setTop( 0 ); + + TQRect titleRect( 0, 0, t.width(), t.height() ); + titleBuffer->resize( titleRect.width(), titleRect.height() ); + TQPainter p2( titleBuffer ); + + drawGradient(p2, titleRect, options()->color(KDecorationOptions::ColorTitleBar, isActive()), + options()->color(KDecorationOptions::ColorTitleBlend, isActive())); +// p.setPen( options()->color(KDecorationOptions::ColorTitleBar, isActive()).light() ); +// p.drawLine(t.left(), t.top()+1, t.right(), t.top()+1); + if ( isActive() ) + qDrawShadePanel( &p2, 0, 0, titleRect.width(), titleRect.height(), + widget()->tqcolorGroup(), true, 1 ); + titleRect.setLeft( 4 ); + titleRect.setWidth( titleRect.width() - 2 ); + p2.setPen(options()->color(KDecorationOptions::ColorFont, isActive())); + p2.setFont(options()->font(isActive())); + p2.drawText( titleRect, AlignLeft|AlignVCenter|SingleLine, caption() ); + p2.end(); + p.end(); + bitBlt( widget(), t.topLeft(), titleBuffer ); +} + + +void StdClient::mouseDoubleClickEvent( TQMouseEvent * e ) +{ + if ( e->button() == Qt::LeftButton && titlebar->tqgeometry().contains( e->pos() ) ) + titlebarDblClickOperation(); +} + + +void StdClient::wheelEvent( TQWheelEvent * e ) +{ + if (isSetShade() || TQRect( 0, 0, width(), titlebar->tqgeometry().height() ).contains( e->pos() ) ) + titlebarMouseWheelOperation( e->delta()); +} + + +void StdClient::iconChange() +{ + if (button[ButtonMenu]) { + if ( icon().pixmap( TQIconSet::Small, TQIconSet::Normal ).isNull()) + button[ButtonMenu]->setIconSet(isActive() ? *menu_pix : *dis_menu_pix); + else + button[ButtonMenu]->setIconSet( icon().pixmap( TQIconSet::Small, TQIconSet::Normal ) ); + button[ButtonMenu]->tqrepaint( FALSE ); + } +} + + +/*! + Indicates that the menu button has been clicked. One press shows + the window operation menu, a double click closes the window. + */ +void StdClient::menuButtonPressed() +{ + TQRect menuRect = button[ButtonMenu]->rect(); + menuRect.addCoords(-1, 0, +1, +2); + TQPoint menuTop = button[ButtonMenu]->mapToGlobal(menuRect.topLeft()); + TQPoint menuBottom = button[ButtonMenu]->mapToGlobal(menuRect.bottomRight()); + KDecorationFactory* f = factory(); // needs to be saved before + showWindowMenu( TQRect(menuTop, menuBottom) ); + if( !f->exists( this )) // destroyed, return immediately + return; + button[ButtonMenu]->setDown(false); +} + + +void StdClient::maxButtonClicked( ButtonState button ) +{ + maximize( button ); +} + +bool StdClient::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: + return false; + } +} + +TQSize StdClient::tqminimumSize() const +{ + return widget()->tqminimumSize().expandedTo( TQSize( 100, 50 )); +} + +void StdClient::borders( int& left, int& right, int& top, int& bottom ) const +{ + left = right = bottom = 6; + top = 6 + widget()->fontMetrics().lineSpacing()+2; +} + +void StdClient::resize( const TQSize& s ) +{ + widget()->resize( s ); +} + +StdToolClient::StdToolClient( KDecorationBridge* b, KDecorationFactory* f ) + : KDecoration( b, f ) +{ +} + +void StdToolClient::init() +{ + createMainWidget(); + widget()->installEventFilter( this ); + + widget()->setFont(options()->font(isActive(), true )); + + TQGridLayout* g = new TQGridLayout( widget(), 0, 0, 2 ); + g->setRowStretch( 1, 10 ); + if( isPreview()) + g->addWidget( new TQLabel( i18n( "
KDE 1 decoration
" ), widget()), 1, 1 ); + else + g->addItem( new TQSpacerItem( 0, 0 ), 1, 1 ); //no widget in the middle + g->addItem( new TQSpacerItem( 0, 0, TQSizePolicy::Fixed, TQSizePolicy::Expanding ) ); + + g->addColSpacing(0, 1); + g->addColSpacing(2, 1); + g->addRowSpacing(2, 1); + + closeBtn = new TQToolButton( widget(), 0 ); + TQToolTip::add( closeBtn, i18n("Close") ); + connect( closeBtn, TQT_SIGNAL( clicked() ), this, ( TQT_SLOT( closeWindow() ) ) ); + closeBtn->setFixedSize( 13, 13); + reset( -1U ); + + TQHBoxLayout* hb = new TQHBoxLayout; + g->addLayout( hb, 0, 1 ); + + int fh = widget()->fontMetrics().lineSpacing()+2; + + titlebar = new TQSpacerItem(10, fh, TQSizePolicy::Expanding, + TQSizePolicy::Minimum ); + hb->addItem( titlebar ); + hb->addWidget( closeBtn ); +} + +StdToolClient::~StdToolClient() +{ +} + +void StdToolClient::resizeEvent( TQResizeEvent* ) +{ +// TQRegion r = rect(); +// TQRect t = titlebar->tqgeometry(); +// t.setTop( 0 ); +// r = r.subtract( TQRect(0, 0, width(), 1) ); +// r = r.subtract (TQRect( 0, 0, 1, t.height() ) ); +// r = r.subtract (TQRect( width()-1, 0, 1, t.height() ) ); +// setMask( r ); +} + +void StdToolClient::paintEvent( TQPaintEvent* ) +{ + TQPainter p( widget() ); + TQRect t = titlebar->tqgeometry(); + TQRect r = widget()->rect(); + qDrawWinPanel( &p, r, widget()->tqcolorGroup() ); + r.setTop( t.bottom()+1 ); + qDrawWinPanel( &p, r, widget()->tqcolorGroup() ); + p.fillRect( TQRect( TQPoint(t.topLeft() ), TQPoint( width() - t.left(), t.bottom() ) ), + options()->color(KDecorationOptions::ColorTitleBar, isActive())); + p.setPen( options()->color(KDecorationOptions::ColorTitleBar, isActive()).light() ); + t.setLeft( t.left() + 4 ); + t.setRight( t.right() - 2 ); + p.setPen(options()->color(KDecorationOptions::ColorFont, isActive())); + p.setFont(options()->font(isActive(), true)); + p.drawText( t, AlignLeft|AlignVCenter|SingleLine, caption() ); +} + + +void StdToolClient::mouseDoubleClickEvent( TQMouseEvent * e ) +{ + if ( e->button() == Qt::LeftButton && titlebar->tqgeometry().contains( e->pos() ) ) + titlebarDblClickOperation(); +} + +void StdToolClient::wheelEvent( TQWheelEvent * e ) +{ + if (isSetShade() || TQRect( 0, 0, width(), titlebar->tqgeometry().height() ).contains( e->pos() ) ) + titlebarMouseWheelOperation( e->delta()); +} + +void StdToolClient::captionChange() +{ + widget()->tqrepaint( titlebar->tqgeometry(), FALSE ); +} + +void StdToolClient::reset( unsigned long ) +{ + TQImage img = close_pix->convertToImage(); + img = img.smoothScale( 12, 12 ); + TQPixmap pm; + pm.convertFromImage( img ); + closeBtn->setPixmap( pm ); + widget()->setFont(options()->font(isActive(), true )); +} + +bool StdToolClient::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: + return false; + } +} + +TQSize StdToolClient::tqminimumSize() const +{ + return widget()->tqminimumSize().expandedTo( TQSize( 100, 50 )); +} + +void StdToolClient::borders( int& left, int& right, int& top, int& bottom ) const +{ + left = right = bottom = 6; + top = 6 + widget()->fontMetrics().lineSpacing(); +} + +void StdToolClient::resize( const TQSize& s ) +{ + widget()->resize( s ); +} + +StdFactory::StdFactory() +{ + create_pixmaps(); +} + +StdFactory::~StdFactory() +{ + delete_pixmaps(); +} + +const int SUPPORTED_WINDOW_TYPES_MASK = NET::NormalMask | NET::DesktopMask | NET::DockMask + | NET::ToolbarMask | NET::MenuMask | NET::DialogMask | NET::OverrideMask | NET::TopMenuMask + | NET::UtilityMask | NET::SplashMask; + +KDecoration* StdFactory::createDecoration( KDecorationBridge* b ) +{ + NET::WindowType type = windowType( SUPPORTED_WINDOW_TYPES_MASK, b ); + if( type == NET::Utility || type == NET::Menu || type == NET::Toolbar ) + return new StdToolClient( b, this ); + return new StdClient( b, this ); +} + +bool StdFactory::reset( unsigned long mask ) +{ + bool needHardReset = false; + + // doesn't obey the Border size setting + if( mask & ( SettingFont | SettingButtons )) + needHardReset = true; + + if( mask & ( SettingFont | SettingColors )) { + KDE1::delete_pixmaps(); + KDE1::create_pixmaps(); + } + + if( !needHardReset ) + resetDecorations( mask ); + return needHardReset; +} + +bool StdFactory::supports( Ability ability ) +{ + switch( ability ) + { + case AbilityAnnounceButtons: + case AbilityButtonMenu: + case AbilityButtonOnAllDesktops: + case AbilityButtonHelp: + case AbilityButtonMinimize: + case AbilityButtonMaximize: + case AbilityButtonClose: + case AbilityButtonSpacer: + return true; + default: + return false; + }; +} + + +} + +extern "C" +{ + KDE_EXPORT KDecorationFactory *create_factory() + { + return new KDE1::StdFactory(); + } +} + +#include "kde1client.moc" diff --git a/twin-styles/kde1/kde1client.h b/twin-styles/kde1/kde1client.h new file mode 100644 index 00000000..adedfaaf --- /dev/null +++ b/twin-styles/kde1/kde1client.h @@ -0,0 +1,158 @@ +/***************************************************************** +twin - the KDE window manager + +Copyright (C) 1999, 2000 Matthias Ettrich +******************************************************************/ +#ifndef STDCLIENT_H +#define STDCLIENT_H +#include +#include +#include +#include +#include +class TQLabel; +class TQSpacerItem; + +namespace KDE1 { + +enum ButtonType { + ButtonMenu=0, + ButtonSticky, + ButtonMinimize, + ButtonMaximize, + ButtonClose, + ButtonHelp, + ButtonTypeCount +}; + +class StdClient : public KDecoration +{ + Q_OBJECT + TQ_OBJECT +public: + StdClient( KDecorationBridge* b, KDecorationFactory* f ); + ~StdClient(); + void init(); + TQSize tqminimumSize() const; + void borders( int& left, int& right, int& top, int& bottom ) const; + void reset( unsigned long mask ); + void resize( const TQSize& s ); + void shadeChange() {}; + Position mousePosition( const TQPoint& p ) const { return KDecoration::mousePosition( p ); } +protected: + bool eventFilter( TQObject* o, TQEvent* e ); + void resizeEvent( TQResizeEvent* ); + void paintEvent( TQPaintEvent* ); + + void mouseDoubleClickEvent( TQMouseEvent * ); + void wheelEvent( TQWheelEvent * ); + void captionChange(); + void iconChange(); + void maximizeChange(); + void desktopChange(); + void activeChange(); + +private: + void addButtons(TQBoxLayout* hb, const TQString& buttons); + +private slots: + void menuButtonPressed(); + void maxButtonClicked( ButtonState ); + +private: + TQToolButton* button[ButtonTypeCount]; + TQSpacerItem* titlebar; +}; + +class StdToolClient : public KDecoration +{ + Q_OBJECT + TQ_OBJECT +public: + StdToolClient( KDecorationBridge* b, KDecorationFactory* f ); + ~StdToolClient(); + void init(); + TQSize tqminimumSize() const; + void borders( int& left, int& right, int& top, int& bottom ) const; + void reset( unsigned long mask ); + void resize( const TQSize& s ); + void shadeChange() {}; + void activeChange() {}; + void iconChange() {}; + void maximizeChange() {}; + void desktopChange() {}; + Position mousePosition( const TQPoint& p ) const { return KDecoration::mousePosition( p ); } +protected: + bool eventFilter( TQObject* o, TQEvent* e ); + void resizeEvent( TQResizeEvent* ); + void paintEvent( TQPaintEvent* ); + + void mouseDoubleClickEvent( TQMouseEvent * ); + void wheelEvent( TQWheelEvent * ); + void captionChange(); + +private: + TQToolButton* closeBtn; + TQSpacerItem* titlebar; +}; + + + +/* + Like TQToolButton, but provides a clicked(ButtonState) signals that + has the last pressed mouse button as argument + */ +class ThreeButtonButton: public TQToolButton +{ + Q_OBJECT + TQ_OBJECT +public: + ThreeButtonButton ( TQWidget *parent = 0, const char* name = 0 ) + : TQToolButton( parent, name ) + { + connect( this, TQT_SIGNAL( clicked() ), this, TQT_SLOT( handleClicked() ) ); + setCursor( arrowCursor ); + } + ~ThreeButtonButton () {} + +signals: + void clicked( ButtonState ); + +protected: + void mousePressEvent( TQMouseEvent* e ) + { + last_button = e->button(); + TQMouseEvent me ( e->type(), e->pos(), e->globalPos(), Qt::LeftButton, e->state() ); + TQToolButton::mousePressEvent( &me ); + } + + void mouseReleaseEvent( TQMouseEvent* e ) + { + TQMouseEvent me ( e->type(), e->pos(), e->globalPos(), Qt::LeftButton, e->state() ); + TQToolButton::mouseReleaseEvent( &me ); + } + +private slots: + void handleClicked() + { + emit clicked( last_button ); + } + +private: + ButtonState last_button; + +}; + +class StdFactory : public KDecorationFactory +{ +public: + StdFactory(); + ~StdFactory(); + KDecoration* createDecoration( KDecorationBridge* b ); + bool reset( unsigned long mask ); + virtual bool supports( Ability ability ); +}; + +} + +#endif diff --git a/twin-styles/kde1/kde1client_bitmaps.h b/twin-styles/kde1/kde1client_bitmaps.h new file mode 100644 index 00000000..8b1cb377 --- /dev/null +++ b/twin-styles/kde1/kde1client_bitmaps.h @@ -0,0 +1,149 @@ +#ifndef __STDCLIENT_BITMAPS_H +#define __STDCLIENT_BITMAPS_H + +/** + * The standard client has the capability to color it's titlebar buttons + * according to the new color scheme. In order to do this it needs a bitmap + * for each shade which it draws into a pixmap with the appropriate color. + * These are all the bitmaps. + */ + +static const unsigned char close_white_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x04, 0x08, 0x08, 0x04, 0x10, 0x02, + 0x20, 0x01, 0x40, 0x00, 0x40, 0x00, 0x20, 0x01, 0x10, 0x02, 0x08, 0x04, + 0x04, 0x08, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char close_dgray_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x18, 0x30, 0x30, 0x18, 0x60, 0x0c, + 0xc0, 0x06, 0x80, 0x03, 0x80, 0x03, 0xc0, 0x06, 0x60, 0x0c, 0x30, 0x18, + 0x18, 0x30, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char close_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x30, 0x1c, 0x38, 0x38, 0x1c, 0x70, 0x0e, + 0xe0, 0x07, 0xc0, 0x03, 0xc0, 0x03, 0xe0, 0x07, 0x70, 0x0e, 0x38, 0x1c, + 0x1c, 0x38, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char iconify_white_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x03, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char iconify_dgray_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + + +static const unsigned char iconify_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x03, 0x80, 0x02, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char maximize_white_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x04, 0x00, 0x04, 0x08, 0x04, 0x08, + 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0xf4, 0x0f, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char maximize_dgray_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x08, 0x10, 0x08, 0x10, + 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, + 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char maximize_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0xfc, 0x1f, 0x0c, 0x18, 0x0c, 0x18, + 0x0c, 0x18, 0x0c, 0x18, 0x0c, 0x18, 0x0c, 0x18, 0x0c, 0x18, 0xfc, 0x1f, + 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char maximizedown_white_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x08, 0x10, + 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, + 0x08, 0x10, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char maximizedown_dgray_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x04, 0x00, 0x04, 0x08, + 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, + 0xf4, 0x0f, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char maximizedown_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0xfc, 0x1f, 0x0c, 0x18, + 0x0c, 0x18, 0x0c, 0x18, 0x0c, 0x18, 0x0c, 0x18, 0x0c, 0x18, 0x0c, 0x18, + 0xfc, 0x1f, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char menu_white_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0x3f, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char menu_dgray_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char menu_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0x3f, 0x04, 0x20, 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char pindown_white_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x1f, 0xa0, 0x03, + 0xb0, 0x01, 0x30, 0x01, 0xf0, 0x00, 0x70, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char pindown_gray_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x0e, 0x00, 0x06, 0x00, 0x00, 0x80, 0x07, 0xc0, 0x03, 0xe0, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char pindown_dgray_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x10, 0x70, 0x20, 0x50, 0x20, + 0x48, 0x30, 0xc8, 0x38, 0x08, 0x1f, 0x08, 0x18, 0x10, 0x1c, 0x10, 0x0e, + 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char pindown_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x1f, 0xf0, 0x3f, 0xf0, 0x3f, + 0xf8, 0x3f, 0xf8, 0x3f, 0xf8, 0x1f, 0xf8, 0x1f, 0xf0, 0x1f, 0xf0, 0x0f, + 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char pinup_white_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x11, + 0x3f, 0x15, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char pinup_gray_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x0a, 0xbf, 0x0a, 0x80, 0x15, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char pinup_dgray_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0x40, 0x31, 0x40, 0x2e, + 0x40, 0x20, 0x40, 0x20, 0x7f, 0x2a, 0x40, 0x3f, 0xc0, 0x31, 0xc0, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char pinup_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0xc0, 0x31, 0xc0, 0x3f, + 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xc0, 0x3f, 0xc0, 0x31, 0xc0, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char help_mask_bits[] = { + 0x00,0x00,0x00,0x00,0xe0,0x03,0xf0,0x07,0x70,0x0e,0x60,0x0e,0x00,0x0f,0x80, + 0x07,0xc0,0x03,0xc0,0x01,0x80,0x01,0xc0,0x00,0xc0,0x01,0x80,0x01,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x4c,0x0b,0x08,0x58,0x65,0x09,0x08,0x90,0x00,0x00, + 0x00,0x09,0x04,0x00,0x00,0x72,0x6f,0x6f,0x74,0x00,0x24,0x31,0x24,0x47,0x6b, + 0x65,0x44,0x78,0x63 }; + +static const unsigned char help_dark_bits[] = { + 0x00,0x00,0x00,0x00,0xe0,0x03,0x30,0x06,0x30,0x06,0x00,0x06,0x00,0x03,0x80, + 0x01,0xc0,0x00,0xc0,0x00,0x00,0x00,0xc0,0x00,0xc0,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x65,0x64,0x28,0x29,0x00,0x00,0x00,0x00,0x90,0x00,0x00, + 0x00,0x21,0x00,0x00,0x00,0x34,0xfe,0x12,0x2b,0x00,0x00,0xff,0xff,0x58,0xc0, + 0x01,0x2b,0x45,0xfe }; + +static const unsigned char help_light_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x40,0x08,0x60,0x08,0x00,0x0c,0x00, + 0x06,0x00,0x03,0x00,0x01,0x80,0x01,0x00,0x00,0x00,0x01,0x80,0x01,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x4c,0x0b,0x08,0x58,0x65,0x09,0x08,0x90,0x00,0x00, + 0x00,0x09,0x04,0x00,0x00,0x72,0x6f,0x6f,0x74,0x00,0x24,0x31,0x24,0x47,0x6b, + 0x65,0x44,0x78,0x63 }; + +#endif + diff --git a/twin-styles/kstep/CMakeLists.txt b/twin-styles/kstep/CMakeLists.txt new file mode 100644 index 00000000..4d55aa77 --- /dev/null +++ b/twin-styles/kstep/CMakeLists.txt @@ -0,0 +1,32 @@ +################################################# +# +# (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} +) + +##### other data ################################ + +install( FILES kstep.desktop DESTINATION ${DATA_INSTALL_DIR}/twin ) + +##### twin3_kstep ############################### + +tde_add_kpart( twin3_kstep AUTOMOC + SOURCES nextclient.cpp + LINK tdecorations-shared + DESTINATION ${PLUGIN_INSTALL_DIR} +) diff --git a/twin-styles/kstep/Makefile.am b/twin-styles/kstep/Makefile.am new file mode 100644 index 00000000..3fff6355 --- /dev/null +++ b/twin-styles/kstep/Makefile.am @@ -0,0 +1,22 @@ + +INCLUDES = $(all_includes) + +kde_module_LTLIBRARIES = twin3_kstep.la + +twin3_kstep_la_SOURCES = nextclient.cpp +twin3_kstep_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module $(LIB_QT) $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx +#twin_kstep_la_LDFLAGS = $(all_libraries) -avoid-version -module $(KDE_RPATH) $(KDE_MT_LDFLAGS) +twin3_kstep_la_LIBADD = $(LIB_TDEUI) -ltdecorations + +METASOURCES = AUTO +noinst_HEADERS = nextclient.h + +lnkdir = $(kde_datadir)/twin/ +lnk_DATA = kstep.desktop + +EXTRA_DIST = $(lnk_DATA) + + +###KMAKE-start (don't edit or delete this block) + +###KMAKE-end diff --git a/twin-styles/kstep/kstep.desktop b/twin-styles/kstep/kstep.desktop new file mode 100644 index 00000000..87b9aaae --- /dev/null +++ b/twin-styles/kstep/kstep.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Name=KStep +Name[cy]=KCam +Name[hi]=के-स्टेप +Name[ne]=केडीई चरण +Name[sv]=Kstep +Name[ta]=Kஅடி +Name[th]=ตัวจัดการหน้าต่างสเต็ป - K +Name[ven]=Tshitepe tsha K +Name[xh]=Inqwanqwa le K +Name[zu]=Izinga le K +X-KDE-Library=twin3_kstep diff --git a/twin-styles/kstep/nextclient.cpp b/twin-styles/kstep/nextclient.cpp new file mode 100644 index 00000000..08867a62 --- /dev/null +++ b/twin-styles/kstep/nextclient.cpp @@ -0,0 +1,987 @@ +#include "nextclient.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace KStep { + +static const unsigned char close_bits[] = { + 0x03, 0x03, 0x87, 0x03, 0xce, 0x01, 0xfc, 0x00, 0x78, 0x00, 0x78, 0x00, + 0xfc, 0x00, 0xce, 0x01, 0x87, 0x03, 0x03, 0x03}; + +static const unsigned char iconify_bits[] = { + 0xff, 0x03, 0xff, 0x03, 0xff, 0x03, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0xff, 0x03, 0xff, 0x03}; + +static const unsigned char question_bits[] = { + 0x00, 0x00, 0x78, 0x00, 0xcc, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00}; + +static const unsigned char sticky_bits[] = { + 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0xfe, 0x01, 0xfe, 0x01, + 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00}; + +static const unsigned char unsticky_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x01, 0xfe, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static const unsigned char maximize_bits[] = { + 0x30, 0x00, 0x78, 0x00, 0xfc, 0x00, 0xfe, 0x01, 0x00, 0x00, 0xfe, 0x01, + 0x02, 0x01, 0x84, 0x00, 0x48, 0x00, 0x30, 0x00 }; + +static const unsigned char shade_bits[] = { + 0xff,0x03, + 0xff,0x03, + 0x03,0x03, + 0xff,0x03, + 0xff,0x03, + 0x00,0x00, + 0x00,0x00, + 0x00,0x00, + 0x00,0x00, + 0x00,0x00 +}; + +static const unsigned char unshade_bits[] = { + 0xff,0x03, + 0xff,0x03, + 0x03,0x03, + 0x03,0x03, + 0x03,0x03, + 0x03,0x03, + 0x03,0x03, + 0x03,0x03, + 0xff,0x03, + 0xff,0x03 +}; + +static const unsigned char keep_above_bits[] = { + 0x30,0x00, + 0x78,0x00, + 0xfc,0x00, + 0x00,0x00, + 0xff,0x03, + 0xff,0x03, + 0x00,0x00, + 0x00,0x00, + 0x00,0x00, + 0x00,0x00 +}; + +static const unsigned char from_above_bits[] = { + 0xff,0x03, + 0xff,0x03, + 0x00,0x00, + 0xfc,0x00, + 0x78,0x00, + 0x30,0x00, + 0x00,0x00, + 0x00,0x00, + 0x00,0x00, + 0x00,0x00 +}; + +static const unsigned char keep_below_bits[] = { + 0x00,0x00, + 0x00,0x00, + 0x00,0x00, + 0x00,0x00, + 0xff,0x03, + 0xff,0x03, + 0x00,0x00, + 0xfc,0x00, + 0x78,0x00, + 0x30,0x00 +}; + +static const unsigned char from_below_bits[] = { + 0x00,0x00, + 0x00,0x00, + 0x00,0x00, + 0x00,0x00, + 0x30,0x00, + 0x78,0x00, + 0xfc,0x00, + 0x00,0x00, + 0xff,0x03, + 0xff,0x03 +}; + +static const unsigned char resize_bits[] = { + 0xff, 0x03, + 0xff, 0x03, + 0x33, 0x03, + 0x33, 0x03, + 0xf3, 0x03, + 0xf3, 0x03, + 0x03, 0x03, + 0x03, 0x03, + 0xff, 0x03, + 0xff, 0x03 +}; + + +// If the maximize graphic above (which I did quickly in about a +// minute, just so I could have something) doesn't please, maybe one +// of the following would be better. IMO it doesn't matter, as long +// as it's not offensive---people will get used to whatever you use. +// True NeXT fans won't turn on the maximize button anyway. +// +// static const unsigned char maximize_bits[] = { +// 0xcf, 0x03, 0x87, 0x03, 0xcf, 0x03, 0xfd, 0x02, 0x48, 0x00, 0x48, 0x00, +// 0xfd, 0x02, 0xcf, 0x03, 0x87, 0x03, 0xcf, 0x03 }; +// +// static const unsigned char maximize_bits[] = { +// 0xcf, 0x03, 0x87, 0x03, 0x87, 0x03, 0x79, 0x02, 0x48, 0x00, 0x48, 0x00, +// 0x79, 0x02, 0x87, 0x03, 0x87, 0x03, 0xcf, 0x03 }; +// +// static const unsigned char maximize_bits[] = { +// 0x87, 0x03, 0x03, 0x03, 0xfd, 0x02, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, +// 0x84, 0x00, 0xfd, 0x02, 0x03, 0x03, 0x87, 0x03 }; +// +// static const unsigned char maximize_bits[] = { +// 0x30, 0x00, 0x78, 0x00, 0xcc, 0x00, 0x86, 0x01, 0x33, 0x03, 0x79, 0x02, +// 0xcd, 0x02, 0x87, 0x03, 0x03, 0x03, 0x01, 0x02 }; +// +// static const unsigned char maximize_bits[] = { +// 0x30, 0x00, 0x78, 0x00, 0x78, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0xfe, 0x01, +// 0xfe, 0x01, 0xff, 0x03, 0xff, 0x03, 0xff, 0x03 }; + + +static KPixmap *aTitlePix; +static KPixmap *iTitlePix; +static KPixmap *aFramePix; +static KPixmap *iFramePix; +static KPixmap *aHandlePix; +static KPixmap *iHandlePix; +static KPixmap *aBtn; +static KPixmap *aBtnDown; +static KPixmap *iBtn; +static KPixmap *iBtnDown; +static TQColor *btnForeground; +static bool pixmaps_created = false; + +static int titleHeight = 16; + +// Precomputed border sizes for accessibility +// The sizes are applied for tiny -> normal -> large -> very large -> huge -> very huge -> oversized +static const int borderSizes[] = { 4, 6, 9, 14, 21, 32, 48 }; + +static int handleSize = 6; // the resize handle size in pixels + +static inline const KDecorationOptions* options() +{ + return KDecoration::options(); +} + +static void create_pixmaps(NextClientFactory *f) +{ + if(pixmaps_created) + return; + pixmaps_created = true; + + // find preferred border size + int i = options()->preferredBorderSize(f); + if (i >= 0 && i <= 6) handleSize = borderSizes[i]; + + titleHeight = TQFontMetrics(options()->font(true)).height() + 4; + if (titleHeight < handleSize) titleHeight = handleSize; + titleHeight &= ~1; // Make title height even + if (titleHeight < 16) titleHeight = 16; + + aTitlePix = new KPixmap(); + aTitlePix->resize(32, titleHeight - 2); + KPixmapEffect::gradient(*aTitlePix, + options()->color(KDecoration::ColorTitleBar, true), + options()->color(KDecoration::ColorTitleBlend, true), + KPixmapEffect::VerticalGradient); + iTitlePix = new KPixmap(); + iTitlePix->resize(32, titleHeight - 2); + KPixmapEffect::gradient(*iTitlePix, + options()->color(KDecoration::ColorTitleBar, false), + options()->color(KDecoration::ColorTitleBlend, false), + KPixmapEffect::VerticalGradient); + // Bottom frame gradient + aFramePix = new KPixmap(); + aFramePix->resize(32, handleSize); + KPixmapEffect::gradient(*aFramePix, + options()->color(KDecoration::ColorFrame, true).light(150), + options()->color(KDecoration::ColorFrame, true).dark(120), + KPixmapEffect::VerticalGradient); + iFramePix = new KPixmap(); + iFramePix->resize(32, handleSize); + KPixmapEffect::gradient(*iFramePix, + options()->color(KDecoration::ColorFrame, false).light(150), + options()->color(KDecoration::ColorFrame, false).dark(120), + KPixmapEffect::VerticalGradient); + + // Handle gradient + aHandlePix = new KPixmap(); + aHandlePix->resize(32, handleSize); + KPixmapEffect::gradient(*aHandlePix, + options()->color(KDecoration::ColorHandle, true).light(150), + options()->color(KDecoration::ColorHandle, true).dark(120), + KPixmapEffect::VerticalGradient); + iHandlePix = new KPixmap(); + iHandlePix->resize(32, handleSize); + KPixmapEffect::gradient(*iHandlePix, + options()->color(KDecoration::ColorHandle, false).light(150), + options()->color(KDecoration::ColorHandle, false).dark(120), + KPixmapEffect::VerticalGradient); + + int btnWidth = titleHeight; + iBtn = new KPixmap; + iBtn->resize(btnWidth, btnWidth); + iBtnDown = new KPixmap; + iBtnDown->resize(btnWidth, btnWidth); + aBtn = new KPixmap; + aBtn->resize(btnWidth, btnWidth); + aBtnDown = new KPixmap; + aBtnDown->resize(btnWidth, btnWidth); + KPixmap internal; + int internalHeight = btnWidth - 6; + internal.resize(internalHeight, internalHeight); + + // inactive buttons + TQColor c(options()->color(KDecoration::ColorButtonBg, false)); + KPixmapEffect::gradient(*iBtn, c.light(120), c.dark(120), + KPixmapEffect::DiagonalGradient); + KPixmapEffect::gradient(internal, c.dark(120), c.light(120), + KPixmapEffect::DiagonalGradient); + bitBlt(TQT_TQPAINTDEVICE(iBtn), 3, 3, TQT_TQPAINTDEVICE(&internal), 0, 0, internalHeight, internalHeight, TQt::CopyROP, true); + + KPixmapEffect::gradient(*iBtnDown, c.dark(120), c.light(120), + KPixmapEffect::DiagonalGradient); + KPixmapEffect::gradient(internal, c.light(120), c.dark(120), + KPixmapEffect::DiagonalGradient); + bitBlt(TQT_TQPAINTDEVICE(iBtnDown), 3, 3, TQT_TQPAINTDEVICE(&internal), 0, 0, internalHeight, internalHeight, TQt::CopyROP, true); + + // active buttons + c = options()->color(KDecoration::ColorButtonBg, true); + KPixmapEffect::gradient(*aBtn, c.light(120), c.dark(120), + KPixmapEffect::DiagonalGradient); + KPixmapEffect::gradient(internal, c.dark(120), c.light(120), + KPixmapEffect::DiagonalGradient); + bitBlt(TQT_TQPAINTDEVICE(aBtn), 3, 3, TQT_TQPAINTDEVICE(&internal), 0, 0, internalHeight, internalHeight, TQt::CopyROP, true); + + KPixmapEffect::gradient(*aBtnDown, c.dark(120), c.light(120), + KPixmapEffect::DiagonalGradient); + KPixmapEffect::gradient(internal, c.light(120), c.dark(120), + KPixmapEffect::DiagonalGradient); + bitBlt(TQT_TQPAINTDEVICE(aBtnDown), 3, 3, TQT_TQPAINTDEVICE(&internal), 0, 0, internalHeight, internalHeight, TQt::CopyROP, true); + + TQPainter p; + p.begin(aBtn); + p.setPen(TQt::black); + p.drawRect(0, 0, btnWidth, btnWidth); + p.end(); + p.begin(iBtn); + p.setPen(TQt::black); + p.drawRect(0, 0, btnWidth, btnWidth); + p.end(); + p.begin(aBtnDown); + p.setPen(TQt::black); + p.drawRect(0, 0, btnWidth, btnWidth); + p.end(); + p.begin(iBtnDown); + p.setPen(TQt::black); + p.drawRect(0, 0, btnWidth, btnWidth); + p.end(); + + if(tqGray(options()->color(KDecoration::ColorButtonBg, true).rgb()) > 128) + btnForeground = new TQColor(TQt::black); + else + btnForeground = new TQColor(TQt::white); +} + +static void delete_pixmaps() +{ + delete aTitlePix; + delete iTitlePix; + delete aFramePix; + delete iFramePix; + delete aHandlePix; + delete iHandlePix; + delete aBtn; + delete iBtn; + delete aBtnDown; + delete iBtnDown; + delete btnForeground; + + pixmaps_created = false; +} + +// ===================================== + +NextButton::NextButton(NextClient *parent, const char *name, + const unsigned char *bitmap, int bw, int bh, + const TQString& tip, const int realizeBtns) + : TQButton(parent->widget(), name), + deco(NULL), client(parent), last_button(Qt::NoButton) +{ + realizeButtons = realizeBtns; + + setBackgroundMode( NoBackground ); + resize(titleHeight, titleHeight); + setFixedSize(titleHeight, titleHeight); + + if(bitmap) + setBitmap(bitmap, bw, bh); + + TQToolTip::add(this, tip); +} + +void NextButton::reset() +{ + tqrepaint(false); +} + +void NextButton::setBitmap(const unsigned char *bitmap, int w, int h) +{ + deco = new TQBitmap(w, h, bitmap, true); + deco->setMask(*deco); + tqrepaint(); +} + +void NextButton::drawButton(TQPainter *p) +{ + if(client->isActive()) + p->drawPixmap(0, 0, isDown() ? *aBtnDown : *aBtn); + else + p->drawPixmap(0, 0, isDown() ? *iBtnDown : *iBtn); + + // If we have a decoration, draw it; otherwise, we have the menu + // button (remember, we set the bitmap to NULL). + int offset; + if (deco) { + offset = (titleHeight - 10) / 2 + (isDown() ? 1 : 0); + p->setPen(*btnForeground); + p->drawPixmap(offset, offset, *deco); + } else { + offset = (titleHeight - 16) / 2; + KPixmap btnpix = client->icon().pixmap(TQIconSet::Small, + client->isActive() ? TQIconSet::Normal : TQIconSet::Disabled); + p->drawPixmap( offset, offset, btnpix ); + } +} + +void NextButton::mousePressEvent( TQMouseEvent* e ) +{ + last_button = e->button(); + TQMouseEvent me( e->type(), e->pos(), e->globalPos(), + (e->button()&realizeButtons)?Qt::LeftButton:Qt::NoButton, e->state() ); + TQButton::mousePressEvent( &me ); +} + +void NextButton::mouseReleaseEvent( TQMouseEvent* e ) +{ + last_button = e->button(); + TQMouseEvent me( e->type(), e->pos(), e->globalPos(), + (e->button()&realizeButtons)?Qt::LeftButton:Qt::NoButton, e->state() ); + TQButton::mouseReleaseEvent( &me ); +} + +// ===================================== + +NextClient::NextClient(KDecorationBridge *b, KDecorationFactory *f) + : KDecoration(b, f) +{ +} + +void NextClient::init() +{ + createMainWidget(WResizeNoErase | WStaticContents); + widget()->installEventFilter(this); + + widget()->setBackgroundMode( NoBackground ); + + TQVBoxLayout *mainLayout = new TQVBoxLayout(widget()); + TQBoxLayout *titleLayout = new TQBoxLayout(0, TQBoxLayout::LeftToRight, 0, 0, 0); + TQHBoxLayout *windowLayout = new TQHBoxLayout(); + mainLayout->addLayout(titleLayout); + mainLayout->addLayout(windowLayout, 1); + mainLayout->addSpacing(mustDrawHandle() ? handleSize : 1); + + windowLayout->addSpacing(1); + if (isPreview()) + windowLayout->addWidget(new TQLabel(i18n( + "
KStep preview
"), widget())); + else + windowLayout->addItem(new TQSpacerItem( 0, 0 )); + + windowLayout->addSpacing(1); + + initializeButtonsAndTitlebar(titleLayout); +} + +/** + Preconditions: + + button is an array of length MAX_NUM_BUTTONS + + Postconditions: + + Title bar and buttons have been initialized and laid out + + for all i in 0..(MAX_NUM_BUTTONS-1), button[i] points to + either (1) a valid NextButton instance, if the corresponding + button is selected in the current button scheme, or (2) null + otherwise. + */ +void NextClient::initializeButtonsAndTitlebar(TQBoxLayout* titleLayout) +{ + // Null the buttons to begin with (they are not guaranteed to be null). + for (int i=0; icustomButtonPositions()) { + left = options()->titleButtonsLeft(); + right = options()->titleButtonsRight(); + } else { + left = TQString("I"); + right = TQString("SX"); + } + + // Do actual creation and addition to titleLayout + addButtons(titleLayout, left); + + titlebar = new TQSpacerItem(10, titleHeight, TQSizePolicy::Expanding, + TQSizePolicy::Minimum ); + titleLayout->addItem(titlebar); + addButtons(titleLayout, right); + + // Finally, activate all live buttons + for ( int i = 0; i < MAX_NUM_BUTTONS; i++) { + if (button[i]) { + button[i]->setMouseTracking( TRUE ); + } + } +} + +/** Adds the buttons for one side of the title bar, based on the spec + * string; see the KWinInternal::KDecoration class, methods + * titleButtonsLeft and titleBUttonsRight. */ +void NextClient::addButtons(TQBoxLayout* titleLayout, const TQString& spec) +{ + for (unsigned int i=0; iaddWidget( button[MAXIMIZE_IDX] ); + connect( button[MAXIMIZE_IDX], TQT_SIGNAL(clicked()), + this, TQT_SLOT(maximizeButtonClicked()) ); + } + break; + + case 'H': + if (providesContextHelp()) { + button[HELP_IDX] = new NextButton(this, + "help", question_bits, 10, 10, i18n("Help")); + titleLayout->addWidget( button[HELP_IDX] ); + connect( button[HELP_IDX], TQT_SIGNAL(clicked()), + this, TQT_SLOT(showContextHelp()) ); + } + break; + + case 'I': + if (isMinimizable()) { + button[ICONIFY_IDX] = + new NextButton(this, "iconify", iconify_bits, 10, 10, + i18n("Minimize")); + titleLayout->addWidget( button[ICONIFY_IDX] ); + connect( button[ICONIFY_IDX], TQT_SIGNAL(clicked()), + this, TQT_SLOT(minimize()) ); + } + break; + + case 'M': + button[MENU_IDX] = + new NextButton(this, "menu", NULL, 10, 10, i18n("Menu"), Qt::LeftButton|Qt::RightButton); + titleLayout->addWidget( button[MENU_IDX] ); + // NOTE DIFFERENCE: capture pressed(), not clicked() + connect( button[MENU_IDX], TQT_SIGNAL(pressed()), + this, TQT_SLOT(menuButtonPressed()) ); + break; + + case 'L': + button[SHADE_IDX] = + new NextButton(this, "shade", NULL, 0, 0, i18n("Shade")); + titleLayout->addWidget( button[SHADE_IDX] ); + connect( button[SHADE_IDX], TQT_SIGNAL(clicked()), + this, TQT_SLOT(shadeClicked()) ); + // NOTE DIFFERENCE: set the pixmap separately (2 states) + shadeChange(); + break; + + case 'S': + button[STICKY_IDX] = + new NextButton(this, "sticky", NULL, 0, 0, i18n("On all desktops")); + titleLayout->addWidget( button[STICKY_IDX] ); + connect( button[STICKY_IDX], TQT_SIGNAL(clicked()), + this, TQT_SLOT(toggleOnAllDesktops()) ); + // NOTE DIFFERENCE: set the pixmap separately (2 states) + desktopChange(); + break; + + case 'F': + button[ABOVE_IDX] = new NextButton(this, "above", NULL, 0, 0, ""); + titleLayout->addWidget( button[ABOVE_IDX] ); + connect( button[ABOVE_IDX], TQT_SIGNAL(clicked()), + this, TQT_SLOT(aboveClicked()) ); + connect(this, TQT_SIGNAL(keepAboveChanged(bool)), + TQT_SLOT(keepAboveChange(bool))); + keepAboveChange(keepAbove()); + break; + + case 'B': + button[BELOW_IDX] = new NextButton(this, "below", NULL, 0, 0, ""); + titleLayout->addWidget( button[BELOW_IDX] ); + connect( button[BELOW_IDX], TQT_SIGNAL(clicked()), + this, TQT_SLOT(belowClicked()) ); + connect(this, TQT_SIGNAL(keepBelowChanged(bool)), + TQT_SLOT(keepBelowChange(bool))); + keepBelowChange(keepBelow()); + break; + + case 'X': + if (isCloseable()) { + button[CLOSE_IDX] = + new NextButton(this, "close", close_bits, 10, 10, + i18n("Close")); + titleLayout->addWidget(button[CLOSE_IDX]); + connect(button[CLOSE_IDX], TQT_SIGNAL(clicked()), + this, TQT_SLOT(closeWindow())); + } + break; + + case 'R': + if (mustDrawHandle()) { + button[RESIZE_IDX] = + new NextButton(this, "resize", resize_bits, 10, 10, + i18n("Resize")); + titleLayout->addWidget(button[RESIZE_IDX]); + // NOTE DIFFERENCE: capture pressed(), not clicked() + connect(button[RESIZE_IDX], TQT_SIGNAL(pressed()), + this, TQT_SLOT(resizePressed())); + } + break; + case '_': + // TODO: Add spacer handling + break; + + default: + kdDebug() << " Can't happen: unknown button code " + << TQString(spec[i]); + break; + } + } +} + +bool NextClient::mustDrawHandle() const +{ + bool drawSmallBorders = !options()->moveResizeMaximizedWindows(); + if (drawSmallBorders && (maximizeMode() & MaximizeVertical)) { + return false; + } else { + return isResizable(); + } +} + +void NextClient::iconChange() +{ + if (button[MENU_IDX] && button[MENU_IDX]->isVisible()) + button[MENU_IDX]->tqrepaint(false); +} + +void NextClient::menuButtonPressed() +{ + // Probably don't need this null check, but we might as well. + if (button[MENU_IDX]) { + TQRect menuRect = button[MENU_IDX]->rect(); + TQPoint menuTop = button[MENU_IDX]->mapToGlobal(menuRect.topLeft()); + TQPoint menuBottom = button[MENU_IDX]->mapToGlobal(menuRect.bottomRight()); + menuTop += TQPoint(1, 1); + menuBottom += TQPoint(1, 1); + KDecorationFactory* f = factory(); + showWindowMenu(TQRect(menuTop, menuBottom)); + if( !f->exists( this )) // 'this' was deleted + return; + button[MENU_IDX]->setDown(false); + } +} + +// Copied, with minor edits, from KDEDefaultClient::slotMaximize() +void NextClient::maximizeButtonClicked() +{ + if (button[MAXIMIZE_IDX]) { + maximize(button[MAXIMIZE_IDX]->lastButton()); + } +} + +void NextClient::shadeClicked() +{ + setShade(!isSetShade()); +} + +void NextClient::aboveClicked() +{ + setKeepAbove(!keepAbove()); +} + +void NextClient::belowClicked() +{ + setKeepBelow(!keepBelow()); + keepAboveChange(keepAbove()); + keepBelowChange(keepBelow()); +} + +void NextClient::resizePressed() +{ + performWindowOperation(ResizeOp); +} + +void NextClient::resizeEvent(TQResizeEvent *) +{ + if (widget()->isVisible()) { + // TODO ? update border area only? + widget()->update(); +#if 0 + widget()->update(titlebar->tqgeometry()); + TQPainter p(widget()); + TQRect t = titlebar->tqgeometry(); + t.setTop( 0 ); + TQRegion r = widget()->rect(); + r = r.subtract( t ); + p.setClipRegion( r ); + p.eraseRect(widget()->rect()); +#endif + } +} + +void NextClient::captionChange() +{ + widget()->tqrepaint(titlebar->tqgeometry(), false); +} + + +void NextClient::paintEvent( TQPaintEvent* ) +{ + TQPainter p(widget()); + + // Draw black frame + TQRect fr = widget()->rect(); + p.setPen(TQt::black); + p.drawRect(fr); + + // Draw title bar + TQRect t = titlebar->tqgeometry(); + t.setTop(1); + p.drawTiledPixmap(t.x()+1, t.y()+1, t.width()-2, t.height()-2, + isActive() ? *aTitlePix : *iTitlePix); + qDrawShadePanel(&p, t.x(), t.y(), t.width(), t.height()-1, + options()->tqcolorGroup(KDecoration::ColorTitleBar, isActive())); + p.drawLine(t.x(), t.bottom(), t.right(), t.bottom()); + +#if 0 + // Why setting up a clipping region if it is not used? (setClipping(false)) + TQRegion r = fr; + r = r.subtract( t ); + p.setClipRegion( r ); + p.setClipping(false); +#endif + + t.setTop( 1 ); + t.setHeight(t.height()-2); + t.setLeft( t.left() + 4 ); + t.setRight( t.right() - 2 ); + + p.setPen(options()->color(KDecoration::ColorFont, isActive())); + p.setFont(options()->font(isActive())); + p.drawText( t, AlignCenter | AlignVCenter, caption() ); + + // Draw resize handle + if (mustDrawHandle()) { + int corner = 16 + 3*handleSize/2; + qDrawShadePanel(&p, + fr.x() + 1, fr.bottom() - handleSize, corner-1, handleSize, + options()->tqcolorGroup(KDecoration::ColorHandle, isActive()), + false); + p.drawTiledPixmap(fr.x() + 2, fr.bottom() - handleSize + 1, + corner - 3, handleSize - 2, isActive() ? *aHandlePix : *iHandlePix); + + qDrawShadePanel(&p, + fr.x() + corner, fr.bottom() - handleSize, + fr.width() - 2*corner, handleSize, + options()->tqcolorGroup(KDecoration::ColorFrame, isActive()), + false); + p.drawTiledPixmap(fr.x() + corner + 1, fr.bottom() - handleSize + 1, + fr.width() - 2*corner - 2, handleSize - 2, + isActive() ? *aFramePix : *iFramePix); + + qDrawShadePanel(&p, + fr.right() - corner + 1, fr.bottom() - handleSize, corner - 1, handleSize, + options()->tqcolorGroup(KDecoration::ColorHandle, isActive()), + false); + p.drawTiledPixmap(fr.right() - corner + 2, fr.bottom() - handleSize + 1, + corner - 3, handleSize - 2, isActive() ? *aHandlePix : *iHandlePix); + } +} + +void NextClient::mouseDoubleClickEvent( TQMouseEvent * e ) +{ + if (e->button() == Qt::LeftButton && titlebar->tqgeometry().contains( e->pos() ) ) + titlebarDblClickOperation(); +} + +void NextClient::wheelEvent( TQWheelEvent * e ) +{ + if (isSetShade() || TQRect( 0, 0, width(), titleHeight ).contains( e->pos() ) ) + titlebarMouseWheelOperation( e->delta()); +} + +void NextClient::showEvent(TQShowEvent *) +{ + widget()->tqrepaint(); +} + +void NextClient::desktopChange() +{ + bool on = isOnAllDesktops(); + if (NextButton * b = button[STICKY_IDX]) { + b->setBitmap( on ? unsticky_bits : sticky_bits, 10, 10); + TQToolTip::remove(b); + TQToolTip::add(b, on ? i18n("Not on all desktops") : i18n("On all desktops")); + } +} + +void NextClient::maximizeChange() +{ + if (button[MAXIMIZE_IDX]) { + bool m = maximizeMode() == MaximizeFull; + //button[MAXIMIZE_IDX]->setBitmap(m ? minmax_bits : maximize_bits); + TQToolTip::remove(button[MAXIMIZE_IDX]); + TQToolTip::add(button[MAXIMIZE_IDX], + m ? i18n("Restore") : i18n("Maximize")); + } + //spacer->changeSize(10, mustDrawHandle() ? handleSize : 1, + // TQSizePolicy::Expanding, TQSizePolicy::Minimum); + //mainLayout->activate(); +} + +void NextClient::activeChange() +{ + widget()->tqrepaint(false); + slotReset(); +} + +void NextClient::slotReset() +{ + for (int i=0; ireset(); + } + } +} + +KDecoration::Position +NextClient::mousePosition( const TQPoint& p ) const +{ + Position m = PositionCenter; + + if (p.y() < (height() - handleSize)) + m = KDecoration::mousePosition(p); + + else { + int corner = 16 + 3*handleSize/2; + if (p.x() >= (width() - corner)) + m = PositionBottomRight; + else if (p.x() <= corner) + m = PositionBottomLeft; + else + m = PositionBottom; + } + + return m; +} + +void NextClient::borders(int &left, int &right, int &top, int &bottom) const +{ + left = right = 1; + top = titleHeight; // FRAME is this ok? + bottom = mustDrawHandle() ? handleSize : 1; +} + +void NextClient::shadeChange() +{ + if (NextButton *b = button[SHADE_IDX]) { + b->setBitmap(isSetShade() ? unshade_bits : shade_bits, 10, 10); + TQToolTip::remove(b); + TQToolTip::add(b, isSetShade() ? i18n("Unshade") : i18n("Shade")); + } +} + +void NextClient::keepAboveChange(bool above) +{ + if (NextButton *b = button[ABOVE_IDX]) { + b->setBitmap(above ? from_above_bits : keep_above_bits, 10, 10); + TQToolTip::remove(b); + TQToolTip::add(b, above ? + i18n("Do not keep above others") : i18n("Keep above others")); + b->tqrepaint(false); + } +} + +void NextClient::keepBelowChange(bool below) +{ + if (NextButton *b = button[BELOW_IDX]) { + b->setBitmap(below ? from_below_bits : keep_below_bits, 10, 10); + TQToolTip::remove(b); + TQToolTip::add(b, below ? + i18n("Do not keep below others") : i18n("Keep below others")); + b->tqrepaint(false); + } +} + +TQSize NextClient::tqminimumSize() const +{ + return TQSize(titleHeight * 6 + 2, titleHeight + handleSize + 2); +} + +void NextClient::resize(const TQSize& s) +{ + widget()->resize(s); +} + +void NextClient::reset(unsigned long) +{ + for (int i = 0; i < MAX_NUM_BUTTONS; ++i) { + if (button[i]) + button[i]->reset(); + } + widget()->tqrepaint(); +} + +bool NextClient::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::Wheel: + wheelEvent( TQT_TQWHEELEVENT( e )); + return true; + case TQEvent::MouseButtonPress: + processMousePressEvent(TQT_TQMOUSEEVENT( e )); + return true; + case TQEvent::Show: + showEvent(TQT_TQSHOWEVENT( e )); + return true; + default: + break; + } + return false; +} + +bool NextClient::drawbound(const TQRect& geom, bool /* clear */) +{ + TQPainter p(workspaceWidget()); + p.setPen(TQPen(TQt::white, 3)); + p.setRasterOp(TQt::XorROP); + p.drawRect(geom); + int leftMargin = geom.left() + 2; + p.fillRect(leftMargin, geom.top() + titleHeight - 1, + geom.width() - 4, 3, TQt::white); + if (mustDrawHandle()) { + p.fillRect(leftMargin, geom.bottom() - handleSize - 1, + geom.width() - 4, 3, TQt::white); + } + return true; +} + +// ===================================== + +NextClientFactory::NextClientFactory() +{ + create_pixmaps(this); +} + +NextClientFactory::~NextClientFactory() +{ + delete_pixmaps(); +} + +KDecoration *NextClientFactory::createDecoration(KDecorationBridge *b) +{ + return new NextClient(b, this); +} + +bool NextClientFactory::reset(unsigned long /*changed*/) +{ + // TODO Do not recreate decorations if it is not needed. Look at + // ModernSystem for how to do that + delete_pixmaps(); + create_pixmaps(this); + // For now just return true. + return true; +} + +bool NextClientFactory::supports( Ability ability ) +{ + switch( ability ) + { + case AbilityAnnounceButtons: + case AbilityButtonMenu: + case AbilityButtonOnAllDesktops: + case AbilityButtonHelp: + case AbilityButtonMinimize: + case AbilityButtonMaximize: + case AbilityButtonClose: + case AbilityButtonAboveOthers: + case AbilityButtonBelowOthers: + case AbilityButtonShade: + case AbilityButtonResize: + return true; + default: + return false; + }; +} + +TQValueList< NextClientFactory::BorderSize > +NextClientFactory::borderSizes() const +{ + // the list must be sorted + return TQValueList< BorderSize >() << BorderTiny << BorderNormal << + BorderLarge << BorderVeryLarge << BorderHuge << + BorderVeryHuge << BorderOversized; +} + +} // KStep namespace + +extern "C" KDE_EXPORT KDecorationFactory* create_factory() +{ + return new KStep::NextClientFactory(); +} + +#include "nextclient.moc" + +// vim: sw=4 diff --git a/twin-styles/kstep/nextclient.h b/twin-styles/kstep/nextclient.h new file mode 100644 index 00000000..b24da66d --- /dev/null +++ b/twin-styles/kstep/nextclient.h @@ -0,0 +1,126 @@ +#ifndef __NEXTCLIENT_H +#define __NEXTCLIENT_H + +#include +#include +#include +#include +#include +#include +#include + +class TQLabel; +class TQSpacerItem; + +namespace KStep { + +class NextClient; + +class NextButton : public TQButton +{ +public: + NextButton(NextClient *parent=0, const char *name=0, + const unsigned char *bitmap=NULL, int bw=0, int bh=0, + const TQString& tip=NULL, const int realizeBtns = Qt::LeftButton); + void setBitmap(const unsigned char *bitmap, int bw, int bh); + void reset(); + ButtonState lastButton() { return last_button; } + +protected: + void mousePressEvent( TQMouseEvent* e ); + void mouseReleaseEvent( TQMouseEvent* e ); + virtual void drawButton(TQPainter *p); + void drawButtonLabel(TQPainter *){;} + + KPixmap aBackground, iBackground; + TQBitmap* deco; + NextClient *client; + ButtonState last_button; + int realizeButtons; +}; + +class NextClient : public KDecoration +{ + Q_OBJECT + TQ_OBJECT +public: + NextClient(KDecorationBridge *b, KDecorationFactory *f); + ~NextClient() {;} + void init(); + virtual bool drawbound(const TQRect& geom, bool clear); +protected: + bool eventFilter(TQObject *o, TQEvent *e); + void resizeEvent( TQResizeEvent* ); + void paintEvent( TQPaintEvent* ); + void showEvent( TQShowEvent* ); + + void mouseDoubleClickEvent( TQMouseEvent * ); + void wheelEvent( TQWheelEvent * ); + void captionChange(); + void desktopChange(); + void activeChange(); + void shadeChange(); + void iconChange(); + TQSize tqminimumSize() const; + void resize(const TQSize &size); + void borders(int &left, int &right, int &top, int &bottom) const; + void reset(unsigned long changed); + void calcHiddenButtons(); + void updateActiveBuffer(); + + Position mousePosition(const TQPoint &) const; + void maximizeChange(); + +protected slots: + void slotReset(); + void menuButtonPressed(); + void maximizeButtonClicked(); + void shadeClicked(); + void aboveClicked(); + void belowClicked(); + void resizePressed(); + + void keepAboveChange(bool above); + void keepBelowChange(bool below); + +private: + void initializeButtonsAndTitlebar(TQBoxLayout* titleLayout); + void addButtons(TQBoxLayout* titleLayout, const TQString& buttons); + bool mustDrawHandle() const; + + TQSpacerItem* titlebar; + + // Helpful constants for buttons in array + enum { CLOSE_IDX = 0, + HELP_IDX, + ICONIFY_IDX, + MAXIMIZE_IDX, + MENU_IDX, + SHADE_IDX, + ABOVE_IDX, + BELOW_IDX, + RESIZE_IDX, + STICKY_IDX, + MAX_NUM_BUTTONS = STICKY_IDX + 1 }; + + // WARNING: button[i] may be null for any given i. Make sure you + // always check for null before doing button[i]->foo(). + NextButton* button[MAX_NUM_BUTTONS]; +}; + +class NextClientFactory: public TQObject, public KDecorationFactory +{ +public: + NextClientFactory(); + virtual ~NextClientFactory(); + virtual KDecoration *createDecoration(KDecorationBridge *); + virtual bool reset(unsigned long changed); + virtual bool supports( Ability ability ); + + TQValueList< NextClientFactory::BorderSize > borderSizes() const; + +}; + +} + +#endif diff --git a/twin-styles/openlook/CMakeLists.txt b/twin-styles/openlook/CMakeLists.txt new file mode 100644 index 00000000..061dd697 --- /dev/null +++ b/twin-styles/openlook/CMakeLists.txt @@ -0,0 +1,33 @@ +################################################# +# +# (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} + ${CMAKE_BINARY_DIR} + ${TDE_INCLUDE_DIR} + ${TQT_INCLUDE_DIRS} +) + +link_directories( + ${TQT_LIBRARY_DIRS} +) + +##### other data ################################ + +install( FILES openlook.desktop DESTINATION ${DATA_INSTALL_DIR}/twin ) + +##### twin3_openlook ############################ + +tde_add_kpart( twin3_openlook AUTOMOC + SOURCES OpenLook.cpp + LINK tdecorations-shared + DESTINATION ${PLUGIN_INSTALL_DIR} +) diff --git a/twin-styles/openlook/Makefile.am b/twin-styles/openlook/Makefile.am new file mode 100644 index 00000000..32b41684 --- /dev/null +++ b/twin-styles/openlook/Makefile.am @@ -0,0 +1,16 @@ +INCLUDES = $(all_includes) + +kde_module_LTLIBRARIES = twin3_openlook.la + +twin3_openlook_la_SOURCES = OpenLook.cpp +twin3_openlook_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module $(LIB_QT) $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx +twin3_openlook_la_LIBADD = -ltdecorations + +noinst_HEADERS = OpenLook.h +METASOURCES = AUTO + +linkdir = $(kde_datadir)/twin/ +link_DATA = openlook.desktop + +EXTRA_DIST = $(link_DATA) + diff --git a/twin-styles/openlook/OpenLook.cpp b/twin-styles/openlook/OpenLook.cpp new file mode 100644 index 00000000..46398e30 --- /dev/null +++ b/twin-styles/openlook/OpenLook.cpp @@ -0,0 +1,728 @@ +/* + 'OpenLook' twin client + + Porting to trinity.2 API + Copyright 2003 Luciano Montanaro + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#include "config.h" +#include // for usleep +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "OpenLook.h" + +extern "C" KDE_EXPORT KDecorationFactory* create_factory() +{ + return new OpenLook::DecorationFactory(); +} + +namespace OpenLook { + +static uint openLookCornerSize = 11; +static uint openLookMargin = 5; +static const uint openLookTextVMargin = 1; +static uint titleHeight; + +// --------------------------------------- + +DecorationFactory::DecorationFactory() +{ +} + +DecorationFactory::~DecorationFactory() +{ +} + +KDecoration *DecorationFactory::createDecoration(KDecorationBridge *b) +{ + return new OpenLook(b, this); +} + +bool DecorationFactory::reset(unsigned long /*changed*/) +{ + // TODO Do not recreate decorations if it is not needed. Look at + // ModernSystem for how to do that + // For now just return true. + return true; +} + +bool DecorationFactory::supports( Ability ability ) +{ + switch( ability ) + { + case AbilityAnnounceButtons: + case AbilityButtonMinimize: + return true; + default: + return false; + }; +} + +TQValueList< DecorationFactory::BorderSize > +DecorationFactory::borderSizes() const +{ + // the list must be sorted + return TQValueList< BorderSize >() << BorderNormal << + BorderLarge << BorderVeryLarge << BorderHuge << + BorderVeryHuge << BorderOversized; +} + +// --------------------------------------- + +static inline const KDecorationOptions* options() +{ + return KDecoration::options(); +} + +// --------------------------------------- + +OpenLook::OpenLook(KDecorationBridge *b, KDecorationFactory *f) : + KDecoration(b, f), + titleSpacer_ (0), + mousePressPoint_(0, 0), // Anywhere outside button rect. + buttonDown_ (false) +{ +} + +void OpenLook::init() +{ + static const int SUPPORTED_WINDOW_TYPES_MASK = NET::NormalMask | + NET::DesktopMask | NET::DockMask | NET::ToolbarMask | NET::MenuMask | + NET::DialogMask | NET::OverrideMask | NET::TopMenuMask | + NET::UtilityMask | NET::SplashMask; + + createMainWidget(WStaticContents | WResizeNoErase | WRepaintNoErase); + widget()->installEventFilter(this); + widget()->setBackgroundMode(NoBackground); + NET::WindowType type = windowType(SUPPORTED_WINDOW_TYPES_MASK); + tool_ = (type == NET::Toolbar || type == NET::Utility || type == NET::Menu); + TQFontMetrics fm(options()->font(isActive(), tool_)); + + titleHeight = fm.height() + openLookTextVMargin * 2; + + switch(KDecoration::options()->preferredBorderSize(factory())) { + case KDecoration::BorderLarge: + openLookMargin = 9; + break; + case KDecoration::BorderVeryLarge: + openLookMargin = 13; + break; + case KDecoration::BorderHuge: + openLookMargin = 18; + break; + case KDecoration::BorderVeryHuge: + openLookMargin = 27; + break; + case KDecoration::BorderOversized: + openLookMargin = 40; + break; + case KDecoration::BorderNormal: + default: + openLookMargin = 5; + } + openLookCornerSize = 2*openLookMargin + 1; + if (titleHeight <= openLookMargin) + titleHeight = openLookMargin+1; + + doLayout(); +} + +OpenLook::~OpenLook() +{ + // Empty. +} + +bool OpenLook::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::Wheel: + wheelEvent( TQT_TQWHEELEVENT( e )); + return true; + case TQEvent::MouseButtonPress: + if (!isButtonPress(TQT_TQMOUSEEVENT(e))) { + processMousePressEvent(TQT_TQMOUSEEVENT(e)); + } + return true; + case TQEvent::MouseButtonRelease: + if (isButtonRelease(TQT_TQMOUSEEVENT(e))) { + return true; + } else { + return false; + } + case TQEvent::Show: + showEvent(TQT_TQSHOWEVENT(e)); + return true; + default: + break; + } + return false; +} + + void +OpenLook::borders(int &left, int &right, int &top, int &bottom) const +{ + // FRAME XXX Check + left = right = bottom = openLookMargin; + top = titleHeight + openLookMargin; +} + + void +OpenLook::captionChange() +{ + widget()->update(titleRect()); +} + + void +OpenLook::shadeChange() +{ +} + +TQSize OpenLook::tqminimumSize() const +{ + int left, right, top, bottom; + borders(left, right, top, bottom); + return TQSize(left + right + 2 * titleHeight, top + bottom); +} + + void +OpenLook::resize(const TQSize& s) +{ + widget()->resize(s); + widget()->tqrepaint(); //there is some strange wrong tqrepaint of the frame without +} + + void +OpenLook::paintEvent(TQPaintEvent * pe) +{ + TQRect tr(titleRect()); + + TQPainter p(widget()); + + TQRegion clipRegion(pe->region()); + + p.setClipRegion(clipRegion); + + paintBorder(p); + + paintTopLeftRect(p); + paintTopRightRect(p); + paintBottomLeftRect(p); + paintBottomRightRect(p); + + p.setClipRegion(clipRegion + buttonRect()); + + TQBrush titleBackground(options()->color(KDecoration::ColorTitleBar, true)); + + if (isActive()) + qDrawShadePanel(&p, tr, widget()->tqcolorGroup(), true, 1, &titleBackground); + else + p.fillRect(tr, widget()->tqcolorGroup().brush(TQColorGroup::Background)); + + p.setClipRegion(clipRegion); + + paintButton(p); + + p.setFont(options()->font(isActive(), tool_)); + + p.setPen(options()->color(KDecoration::ColorFont, isActive())); + + tr.setLeft(openLookCornerSize + 3 + buttonRect().width() + 2); + + p.drawText(tr, AlignCenter, caption()); +} + + void +OpenLook::showEvent(TQShowEvent *) +{ + widget()->tqrepaint(); +} + + void +OpenLook::mouseDoubleClickEvent(TQMouseEvent * e) +{ + if (e->button() == Qt::LeftButton && titleRect().contains(e->pos())) + { + titlebarDblClickOperation(); + } +} + + void +OpenLook::wheelEvent(TQWheelEvent *e) +{ + if (isSetShade() || titleRect().contains(e->pos())) + { + titlebarMouseWheelOperation( e->delta()); + } +} + + void +OpenLook::resizeEvent(TQResizeEvent* e) +{ + widget()->update(); +} + + void +OpenLook::activeChange() +{ + widget()->tqrepaint(); +} + + KDecoration::Position +OpenLook::mousePosition(const TQPoint & p) const +{ + if (topLeftRect().contains(p)) + return PositionTopLeft; + else if (topRightRect().contains(p)) + return PositionTopRight; + else if (bottomLeftRect().contains(p)) + return PositionBottomLeft; + else if (bottomRightRect().contains(p)) + return PositionBottomRight; + else + return PositionCenter; +} + + void +OpenLook::iconChange() +{ +} + + void +OpenLook::desktopChange() +{ +} + + void +OpenLook::maximizeChange() +{ + widget()->tqrepaint(false); +} + + void +OpenLook::doLayout() +{ + TQVBoxLayout * tqlayout = new TQVBoxLayout(widget(), openLookMargin); + + titleSpacer_ = + new TQSpacerItem + ( + 0, + titleHeight, + TQSizePolicy::Expanding, + TQSizePolicy::Fixed + ); + + tqlayout->addItem(titleSpacer_); + + tqlayout->addSpacing(2); + + TQBoxLayout * midLayout = + new TQBoxLayout(tqlayout, TQBoxLayout::LeftToRight, 0, 0); + + if (isPreview()) { + midLayout->addWidget(new TQLabel( + i18n("
OpenLook preview
"), + widget()), + 1); + } else { + midLayout->addItem( new TQSpacerItem( 0, 0 )); + } + +} + + bool +OpenLook::animateMinimize(bool /*iconify*/) +{ +#if 0 + TQRect icongeom(iconGeometry()); + + if (!icongeom.isValid()) + return false; + + TQRect wingeom(tqgeometry()); + + TQPainter p(workspaceWidget()); + + p.setRasterOp(TQt::NotROP); + +#if 0 + if (iconify) + p.setClipRegion( + TQRegion(workspace()->desktopWidget()->rect()) - wingeom + ); +#endif + + for (uint count = 0; count < 4; count++) + { + grabXServer(); + + p.drawLine(wingeom.bottomRight(), icongeom.bottomRight()); + p.drawLine(wingeom.bottomLeft(), icongeom.bottomLeft()); + p.drawLine(wingeom.topLeft(), icongeom.topLeft()); + p.drawLine(wingeom.topRight(), icongeom.topRight()); + + p.flush(); + + kapp->syncX(); + + usleep(10000); + + p.drawLine(wingeom.bottomRight(), icongeom.bottomRight()); + p.drawLine(wingeom.bottomLeft(), icongeom.bottomLeft()); + p.drawLine(wingeom.topLeft(), icongeom.topLeft()); + p.drawLine(wingeom.topRight(), icongeom.topRight()); + + p.flush(); + + kapp->syncX(); + + usleep(10000); + + ungrabXServer(); + } +#endif + return true; +} + + TQRect +OpenLook::topLeftRect() const +{ + return TQRect + ( + 0, + 0, + openLookCornerSize, + openLookCornerSize + ); +} + + TQRect +OpenLook::topRightRect() const +{ + return TQRect + ( + width() - openLookCornerSize, + 0, + openLookCornerSize, + openLookCornerSize + ); +} + + TQRect +OpenLook::bottomLeftRect() const +{ + return TQRect + ( + 0, + height() - openLookCornerSize, + openLookCornerSize, + openLookCornerSize + ); +} + + TQRect +OpenLook::bottomRightRect() const +{ + return TQRect + ( + width() - openLookCornerSize, + height() - openLookCornerSize, + openLookCornerSize, + openLookCornerSize + ); +} + + void +OpenLook::paintTopLeftRect(TQPainter & p) const +{ + TQColor handleColour(options()->color(KDecoration::ColorHandle, isActive())); + + TQRect r(topLeftRect()); + + int x1(r.left()); + int y1(r.top()); + int x2(r.right()); + int y2(r.bottom()); + + p.setPen(widget()->tqcolorGroup().light()); + + p.drawLine(x1, y1, x2, y1); + p.drawLine(x1, y1 + 1, x1, y2); + + p.fillRect(x1 + 1, y1 + 1, r.width()-2, openLookMargin-2, handleColour); + p.fillRect(x1 + 1, y1 + 1, openLookMargin-2, r.height()-2, handleColour); + + p.setPen(widget()->tqcolorGroup().dark()); + + p.drawLine(x2, y1 + 1, x2, y1 + openLookMargin-1); + + p.drawLine(x1 + openLookMargin-1, y1 + openLookMargin-1, x2 - 1, y1 + openLookMargin-1); + + p.drawLine(x1 + openLookMargin-1, y1 + openLookMargin, x1 + openLookMargin-1, y2 - 1); + + p.drawLine(x1 + 1, y2, x1 + openLookMargin-1, y2); +} + + void +OpenLook::paintTopRightRect(TQPainter & p) const +{ + TQColor handleColour(options()->color(KDecoration::ColorHandle, isActive())); + + TQRect r(topRightRect()); + + int x1(r.left()); + int y1(r.top()); + int x2(r.right()); + int y2(r.bottom()); + + p.setPen(widget()->tqcolorGroup().light()); + + p.drawLine(x1, y1, x2, y1); + p.drawLine(x1, y1 + 1, x1, y1 + openLookMargin-1); + p.drawLine(x2 - openLookMargin+1, y1 + openLookMargin, x2 - openLookMargin+1, y2); + + p.fillRect(x1 + 1, y1 + 1, r.width()-2, openLookMargin-2, handleColour); + p.fillRect(x2 - openLookMargin + 2, y1 + 1, openLookMargin-2, r.height()-2, handleColour); + + p.setPen(widget()->tqcolorGroup().dark()); + + p.drawLine(x1 + 1, y1 + openLookMargin-1, x2 - openLookMargin+1, y1 + openLookMargin-1); + p.drawLine(x2, y1 + 1, x2, y2); + p.drawLine(x2 - openLookMargin+1, y2, x2 - 1, y2); +} + + void +OpenLook::paintBottomLeftRect(TQPainter & p) const +{ + TQColor handleColour(options()->color(KDecoration::ColorHandle, isActive())); + + TQRect r(bottomLeftRect()); + + int x1(r.left()); + int y1(r.top()); + int x2(r.right()); + int y2(r.bottom()); + + p.setPen(widget()->tqcolorGroup().light()); + + p.drawLine(x1, y1, x1 + openLookMargin-1, y1); + p.drawLine(x1, y1 + 1, x1, y2); + p.drawLine(x1 + openLookMargin, y2 - openLookMargin+1, x2, y2 - openLookMargin+1); + + p.fillRect(x1 + 1, y2 - openLookMargin + 2, r.width()-2, openLookMargin-2, handleColour); + p.fillRect(x1 + 1, y1 + 1, openLookMargin-2, r.height()-2, handleColour); + + p.setPen(widget()->tqcolorGroup().dark()); + + p.drawLine(x1 + openLookMargin-1, y1 + 1, x1 + openLookMargin-1, y2 - openLookMargin); + p.drawLine(x1 + 1, y2, x2, y2); + p.drawLine(x2, y2 - openLookMargin+2, x2, y2 - 1); +} + + void +OpenLook::paintBottomRightRect(TQPainter & p) const +{ + TQColor handleColour(options()->color(KDecoration::ColorHandle, isActive())); + + TQRect r(bottomRightRect()); + + int x1(r.left()); + int y1(r.top()); + int x2(r.right()); + int y2(r.bottom()); + + p.setPen(widget()->tqcolorGroup().light()); + + p.drawLine(x1, y2 - openLookMargin+1, x1, y2); + p.drawLine(x1 + 1, y2 - openLookMargin+1, x2 - openLookMargin+1, y2 - openLookMargin+1); + p.drawLine(x2 - openLookMargin+1, y1 + 1, x2 - openLookMargin+1, y2 - openLookMargin); + p.drawLine(x2 - openLookMargin+1, y1, x2, y1); + + p.fillRect(x1 + 1, y2 - openLookMargin + 2, r.width()-2, openLookMargin-2, handleColour); + p.fillRect(x2 - openLookMargin + 2, y1 + 1, openLookMargin-2, r.height()-2, handleColour); + + p.setPen(widget()->tqcolorGroup().dark()); + + p.drawLine(x1 + 1, y2, x2, y2); + p.drawLine(x2, y1 + 1, x2, y2 - 1); +} + + TQRect +OpenLook::buttonRect() const +{ + return TQRect + ( + openLookCornerSize + 3, + titleRect().top(), + titleRect().height(), + titleRect().height() + ); +} + + void +OpenLook::paintButton(TQPainter & p) const +{ + TQRect r(buttonRect()); + + p.fillRect + ( + r.left() + 1, + r.top() + 1, + r.width() - 2, + r.height() - 2, + buttonDown_ + ? widget()->tqcolorGroup().dark() + : options()->color(KDecoration::ColorButtonBg, isActive()) + ); + + p.setPen(buttonDown_ ? widget()->tqcolorGroup().dark() : widget()->tqcolorGroup().light()); + + p.drawLine(r.left() + 1, r.top(), r.right() - 1, r.top()); + p.drawLine(r.left(), r.top() + 1, r.left(), r.bottom() - 1); + + p.setPen(buttonDown_ ? widget()->tqcolorGroup().light() : widget()->tqcolorGroup().dark()); + + p.drawLine(r.right(), r.top() + 1, r.right(), r.bottom() - 1); + p.drawLine(r.left() + 1, r.bottom(), r.right() - 1, r.bottom()); + + paintArrow(p); +} + + void +OpenLook::paintArrow(TQPainter & p) const +{ + TQRect br(buttonRect()); + + int x = br.left() + 5; + int y = br.top() + 5; + int w = br.width() - 10; + int h = br.height() - 10; + + TQPointArray poly(3); + + p.setBrush(widget()->tqcolorGroup().mid()); + + poly.setPoint(0, x, y); + poly.setPoint(1, x + w - 1, y); + poly.setPoint(2, x + (w / 2), y + h - 1); + + p.drawPolygon(poly); + + p.setPen(widget()->tqcolorGroup().dark()); + + p.drawLine(x, y, x + w - 1, y); + + p.drawLine(x, y, x + (w / 2), y + h - 1); + + p.setPen(widget()->tqcolorGroup().light()); + + p.drawLine(x + (w / 2), y + h - 1, x + w - 1, y); +} + + void +OpenLook::paintBorder(TQPainter & p) const +{ + const uint cs(openLookCornerSize); + + uint x = widget()->rect().left(); + uint y = widget()->rect().top(); + uint w = widget()->rect().width(); + uint h = widget()->rect().height(); + uint r = widget()->rect().right(); + uint b = widget()->rect().bottom(); + + p.fillRect(x + cs, y, w - cs - cs, 2, widget()->tqcolorGroup().shadow()); + p.fillRect(x + cs, b - 1, w - cs - cs, 2, widget()->tqcolorGroup().shadow()); + p.fillRect(x, y + cs, 2, h - cs - cs, widget()->tqcolorGroup().shadow()); + p.fillRect(r - 1, y + cs, 2, h - cs - cs, widget()->tqcolorGroup().shadow()); + + TQColor frameColour(options()->color(KDecoration::ColorFrame, isActive())); + + p.fillRect(x + cs, y + 2, w - cs - cs, openLookMargin-2, frameColour); + p.fillRect(x + cs, b - openLookMargin + 1, w - cs - cs, openLookMargin-2, frameColour); + p.fillRect(x + 2, y + cs, openLookMargin-2, h - cs - cs, frameColour); + p.fillRect(r - openLookMargin + 1, y + cs, openLookMargin-2, h - cs - cs, frameColour); + + p.fillRect + ( + openLookMargin, + titleRect().bottom() + 1, + width() - 2 * openLookMargin, + 2, + widget()->tqcolorGroup().background() + ); +} + + TQRect +OpenLook::titleRect() const +{ + return titleSpacer_->tqgeometry(); +} + + bool +OpenLook::isButtonPress(TQMouseEvent * e) +{ + mousePressPoint_ = e->pos(); + + buttonDown_ = buttonRect().contains(mousePressPoint_); + + widget()->tqrepaint(buttonRect()); + return buttonDown_; +} + + bool +OpenLook::isButtonRelease(TQMouseEvent * e) +{ + if (buttonDown_ && buttonRect().contains(e->pos())) + { + minimize(); + return true; + } + buttonDown_ = false; + widget()->tqrepaint(buttonRect()); + + return false; +} + +} + +#include "OpenLook.moc" +// vim:ts=2:sw=2:tw=78:set et: diff --git a/twin-styles/openlook/OpenLook.h b/twin-styles/openlook/OpenLook.h new file mode 100644 index 00000000..98db37af --- /dev/null +++ b/twin-styles/openlook/OpenLook.h @@ -0,0 +1,116 @@ +/* + 'OpenLook' twin client + + Porting to trinity.2 API + Copyright 2003 Luciano Montanaro + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef KWIN_WEB_H +#define KWIN_WEB_H + +#include +#include + +#include +#include + +class TQSpacerItem; + +namespace OpenLook +{ + class OpenLookButton; + + class OpenLook : public KDecoration + { + Q_OBJECT + TQ_OBJECT + public: + + OpenLook(KDecorationBridge *b, KDecorationFactory *f); + ~OpenLook(); + void init(); + + protected: + bool eventFilter(TQObject *o, TQEvent *e); + void resizeEvent(TQResizeEvent *e); + void paintEvent(TQPaintEvent *e); + void showEvent(TQShowEvent *e); + + virtual void captionChange(); + void desktopChange(); + void activeChange(); + void shadeChange(); + void iconChange(); + void maximizeChange(); + void borders(int &left, int &right, int &top, int &bottom) const; + TQSize tqminimumSize() const; + void resize( const TQSize& ); + virtual void mouseDoubleClickEvent(TQMouseEvent *); + virtual void wheelEvent(TQWheelEvent *e); + + virtual Position mousePosition(const TQPoint &) const; + virtual bool animateMinimize(bool); + + private: + + void doLayout(); + + TQRect titleRect() const; + + TQRect topLeftRect() const; + TQRect topRightRect() const; + TQRect bottomLeftRect() const; + TQRect bottomRightRect() const; + + TQRect buttonRect() const; + + void paintBorder(TQPainter &) const; + + void paintTopLeftRect(TQPainter &) const; + void paintTopRightRect(TQPainter &) const; + void paintBottomLeftRect(TQPainter &) const; + void paintBottomRightRect(TQPainter &) const; + + void paintButton(TQPainter &) const; + void paintArrow(TQPainter &) const; + + bool isButtonPress(TQMouseEvent *); + bool isButtonRelease(TQMouseEvent *); + + TQSpacerItem * titleSpacer_; + TQPoint mousePressPoint_; + bool tool_; + bool buttonDown_; + }; + + class DecorationFactory: public TQObject, public KDecorationFactory + { + public: + DecorationFactory(); + virtual ~DecorationFactory(); + virtual KDecoration *createDecoration(KDecorationBridge *); + virtual bool reset(unsigned long changed); + virtual bool supports( Ability ability ); + TQValueList< DecorationFactory::BorderSize > borderSizes() const; + }; +} + +#endif +// vim:ts=2:sw=2:tw=78:set et: diff --git a/twin-styles/openlook/openlook.desktop b/twin-styles/openlook/openlook.desktop new file mode 100644 index 00000000..0ed25dcb --- /dev/null +++ b/twin-styles/openlook/openlook.desktop @@ -0,0 +1,14 @@ +[Desktop Entry] +Name=OpenLook +Name[af]=Openlook +Name[cy]=GolwgAgored +Name[fa]=نگاه‌باز +Name[hi]=ओपन-लुक +Name[lt]=Open išvaizda +Name[lv]=AtvērtsSkats +Name[ne]=ओपन लूक +Name[ta]=திறந்தபார்வை +Name[ven]=Vula wo sedza +Name[vi]=Hình thức mở +Name[zu]=Vula Ubone +X-KDE-Library=twin3_openlook diff --git a/twin-styles/riscos/AboveButton.cpp b/twin-styles/riscos/AboveButton.cpp new file mode 100644 index 00000000..7b66e3ba --- /dev/null +++ b/twin-styles/riscos/AboveButton.cpp @@ -0,0 +1,65 @@ +/* + RISC OS KWin client + + Copyright 2004 + Carsten Clever + + 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 "AboveButton.h" + +namespace RiscOS +{ + +/* XPM */ +static const char * const above_xpm[] = { +"12 12 3 1", +" c None", +". c #000000", +"+ c #FFFFFF", +" ", +" ..... ", +".+++++. ", +".+++++. ", +".+++++..... ", +".+++++.++++.", +".+++++.++++.", +" .....+++++.", +" .+++++.", +" .+++++.", +" ..... ", +" "}; + +AboveButton::AboveButton(TQWidget *parent) + : Button(parent, i18n("Keep above others")) +{ + setPixmap(TQPixmap((const char **)above_xpm)); +} + +void AboveButton::mouseReleaseEvent(TQMouseEvent *e) +{ + Button::mouseReleaseEvent(e); + + if (!rect().contains(e->pos())) + return; + + emit(above()); +} + +} // End namespace + +#include "AboveButton.moc" diff --git a/twin-styles/riscos/AboveButton.h b/twin-styles/riscos/AboveButton.h new file mode 100644 index 00000000..86fbb0a7 --- /dev/null +++ b/twin-styles/riscos/AboveButton.h @@ -0,0 +1,51 @@ +/* + RISC OS KWin client + + Copyright 2004 + Carsten Clever + + 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 RISC_OS_ABOVE_BUTTON_H +#define RISC_OS_ABOVE_BUTTON_H + +#include "Button.h" + +namespace RiscOS +{ + +class AboveButton : public Button +{ + Q_OBJECT + TQ_OBJECT + + public: + + AboveButton(TQWidget *parent); + + signals: + + void above(); + + protected: + + void mouseReleaseEvent(TQMouseEvent*); +}; + +} // End namespace + +#endif diff --git a/twin-styles/riscos/Button.cpp b/twin-styles/riscos/Button.cpp new file mode 100644 index 00000000..7bf4f477 --- /dev/null +++ b/twin-styles/riscos/Button.cpp @@ -0,0 +1,153 @@ +/* + RISC OS KWin client + + Copyright 2000 + Rik Hemsley + + 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 +#include "Button.h" +#include "Static.h" + +namespace RiscOS +{ + +Button::Button(TQWidget *parent, const TQString& tip, + const ButtonState realizeButtons) + : TQWidget(parent, "Button", 0), + realizeButtons_(realizeButtons), + lastButton_(Qt::NoButton), + alignment_(Left), + down_ (false), + active_ (false) +{ + TQToolTip::add(this, tip); + setBackgroundColor(TQt::black); + + setFixedSize(Static::instance()->titleHeight() - 1, + Static::instance()->titleHeight()); +} + +Button::~Button() +{ + // Empty. +} + +void Button::tqsetAlignment(Alignment a) +{ + alignment_ = a; + tqrepaint(); +} + +void Button::setActive(bool b) +{ + active_ = b; + tqrepaint(); +} + +Button::Alignment Button::tqalignment() const +{ + return alignment_; +} + +void Button::mousePressEvent(TQMouseEvent *e) +{ + down_ = true; + lastButton_ = e->button(); + tqrepaint(); + + TQMouseEvent me(e->type(), e->pos(), e->globalPos(), + (e->button()&realizeButtons_) ? Qt::LeftButton : Qt::NoButton, + e->state()); + TQWidget::mousePressEvent(&me); +} + +void Button::mouseReleaseEvent(TQMouseEvent *e) +{ + down_ = false; + lastButton_ = e->button(); + tqrepaint(); + TQMouseEvent me(e->type(), e->pos(), e->globalPos(), + (e->button()&realizeButtons_) ? Qt::LeftButton : Qt::NoButton, + e->state()); + TQWidget::mouseReleaseEvent(&me); +} + +void Button::setPixmap(const TQPixmap &p) +{ + if (TQPixmap::defaultDepth() <= 8) + aPixmap_ = iPixmap_ = p; + else + { + TQRgb light; + TQRgb* data = NULL; + TQRgb w = tqRgb(255, 255, 255); + + TQImage aTx(p.convertToImage()); + TQImage iTx(aTx.copy()); + + const KDecorationOptions* options = KDecoration::options(); + light = options->color(KDecoration::ColorButtonBg, true).light(150).rgb(); + + if (light == tqRgb(0, 0, 0)) + light = tqRgb(228, 228, 228); + + data = (TQRgb *)aTx.bits(); + + for (int x = 0; x < 144; x++) + if (data[x] == w) + data[x] = light; + + light = options->color(KDecoration::ColorButtonBg, false).light(150).rgb(); + + if (light == tqRgb(0, 0, 0)) + light = tqRgb(228, 228, 228); + + data = (TQRgb *)iTx.bits(); + + for (int x = 0; x < 144; x++) + if (data[x] == w) + data[x] = light; + + aPixmap_.convertFromImage(aTx); + iPixmap_.convertFromImage(iTx); + + if (0 != p.mask()) + { + aPixmap_.setMask(*p.mask()); + iPixmap_.setMask(*p.mask()); + } + } + tqrepaint(); +} + +void Button::paintEvent(TQPaintEvent *) +{ + bitBlt(this, alignment_ == Left ? 1 : 0, 0, + &Static::instance()->buttonBase(active_, down_)); + + int i = width() / 2 - 6; + + bitBlt(this, alignment_ == Left ? i + 1 : i, + i + 1, active_ ? &aPixmap_ : &iPixmap_); +} + +} // End namespace + +// vim:ts=2:sw=2:tw=78 +#include "Button.moc" diff --git a/twin-styles/riscos/Button.h b/twin-styles/riscos/Button.h new file mode 100644 index 00000000..0c7c66c5 --- /dev/null +++ b/twin-styles/riscos/Button.h @@ -0,0 +1,82 @@ +/* + RISC OS KWin client + + Copyright 2000 + Rik Hemsley + + 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 RISC_OS_BUTTON_H +#define RISC_OS_BUTTON_H + +#include +#include +#include +#include + +namespace RiscOS +{ + +class Button : public TQWidget +{ + Q_OBJECT + TQ_OBJECT + + public: + + enum Type { Lower, Close, Iconify, Maximise, Sticky, Help }; + + enum Alignment { Left, Right }; + + Button(TQWidget *parent, const TQString &tip, + const ButtonState realizeButton = Qt::LeftButton); + virtual ~Button(); + + void tqsetAlignment(Alignment); + + Alignment tqalignment() const; + + protected slots: + + void setActive(bool); + + protected: + + void paintEvent(TQPaintEvent *); + + void mousePressEvent(TQMouseEvent *); + void mouseReleaseEvent(TQMouseEvent *); + void mouseMoveEvent(TQMouseEvent *) { /* Empty. */ } + + void setPixmap(const TQPixmap &); + + ButtonState realizeButtons_; + ButtonState lastButton_; + + private: + + Alignment alignment_; + bool down_; + bool active_; + TQPixmap aPixmap_, iPixmap_; +}; + +} // End namespace + +#endif + +// vim:ts=2:sw=2:tw=78 diff --git a/twin-styles/riscos/CMakeLists.txt b/twin-styles/riscos/CMakeLists.txt new file mode 100644 index 00000000..5b0e6d54 --- /dev/null +++ b/twin-styles/riscos/CMakeLists.txt @@ -0,0 +1,52 @@ +################################################# +# +# (C) 2011 Golubev Alexander +# fatzer2 (AT) gmail.com +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +add_definitions( + -DQT_PLUGIN +) + +include_directories( + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_BINARY_DIR} + ${TDE_INCLUDE_DIR} + ${TQT_INCLUDE_DIRS} +) + +link_directories( + ${TQT_LIBRARY_DIRS} +) + +##### other data ################################ + +install( FILES riscos.desktop DESTINATION ${DATA_INSTALL_DIR}/twin ) + +##### twin3_riscos ############################### + + +set( target twin3_riscos ) + +set( ${target}_SRCS + AboveButton.cpp Button.cpp + CloseButton.cpp + HelpButton.cpp + IconifyButton.cpp + LowerButton.cpp + Manager.cpp + MaximiseButton.cpp + Static.cpp + StickyButton.cpp +) + +tde_add_kpart( ${target} AUTOMOC + SOURCES ${${target}_SRCS} + LINK tdecorations-shared + DESTINATION ${PLUGIN_INSTALL_DIR} +) diff --git a/twin-styles/riscos/CloseButton.cpp b/twin-styles/riscos/CloseButton.cpp new file mode 100644 index 00000000..1a4c06b5 --- /dev/null +++ b/twin-styles/riscos/CloseButton.cpp @@ -0,0 +1,66 @@ +/* + RISC OS KWin client + + Copyright 2000 + Rik Hemsley + + 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 "CloseButton.h" + +namespace RiscOS +{ + +/* XPM */ +static const char * const close_xpm[] = { +"12 12 3 1", +" c None", +". c #000000", +"+ c #FFFFFF", +" . . ", +" .+. .+. ", +".+++. .+++.", +" .+++..+++. ", +" .++++++. ", +" .++++. ", +" .++++. ", +" .++++++. ", +" .+++..+++. ", +".+++. .+++.", +" .+. .+. ", +" . . "}; + +CloseButton::CloseButton(TQWidget *parent) + : Button(parent, i18n("Close")) +{ + setPixmap(TQPixmap((const char **)close_xpm)); +} + +void CloseButton::mouseReleaseEvent(TQMouseEvent *e) +{ + Button::mouseReleaseEvent(e); + + if (!rect().contains(e->pos())) + return; + + emit(closeWindow()); +} + +} // End namespace; + +// vim:ts=2:sw=2:tw=78 +#include "CloseButton.moc" diff --git a/twin-styles/riscos/CloseButton.h b/twin-styles/riscos/CloseButton.h new file mode 100644 index 00000000..615ea2ed --- /dev/null +++ b/twin-styles/riscos/CloseButton.h @@ -0,0 +1,53 @@ +/* + RISC OS KWin client + + Copyright 2000 + Rik Hemsley + + 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 RISC_OS_CLOSE_BUTTON_H +#define RISC_OS_CLOSE_BUTTON_H + +#include "Button.h" + +namespace RiscOS +{ + +class CloseButton : public Button +{ + Q_OBJECT + TQ_OBJECT + + public: + + CloseButton(TQWidget *parent); + + signals: + + void closeWindow(); + + protected: + + void mouseReleaseEvent(TQMouseEvent *); +}; + +} // End namespace; + +#endif + +// vim:ts=2:sw=2:tw=78 diff --git a/twin-styles/riscos/HelpButton.cpp b/twin-styles/riscos/HelpButton.cpp new file mode 100644 index 00000000..936738eb --- /dev/null +++ b/twin-styles/riscos/HelpButton.cpp @@ -0,0 +1,66 @@ +/* + RISC OS KWin client + + Copyright 2000 + Rik Hemsley + + 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 "HelpButton.h" + +namespace RiscOS +{ + +/* XPM */ +static const char * const help_xpm[] = { +"12 12 3 1", +" c None", +". c #FFFFFF", +"+ c #000000", +" . ++++ . ", +" .+....+. ", +" +......+ ", +"..+......+..", +" +......+ ", +" +......+ ", +" .+....+. ", +" . ++ + . ", +" + ++ ", +" ++ + ", +" + ++ ", +" ++ "}; + +HelpButton::HelpButton(TQWidget *parent) + : Button(parent, i18n("Help")) +{ + setPixmap(TQPixmap((const char **)help_xpm)); +} + +void HelpButton::mouseReleaseEvent(TQMouseEvent *e) +{ + Button::mouseReleaseEvent(e); + + if (!rect().contains(e->pos())) + return; + + emit(help()); +} + +} // End namespace; + +// vim:ts=2:sw=2:tw=78 +#include "HelpButton.moc" diff --git a/twin-styles/riscos/HelpButton.h b/twin-styles/riscos/HelpButton.h new file mode 100644 index 00000000..d57b91ce --- /dev/null +++ b/twin-styles/riscos/HelpButton.h @@ -0,0 +1,53 @@ +/* + RISC OS KWin client + + Copyright 2000 + Rik Hemsley + + 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 RISC_OS_HELP_BUTTON_H +#define RISC_OS_HELP_BUTTON_H + +#include "Button.h" + +namespace RiscOS +{ + +class HelpButton : public Button +{ + Q_OBJECT + TQ_OBJECT + + public: + + HelpButton(TQWidget *parent); + + signals: + + void help(); + + protected: + + void mouseReleaseEvent(TQMouseEvent *); +}; + +} // End namespace; + +#endif + +// vim:ts=2:sw=2:tw=78 diff --git a/twin-styles/riscos/IconifyButton.cpp b/twin-styles/riscos/IconifyButton.cpp new file mode 100644 index 00000000..b5eef9e5 --- /dev/null +++ b/twin-styles/riscos/IconifyButton.cpp @@ -0,0 +1,66 @@ +/* + RISC OS KWin client + + Copyright 2000 + Rik Hemsley + + 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 "IconifyButton.h" + +namespace RiscOS +{ + +/* XPM */ +static const char * const iconify_xpm[] = { +"12 12 3 1", +" c None", +". c #000000", +"+ c #FFFFFF", +" ", +" ", +" ", +" ", +" .......... ", +".++++++++++.", +".++++++++++.", +" .......... ", +" ", +" ", +" ", +" "}; + +IconifyButton::IconifyButton(TQWidget *parent) + : Button(parent, i18n("Minimize")) +{ + setPixmap(TQPixmap((const char **)iconify_xpm)); +} + +void IconifyButton::mouseReleaseEvent(TQMouseEvent *e) +{ + Button::mouseReleaseEvent(e); + + if (!rect().contains(e->pos())) + return; + + emit(iconify()); +} + +} // End namespace; + +// vim:ts=2:sw=2:tw=78 +#include "IconifyButton.moc" diff --git a/twin-styles/riscos/IconifyButton.h b/twin-styles/riscos/IconifyButton.h new file mode 100644 index 00000000..54e44aba --- /dev/null +++ b/twin-styles/riscos/IconifyButton.h @@ -0,0 +1,53 @@ +/* + RISC OS KWin client + + Copyright 2000 + Rik Hemsley + + 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 RISC_OS_ICONIFY_BUTTON_H +#define RISC_OS_ICONIFY_BUTTON_H + +#include "Button.h" + +namespace RiscOS +{ + +class IconifyButton : public Button +{ + Q_OBJECT + TQ_OBJECT + + public: + + IconifyButton(TQWidget *parent); + + signals: + + void iconify(); + + protected: + + void mouseReleaseEvent(TQMouseEvent *); +}; + +} // End namespace; + +#endif + +// vim:ts=2:sw=2:tw=78 diff --git a/twin-styles/riscos/LowerButton.cpp b/twin-styles/riscos/LowerButton.cpp new file mode 100644 index 00000000..7f03e41f --- /dev/null +++ b/twin-styles/riscos/LowerButton.cpp @@ -0,0 +1,66 @@ +/* + RISC OS KWin client + + Copyright 2000 + Rik Hemsley + + 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 "LowerButton.h" + +namespace RiscOS +{ + +/* XPM */ +static const char * const lower_xpm[] = { +"12 12 3 1", +" c None", +". c #000000", +"+ c #FFFFFF", +" ", +" ..... ", +".+++++. ", +".+++++. ", +".+++++..... ", +".++++.+++++.", +".++++.+++++.", +" .....+++++.", +" .+++++.", +" .+++++.", +" ..... ", +" "}; + +LowerButton::LowerButton(TQWidget *parent) + : Button(parent, i18n("Keep below others")) +{ + setPixmap(TQPixmap((const char **)lower_xpm)); +} + +void LowerButton::mouseReleaseEvent(TQMouseEvent *e) +{ + Button::mouseReleaseEvent(e); + + if (!rect().contains(e->pos())) + return; + + emit(lower()); +} + +} // End namespace; + +// vim:ts=2:sw=2:tw=78 +#include "LowerButton.moc" diff --git a/twin-styles/riscos/LowerButton.h b/twin-styles/riscos/LowerButton.h new file mode 100644 index 00000000..8616d688 --- /dev/null +++ b/twin-styles/riscos/LowerButton.h @@ -0,0 +1,53 @@ +/* + RISC OS KWin client + + Copyright 2000 + Rik Hemsley + + 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 RISC_OS_LOWER_BUTTON_H +#define RISC_OS_LOWER_BUTTON_H + +#include "Button.h" + +namespace RiscOS +{ + +class LowerButton : public Button +{ + Q_OBJECT + TQ_OBJECT + + public: + + LowerButton(TQWidget *parent); + + signals: + + void lower(); + + protected: + + void mouseReleaseEvent(TQMouseEvent *); +}; + +} // End namespace; + +#endif + +// vim:ts=2:sw=2:tw=78 diff --git a/twin-styles/riscos/Makefile.am b/twin-styles/riscos/Makefile.am new file mode 100644 index 00000000..773c341b --- /dev/null +++ b/twin-styles/riscos/Makefile.am @@ -0,0 +1,39 @@ +AUTOMAKE_OPTIONS = foreign + +KDE_CXXFLAGS = -DQT_PLUGIN + +INCLUDES = $(all_includes) + +twindir = $(kde_datadir)/twin/ +twin_DATA = riscos.desktop + +noinst_HEADERS = AboveButton.h \ + Button.h \ + CloseButton.h \ + HelpButton.h \ + IconifyButton.h \ + LowerButton.h \ + Manager.h \ + MaximiseButton.h \ + Palette.h \ + Static.h \ + StickyButton.h + +kde_module_LTLIBRARIES = twin3_riscos.la +twin3_riscos_la_SOURCES = AboveButton.cpp \ + Button.cpp \ + CloseButton.cpp \ + HelpButton.cpp \ + IconifyButton.cpp \ + LowerButton.cpp \ + Manager.cpp \ + MaximiseButton.cpp \ + Static.cpp \ + StickyButton.cpp + +twin3_riscos_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module $(LIB_QT) $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx +twin3_riscos_la_LIBADD = $(LIB_TDEUI) -ltdecorations +twin3_riscos_la_METASOURCES = AUTO + +EXTRA_DIST = $(twin_DATA) + diff --git a/twin-styles/riscos/Manager.cpp b/twin-styles/riscos/Manager.cpp new file mode 100644 index 00000000..837bec9c --- /dev/null +++ b/twin-styles/riscos/Manager.cpp @@ -0,0 +1,767 @@ +/* + RISC OS KWin client + + Copyright 2000 + Rik Hemsley + + 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 // for usleep +#include // for usleep on non-linux platforms +#include // for sin and cos + +#include +#include +#include +#include +#include + +#include + +#include "Manager.h" +#include "Static.h" +#include "AboveButton.h" +#include "CloseButton.h" +#include "HelpButton.h" +#include "IconifyButton.h" +#include "LowerButton.h" +#include "MaximiseButton.h" +#include "StickyButton.h" + +extern "C" +{ + KDE_EXPORT KDecorationFactory* create_factory() + { + return new RiscOS::Factory(); + } +} + + +namespace RiscOS +{ + +Manager::Manager(KDecorationBridge *bridge, + KDecorationFactory *factory) + : KDecoration(bridge, factory), + topLayout_ (NULL), + titleLayout_ (NULL), + titleSpacer_ (NULL) +{ +} + +Manager::~Manager() +{ +} + +void Manager::init() +{ + createMainWidget(WNoAutoErase); + + widget()->installEventFilter(this); + widget()->setBackgroundMode(NoBackground); + + leftButtonList_.setAutoDelete(true); + rightButtonList_.setAutoDelete(true); + + resetLayout(); +} + +bool Manager::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; + case TQEvent::MouseButtonRelease: + return false; + case TQEvent::Show: + return false; + case TQEvent::MouseMove: + return false; + case TQEvent::Enter: + return false; + case TQEvent::Leave: + return false; + case TQEvent::Move: + return false; + default: + return false; + } +} + +void Manager::reset(unsigned long /*changed*/) +{ + resetLayout(); +} + +void Manager::borders(int &left, int &right, int &top, int &bottom) const +{ + left = right = 1; + top = Static::instance()->titleHeight(); + bottom = isResizable() ? Static::instance()->resizeHeight() : 1; +} + +void Manager::resize(const TQSize &s) +{ + widget()->resize(s); +} + +TQSize Manager::tqminimumSize() const +{ + return widget()->tqminimumSize(); +} + +void Manager::activeChange() +{ + updateTitleBuffer(); + widget()->tqrepaint(); + emit(activeChanged(isActive())); +} + +void Manager::captionChange() +{ + updateTitleBuffer(); + widget()->tqrepaint(); +} + +void Manager::iconChange() +{ +} + +void Manager::maximizeChange() +{ + emit(maximizeChanged(maximizeMode() == MaximizeFull)); +} + +void Manager::desktopChange() +{ +} + +void Manager::shadeChange() +{ +} + +void Manager::paintEvent(TQPaintEvent *e) +{ + TQPainter p(widget()); + + TQRect r(e->rect()); + + bool intersectsLeft = r.intersects(TQRect(0, 0, 1, height())); + + bool intersectsRight = + r.intersects(TQRect(width() - 1, 0, width(), height())); + + if (intersectsLeft || intersectsRight) + { + p.setPen(TQt::black); + + if (intersectsLeft) + p.drawLine(0, r.top(), 0, r.bottom()); + + if (intersectsRight) + p.drawLine(width() - 1, r.top(), width() - 1, r.bottom()); + } + + Static * s = Static::instance(); + + bool active = isActive(); + + // Title bar. + + TQRect tr = titleSpacer_->tqgeometry(); + bitBlt(widget(), tr.topLeft(), &titleBuf_); + + // Resize bar. + + if (isResizable()) + { + int rbt = height() - Static::instance()->resizeHeight(); // Resize bar top + + bitBlt(widget(), 0, rbt, &(s->resize(active))); + bitBlt(widget(), 30, rbt, &(s->resizeMidLeft(active))); + + p.drawTiledPixmap(32, rbt, width() - 34, + Static::instance()->resizeHeight(), + s->resizeMidMid(active)); + + bitBlt(widget(), width() - 32, rbt, &(s->resizeMidRight(active))); + bitBlt(widget(), width() - 30, rbt, &(s->resize(active))); + } + else + p.drawLine(1, height() - 1, width() - 2, height() - 1); +} + +void Manager::resizeEvent(TQResizeEvent*) +{ + updateButtonVisibility(); + updateTitleBuffer(); + widget()->tqrepaint(); +} + +void Manager::updateButtonVisibility() +{ +#if 0 + enum SizeProblem = { None, Small, Medium, Big }; + SizeProblem sizeProblem = None; + + if (width() < 80) sizeProblem = Big; + else if (width() < 100) sizeProblem = Medium; + else if (width() < 180) sizeProblem = Small; + + switch (sizeProblem) { + + case Small: + above_ ->hide(); + lower_ ->hide(); + sticky_ ->hide(); + help_ ->hide(); + iconify_ ->show(); + maximise_ ->hide(); + close_ ->show(); + break; + + case Medium: + above_ ->hide(); + lower_ ->hide(); + sticky_ ->hide(); + help_ ->hide(); + iconify_ ->hide(); + maximise_ ->hide(); + close_ ->show(); + break; + + case Big: + above_ ->hide(); + lower_ ->hide(); + sticky_ ->hide(); + help_ ->hide(); + iconify_ ->hide(); + maximise_ ->hide(); + close_ ->hide(); + break; + + case None: + default: + above_ ->show(); + lower_ ->show(); + sticky_ ->show(); + if (providesContextHelp()) + help_->show(); + iconify_ ->show(); + maximise_ ->show(); + close_ ->show(); + break; + } + + tqlayout()->activate(); +#endif +} + +void Manager::updateTitleBuffer() +{ + bool active = isActive(); + + Static * s = Static::instance(); + + TQRect tr = titleSpacer_->tqgeometry(); + + if (tr.width() == 0 || tr.height() == 0) + titleBuf_.resize(8, 8); + else + titleBuf_.resize(tr.size()); + + TQPainter p(&titleBuf_); + + p.drawPixmap(0, 0, s->titleTextLeft(active)); + + p.drawTiledPixmap(3, 0, tr.width() - 6, Static::instance()->titleHeight(), + s->titleTextMid(active)); + + p.setPen(options()->color(KDecorationOptions::ColorFont, active)); + + p.setFont(options()->font(active)); + + p.drawText(4, 2, tr.width() - 8, Static::instance()->titleHeight() - 4, + AlignCenter, caption()); + + p.drawPixmap(tr.width() - 3, 0, s->titleTextRight(active)); +} + +KDecoration::Position Manager::mousePosition(const TQPoint& p) const +{ + Position m = PositionCenter; + + // Look out for off-by-one errors here. + + if (isResizable()) + { + if (p.y() > (height() - (Static::instance()->resizeHeight() + 1))) + { + // Keep order ! + + if (p.x() >= (width() - 30)) + m = PositionBottomRight; + else if (p.x() <= 30) + m = PositionBottomLeft; + else + m = PositionBottom; + } + else + { + m = PositionCenter; + // Client::mousePosition(p); + } + } + else + { + m = PositionCenter; + // Client::mousePosition(p); + } + + return m; +} + +void Manager::mouseDoubleClickEvent(TQMouseEvent *e) +{ + if (e->button() == Qt::LeftButton && titleSpacer_->tqgeometry().contains(e->pos())) + titlebarDblClickOperation(); +} + +void Manager::wheelEvent(TQWheelEvent *e) +{ + if (isSetShade() || titleLayout_->tqgeometry().contains(e->pos()) ) + titlebarMouseWheelOperation( e->delta()); +} + +void Manager::paletteChange(const TQPalette &) +{ + resetLayout(); +} + +void Manager::stickyChange(bool b) +{ + emit(stickyChanged(b)); +} + +void Manager::slotToggleSticky() +{ + toggleOnAllDesktops(); + emit(stickyChanged(isOnAllDesktops())); +} + +void Manager::slotAbove() +{ + setKeepAbove(!keepAbove()); +} + +void Manager::slotLower() +{ + setKeepBelow(!keepBelow()); +} + +void Manager::slotMaximizeClicked(ButtonState state) +{ +#if KDE_IS_VERSION(3, 3, 0) + maximize(state); +#else + switch (state) + { + case RightButton: + maximize(maximizeMode() ^ MaximizeHorizontal); + break; + + case MidButton: + maximize(maximizeMode() ^ MaximizeVertical); + break; + + case LeftButton: + default: + maximize(maximizeMode() == MaximizeFull ? MaximizeRestore + : MaximizeFull); + break; + } +#endif + emit(maximizeChanged(maximizeMode() == MaximizeFull)); +} + +bool Manager::animateMinimize(bool iconify) +{ + int style = Static::instance()->animationStyle(); + + switch (style) + { + case 1: + { + // Double twisting double back, with pike ;) + + if (!iconify) // No animation for restore. + return true; + + // Go away quick. + helperShowHide(false); + tqApp->syncX(); + + TQRect r = iconGeometry(); + + if (!r.isValid()) + return true; + + // Algorithm taken from Window Maker (http://www.windowmaker.org) + + int sx = geometry().x(); + int sy = geometry().y(); + int sw = width(); + int sh = height(); + int dx = r.x(); + int dy = r.y(); + int dw = r.width(); + int dh = r.height(); + + double steps = 12; + + double xstep = double((dx-sx)/steps); + double ystep = double((dy-sy)/steps); + double wstep = double((dw-sw)/steps); + double hstep = double((dh-sh)/steps); + + double cx = sx; + double cy = sy; + double cw = sw; + double ch = sh; + + double finalAngle = 3.14159265358979323846; + + double delta = finalAngle / steps; + + TQPainter p(workspaceWidget()); + p.setRasterOp(TQt::NotROP); + + for (double angle = 0; ; angle += delta) + { + if (angle > finalAngle) + angle = finalAngle; + + double dx = (cw / 10) - ((cw / 5) * sin(angle)); + double dch = (ch / 2) * cos(angle); + double midy = cy + (ch / 2); + + TQPoint p1(int(cx + dx), int(midy - dch)); + TQPoint p2(int(cx + cw - dx), p1.y()); + TQPoint p3(int(cx + dw + dx), int(midy + dch)); + TQPoint p4(int(cx - dx), p3.y()); + + grabXServer(); + + p.drawLine(p1, p2); + p.drawLine(p2, p3); + p.drawLine(p3, p4); + p.drawLine(p4, p1); + + p.flush(); + + usleep(500); + + p.drawLine(p1, p2); + p.drawLine(p2, p3); + p.drawLine(p3, p4); + p.drawLine(p4, p1); + + ungrabXServer(); + + cx += xstep; + cy += ystep; + cw += wstep; + ch += hstep; + + if (angle >= finalAngle) + break; + } + } + break; + + case 2: + { + // KVirc style ? Maybe. For qwertz. + + if (!iconify) // No animation for restore. + return true; + + // Go away quick. + helperShowHide(false); + tqApp->syncX(); + + int stepCount = 12; + + TQRect r(geometry()); + + int dx = r.width() / (stepCount * 2); + int dy = r.height() / (stepCount * 2); + + TQPainter p(workspaceWidget()); + p.setRasterOp(TQt::NotROP); + + for (int step = 0; step < stepCount; step++) + { + r.moveBy(dx, dy); + r.setWidth(r.width() - 2 * dx); + r.setHeight(r.height() - 2 * dy); + + grabXServer(); + + p.drawRect(r); + p.flush(); + usleep(200); + p.drawRect(r); + + ungrabXServer(); + } + } + break; + + + default: + { + TQRect icongeom = iconGeometry(); + + if (!icongeom.isValid()) + return true; + + TQRect wingeom = geometry(); + + TQPainter p(workspaceWidget()); + + p.setRasterOp(TQt::NotROP); +#if 0 + if (iconify) + p.setClipRegion(TQRegion(workspaceWidget()->rect()) - wingeom); +#endif + grabXServer(); + + p.drawLine(wingeom.bottomRight(), icongeom.bottomRight()); + p.drawLine(wingeom.bottomLeft(), icongeom.bottomLeft()); + p.drawLine(wingeom.topLeft(), icongeom.topLeft()); + p.drawLine(wingeom.topRight(), icongeom.topRight()); + + p.flush(); + + tqApp->syncX(); + + usleep(30000); + + p.drawLine(wingeom.bottomRight(), icongeom.bottomRight()); + p.drawLine(wingeom.bottomLeft(), icongeom.bottomLeft()); + p.drawLine(wingeom.topLeft(), icongeom.topLeft()); + p.drawLine(wingeom.topRight(), icongeom.topRight()); + + ungrabXServer(); + } + break; + } + return true; +} + +void Manager::createTitle() +{ + leftButtonList_.clear(); + rightButtonList_.clear(); + + TQString buttons; + + if (options()->customButtonPositions()) + buttons = options()->titleButtonsLeft() + "|" + + options()->titleButtonsRight(); + else + buttons = "XSH|IA"; + + TQPtrList