summaryrefslogtreecommitdiffstats
path: root/kblackbox
diff options
context:
space:
mode:
Diffstat (limited to 'kblackbox')
-rw-r--r--kblackbox/CHANGES52
-rw-r--r--kblackbox/Makefile.am22
-rw-r--r--kblackbox/README28
-rw-r--r--kblackbox/VERSION2
-rw-r--r--kblackbox/big_kblackbox.xpm269
-rw-r--r--kblackbox/hi128-app-kblackbox.pngbin0 -> 9260 bytes
-rw-r--r--kblackbox/hi16-app-kblackbox.pngbin0 -> 735 bytes
-rw-r--r--kblackbox/hi22-app-kblackbox.pngbin0 -> 1187 bytes
-rw-r--r--kblackbox/hi32-app-kblackbox.pngbin0 -> 1824 bytes
-rw-r--r--kblackbox/hi48-app-kblackbox.pngbin0 -> 3146 bytes
-rw-r--r--kblackbox/hi64-app-kblackbox.pngbin0 -> 4202 bytes
-rw-r--r--kblackbox/kbbgame.cpp740
-rw-r--r--kblackbox/kbbgame.h104
-rw-r--r--kblackbox/kbbgfx.cpp473
-rw-r--r--kblackbox/kbbgfx.h120
-rw-r--r--kblackbox/kblackbox.desktop77
-rw-r--r--kblackbox/kblackboxui.rc24
-rw-r--r--kblackbox/main.cpp46
-rw-r--r--kblackbox/pics/Makefile.am10
-rw-r--r--kblackbox/pics/blue.xpm199
-rw-r--r--kblackbox/pics/brown.xpm77
-rw-r--r--kblackbox/pics/cyan.xpm193
-rw-r--r--kblackbox/pics/done.xpm33
-rw-r--r--kblackbox/pics/giveup.xpm28
-rw-r--r--kblackbox/pics/gray.xpm150
-rw-r--r--kblackbox/pics/green.xpm218
-rw-r--r--kblackbox/pics/green2.xpm300
-rw-r--r--kblackbox/pics/red.xpm202
-rw-r--r--kblackbox/pics/white.xpm100
-rw-r--r--kblackbox/util.cpp68
-rw-r--r--kblackbox/util.h42
-rw-r--r--kblackbox/version.h1
32 files changed, 3578 insertions, 0 deletions
diff --git a/kblackbox/CHANGES b/kblackbox/CHANGES
new file mode 100644
index 00000000..985fa5c9
--- /dev/null
+++ b/kblackbox/CHANGES
@@ -0,0 +1,52 @@
+1999-06-07 Petter Reinholdtsen <pere@td.org.uit.no>
+ * kbbgame.cpp: Changed text Quit to Exit to match KDE style guide.
+
+0.3.0 from 0.2.6 (17.1.1999)
+ - KBBGraphic derived only from QWidget, not QTableView
+ -> a complete rewrite of gfx stuff
+ -> massive changes almost everywhere
+ - minimal size fixed
+ - new icons (I am just learning the povray :-)
+0.2.6 from 0.2.5 (25.8.1998)
+ - the game is active after starting
+ - fixed bad drawing after setting the board size
+ - config. scripts from new kexample (KDE 1.0)
+ - moc dependencies in Makefile.am done by automoc to
+ avoid problems on Solaris (bug report by David Faure)
+ - some string fixes for better translation
+0.2.5 from 0.2.4 (19.3.1998)
+ - es language support added
+ - sk language support added
+0.2.4 from 0.2.3 (6.3.1998)
+ - pt language support added
+ - it language support added
+0.2.3 from 0.2.2 (10.2.1998)
+ - new icon for fired laser
+ - new icon for "give up"
+ - "done" added to menu and toolbar (new icon)
+ - help file updated
+0.2.2 from 0.2.1 (2.2.1998)
+ - "done" button removed - middle mouse button instead
+ - kde toolbar
+ - kde status bar
+ - new icons
+ - help file updated
+0.2.1 from 0.2.0:
+ - KBlackBox.kdelnk
+ - icon kblackbox.xpm
+ - double updating during resize fixed
+ - saves the application size
+ - doesn't autoresize after changing a board size
+0.2.0 from 0.1.1:
+ - kblackbox is now a KDE application -> help, configuration, ...
+ - autoconf usage (by kexample-0.4.0)
+ - remembers last used options
+ - pixmaps on fields in the box
+0.1.1 from 0.1.0:
+ - you are warned if you try to change # of balls when a game is running
+ - game->resize works properly, even if you moved scrollbars now
+ - mouseMoveEvent reimplemented, so that you can "draw" when a button
+ is pressed
+ - marking with the right mouse button
+ - displaying more game statistics
+ - possibility to give up the game (shows you where the balls were)
diff --git a/kblackbox/Makefile.am b/kblackbox/Makefile.am
new file mode 100644
index 00000000..813aff83
--- /dev/null
+++ b/kblackbox/Makefile.am
@@ -0,0 +1,22 @@
+SUBDIRS = pics
+
+INCLUDES = -I$(top_srcdir)/libkdegames $(all_includes)
+
+bin_PROGRAMS = kblackbox
+kblackbox_SOURCES = kbbgfx.cpp kbbgame.cpp util.cpp main.cpp
+kblackbox_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+kblackbox_LDADD = $(LIB_KDEGAMES)
+kblackbox_DEPENDENCIES = $(LIB_KDEGAMES_DEP)
+
+METASOURCES = AUTO
+KDE_ICON = kblackbox
+
+xdg_apps_DATA = kblackbox.desktop
+
+EXTRA_DIST = VERSION CHANGES $(xdg_apps_DATA)
+
+rcdir = $(kde_datadir)/kblackbox
+rc_DATA = kblackboxui.rc
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kblackbox.pot
diff --git a/kblackbox/README b/kblackbox/README
new file mode 100644
index 00000000..a7678515
--- /dev/null
+++ b/kblackbox/README
@@ -0,0 +1,28 @@
+Program: kblackbox
+Author: Robert Cimrman, e-mail: cimrman3@students.zcu.cz
+
+A simple logical game for the KDE project.
+
+FEATURES:
+ -stunning gfx (in the next version :-)
+ -high logical requirements
+USING:
+ -see help
+KNOWN BUGS:
+ -none
+UNKNOWN BUGS:
+ -still unknown
+ ->report any "bogus features" to the author, please
+TODO:
+ -improve gfx?
+HISTORY:
+ 23.4.1997 -> start
+ 28.4.1997 -> 0.1.0
+ 29.4.1997 -> 0.1.1
+ 29.7.1997 -> 0.2.0
+ 2.2.1997 -> 0.2.2
+ 10.2.1998 -> 0.2.3
+ 6.3.1998 -> 0.2.4
+ 19.3.1998 -> 0.2.5
+ 25.8.1998 -> 0.2.6
+ 17.1.1999 -> 0.3.0
diff --git a/kblackbox/VERSION b/kblackbox/VERSION
new file mode 100644
index 00000000..064bd513
--- /dev/null
+++ b/kblackbox/VERSION
@@ -0,0 +1,2 @@
+kblackbox-0.3.0
+
diff --git a/kblackbox/big_kblackbox.xpm b/kblackbox/big_kblackbox.xpm
new file mode 100644
index 00000000..e448e5a7
--- /dev/null
+++ b/kblackbox/big_kblackbox.xpm
@@ -0,0 +1,269 @@
+/* XPM */
+static char * kblackbox_xpm[] = {
+"48 48 218 2",
+" c None",
+". c #414141",
+"+ c #404040",
+"@ c #464646",
+"# c #424242",
+"$ c #484848",
+"% c #585858",
+"& c #818181",
+"* c #7D7D7D",
+"= c #7F7F7F",
+"- c #4D4D4D",
+"; c #727272",
+"> c #5A5A5A",
+", c #878787",
+"' c #4B4B4B",
+") c #6E6E6E",
+"! c #666666",
+"~ c #626262",
+"{ c #767676",
+"] c #555555",
+"^ c #6F6F6F",
+"/ c #5F5F5F",
+"( c #797979",
+"_ c #454545",
+": c #858585",
+"< c #272727",
+"[ c #595959",
+"} c #787878",
+"| c #696969",
+"1 c #5B5B5B",
+"2 c #868686",
+"3 c #262626",
+"4 c #2F2F2F",
+"5 c #2E2E2E",
+"6 c #A5A5A5",
+"7 c #575757",
+"8 c #4C4C4C",
+"9 c #4F4F4F",
+"0 c #5E5E5E",
+"a c #2D2D2D",
+"b c #565656",
+"c c #7E7E7E",
+"d c #303030",
+"e c #6B6B6B",
+"f c #363636",
+"g c #505050",
+"h c #545454",
+"i c #3F3F3F",
+"j c #4E4E4E",
+"k c #4A4A4A",
+"l c #373737",
+"m c #5D5D5D",
+"n c #393939",
+"o c #383838",
+"p c #353535",
+"q c #676767",
+"r c #3D3D3D",
+"s c #3E3E3E",
+"t c #343434",
+"u c #606060",
+"v c #262600",
+"w c #2F2F01",
+"x c #5A5A06",
+"y c #4B4B04",
+"z c #2C2C01",
+"A c #2D2D01",
+"B c #2E2E01",
+"C c #3C3C3C",
+"D c #737373",
+"E c #292900",
+"F c #333301",
+"G c #494949",
+"H c #D4D400",
+"I c #606000",
+"J c #272700",
+"K c #242400",
+"L c #313103",
+"M c #5C5C5C",
+"N c #3B3B3B",
+"O c #6B6B00",
+"P c #404001",
+"Q c #363603",
+"R c #E0E000",
+"S c #5E5E00",
+"T c #5D5D00",
+"U c #252500",
+"V c #333304",
+"W c #393907",
+"X c #282828",
+"Y c #878700",
+"Z c #AAAA05",
+"` c #373704",
+" . c #303002",
+".. c #323232",
+"+. c #E9E902",
+"@. c #5A5A00",
+"#. c #565600",
+"$. c #383806",
+"%. c #343406",
+"&. c #5A5A11",
+"*. c #313131",
+"=. c #292929",
+"-. c #FFFF2B",
+";. c #FFFF25",
+">. c #5E5E03",
+",. c #606002",
+"'. c #545400",
+"). c #5B5B05",
+"!. c #353506",
+"~. c #585811",
+"{. c #515151",
+"]. c #525252",
+"^. c #F5F50A",
+"/. c #646401",
+"(. c #696903",
+"_. c #EFEF0E",
+":. c #535305",
+"<. c #4D4D06",
+"[. c #444406",
+"}. c #54540D",
+"|. c #6A6A0E",
+"1. c #444444",
+"2. c #DEDE00",
+"3. c #626200",
+"4. c #6E6E00",
+"5. c #D6D60A",
+"6. c #3F3F05",
+"7. c #363605",
+"8. c #3E3E05",
+"9. c #53530C",
+"0. c #61610D",
+"a. c #4E4E0E",
+"b. c #474747",
+"c. c #B5B509",
+"d. c #3D3D04",
+"e. c #313104",
+"f. c #83830C",
+"g. c #7D7D0D",
+"h. c #4D4D0D",
+"i. c #646464",
+"j. c #333333",
+"k. c #434343",
+"l. c #9F9F09",
+"m. c #474706",
+"n. c #51510A",
+"o. c #7C7C0B",
+"p. c #7C7C0C",
+"q. c #7E7E0E",
+"r. c #727205",
+"s. c #202000",
+"t. c #494909",
+"u. c #7B7B0A",
+"v. c #7D7D0C",
+"w. c #3A3A3A",
+"x. c #474708",
+"y. c #484808",
+"z. c #484809",
+"A. c #7A7A0A",
+"B. c #7B7B0B",
+"C. c #9D9D0C",
+"D. c #9D9D0D",
+"E. c #2C2C2C",
+"F. c #636363",
+"G. c #464606",
+"H. c #474707",
+"I. c #999909",
+"J. c #9B9B0A",
+"K. c #8F8F0B",
+"L. c #90900C",
+"M. c #535353",
+"N. c #585806",
+"O. c #464607",
+"P. c #656507",
+"Q. c #676708",
+"R. c #8D8D09",
+"S. c #6D6D02",
+"T. c #6C6C02",
+"U. c #62620F",
+"V. c #606005",
+"W. c #454506",
+"X. c #4C4C06",
+"Y. c #2B2B01",
+"Z. c #636301",
+"`. c #616102",
+" + c #7C7C02",
+".+ c #70700B",
+"++ c #646411",
+"@+ c #575701",
+"#+ c #939301",
+"$+ c #989801",
+"%+ c #949401",
+"&+ c #8F8F01",
+"*+ c #686801",
+"=+ c #717103",
+"-+ c #94940B",
+";+ c #868601",
+">+ c #8F8F02",
+",+ c #707000",
+"'+ c #B0B00E",
+")+ c #787800",
+"!+ c #A5A504",
+"~+ c #717171",
+"{+ c #686868",
+"]+ c #D5D50A",
+"^+ c #555502",
+"/+ c #5C5C02",
+"(+ c #353504",
+"_+ c #616161",
+":+ c #FFFF21",
+"<+ c #606001",
+"[+ c #626201",
+"}+ c #6A6A02",
+"|+ c #E4E404",
+"1+ c #D8D801",
+"2+ c #616100",
+"3+ c #686800",
+"4+ c #949400",
+"5+ c #747474",
+" ",
+" ",
+" ",
+" . + + . + @ + + # ",
+" . . + . + $ + % & . + + + . + . * + + . + + . . + + ",
+" + + . . = - ; > + + + . # + . , . ' ) ! ~ + + . { + . . % + ] + + ^ . / + + ",
+" + + . # . + + . . . . . + . . . ( + + . + + . ~ _ + . . + . + . + # : / . + + + + < < ",
+"$ _ _ . + . . + . + . + # . + + . . + . # [ ^ % - $ } | 1 % 2 + + # . + . # ) . + + 3 < 3 ",
+"4 5 5 4 4 4 - . . + . . # . + + . . + + . # . + + + # 6 . + + . 7 8 9 . . . 0 [ + 3 4 3 3 ",
+"4 4 5 a ' 5 5 4 4 4 4 5 + # * 7 . b c . . # + . # + # . . + . . . . . + . . + + 3 3 < 3 ",
+"5 5 d e 4 4 4 4 4 4 4 4 5 f g 5 # 4 . . . . + . . + . + + . . + h + . + = i { < < < < < ",
+"d 5 5 g 5 4 4 d j d 4 4 7 5 4 5 5 k l 5 5 5 5 5 + + + . + . . m @ + . + # 3 7 < 3 < 3 < ",
+"4 n o 4 5 4 4 ! 5 l p 4 o 4 a 4 4 7 q 5 4 5 4 b ' 5 5 d 4 5 + + + [ ) j 3 3 3 3 3 3 < < ",
+"5 5 ' 4 4 4 4 4 5 4 9 5 4 5 5 5 5 5 ; g r 4 4 5 s k t 4 d 4 5 4 4 4 5 < < 3 < 3 < < 3 < ",
+"5 4 5 u d 5 v w x y z A B B 4 5 C [ D 0 5 5 4 4 5 d # 5 4 4 5 4 # 4 4 3 3 < < < < 3 < ",
+" 4 5 u 4 E w F 5 5 p G H I I J K L % M f 5 5 5 4 4 5 4 5 4 4 4 5 G 4 < < f 3 3 3 3 < ",
+" 4 5 N O P Q 9 p n u 4 4 4 4 R S T U V W 5 5 d 4 4 5 4 4 4 5 5 % 4 4 a < < X 3 < 3 X ",
+" 8 p 5 Y Z ` ...4 q g 5 5 _ 9 5 +.@.#.$.%.&.5 4 5 4 5 5 5 4 4 *.@ 4 < < < =.3 < l 5 ",
+" 5 d / 5 -.;.>.,.4 4 k 4 4 N o 5 4 5 '.).!.%.~.5 5 5 5 4 4 5 d i {.[ < < # ] < o < < ",
+" d 4 5 ].^./.(.5 4 5 5 4 5 4 4 5 4 _.:.<.[.}.}.|.5 4 5 4 5 4 i {.p i < < 1.3 < s ",
+" 4 5 4 5 5 2.3.4.4 4 d 4 N 4 5 4 4 j 5.6.7.8.9.0.a.4 5 5 4 5 5 s ' 3 3 < 3 C < h ",
+" p G b.4 4 4 5 4 5 5 4 4 4 f 5 s 4 [ s c.d.e.f.g.h.a.4 5 4 o G i.j.< < p u < =.3 ",
+" 4 4 5 4 5 d 4 4 # 4 5 d 4 5 # 0 . 4 k.l.m.n.o.p.g.q.4 5 k.1 4 r 5 3 p 3 < 3 < < ",
+" ) 4 5 5 5 ; 5 d 5 4 4 5 5 4 $ 5 4 5 r.s.t.u.o.v.g.q.5 4 4 5 N 3 3 s 3 X < *.3 ",
+" r 4 4 4 5 5 s 4 4 _ d 4 d w.4 4 4 4 x.y.z.A.B.o.C.D.4 5 4 4 4 < =.E.3 < k < ",
+" 5 ^ 4 4 4 4 4 4 4 F.p t j.5 5 4 d G.H.x.y.I.J.K.L.S *.d 5 4 4 3 < X 3 1.3 < ",
+" M.p *.5 1.4 5 4 5 ] 5 d 4 5 4 4 N.G.O.P.Q.R.S S.T.T 4 4 4 5 4 < < 3 e t 3 3 ",
+" 5 # 4 r 4 4 4 4 4 4 5 5 4 5 U.V.W.X.Y.Z.`.T.T. +5 d 5 4 5 4 < 3 o < 3 < 3 ",
+" 4 4 5 - 5 4 5 d 4 4 d 4 s. ..+++@+#+$+%+&+u 4 5 4 4 4 5 5 < < < 3 3 < < ",
+" 5 4 4 p 5 4 d *.d 5 5 *+=+-+;+>+#+4 4 M.4 5 D 4 5 5 5 5 w.3 3 3 < 3 < % ",
+" 5 o 5 4 k s 5 5 5 5 ,+'+)+5 5 4 4 s g 4 4 s . 4 4 4 5 % < < ..3 j.< 3 ",
+" l 5 b.5 ] ..) ' 4 4 !+4 4 4 4 4 4 + 4 4 4 4 5 4 4 5 5 p < < 3 < b.3 ",
+" p t r 5 a 4 ~+5 7 5 4 5 4 4 4 4 5 + m 4 d 5 4 4 4 5 j.4 ' 3 C 3 w.N ",
+" d 4 4 d 5 5 s + 4 ~ 5 @ 1.5 5 5 + 1.d 5 4 4 t 5 d d 4 4 ]._ 3 =.< ",
+" 5 4 d {+5 4 5 ]+^+/+(+5 _ k 5 _+5 5 4 5 5 d 5 4 5 5 4 X < l < 5 ",
+" 4 5 4 a 5 4 t 4 :+<+[+}+4 4 d 4 i 5 4 4 5 8 $ h 5 4 4 5 < 3 < ",
+" 5 4 d _ 4 *.k.|+1+2+3+4 4 4 4 d 4 a 5 5 - % d 5 5 3 ' 3 X ",
+" > 5 5 5 M.5 _+4 4+4 5 w.b.C 4 4 4 4 a 4 4 4 3 < < k. ",
+" 4 8 s 5 5 4 4 5 4 g 5+d 0 4 4 4 4 5 5 4 3 3 < b ",
+" 4 4 4 b.5 @ 5 5 i i.4 s 8 5 4 4 5 4 i < G ",
+" d 5 4 4 4 _ 5 4 5 [ ' 5 j.4 {.l . d 3 < ",
+" 4 5 5 5 j.5 4 4 5 d 5 d h 4 4 =.3 < ",
+" 4 4 5 ].4 d 4 4 4 4 4 r 5 < 3 ",
+" 4 4 5 u 4 4 5 _ ; 1.- 3 < ",
+" 5 5 5 4 d N 5 4 4 3 ",
+" 5 5 d 1 4 a < 3 ",
+" 5 _ % 4 3 ",
+" 4 4 p "};
diff --git a/kblackbox/hi128-app-kblackbox.png b/kblackbox/hi128-app-kblackbox.png
new file mode 100644
index 00000000..76d581e0
--- /dev/null
+++ b/kblackbox/hi128-app-kblackbox.png
Binary files differ
diff --git a/kblackbox/hi16-app-kblackbox.png b/kblackbox/hi16-app-kblackbox.png
new file mode 100644
index 00000000..2b28f5ee
--- /dev/null
+++ b/kblackbox/hi16-app-kblackbox.png
Binary files differ
diff --git a/kblackbox/hi22-app-kblackbox.png b/kblackbox/hi22-app-kblackbox.png
new file mode 100644
index 00000000..77d0d2b2
--- /dev/null
+++ b/kblackbox/hi22-app-kblackbox.png
Binary files differ
diff --git a/kblackbox/hi32-app-kblackbox.png b/kblackbox/hi32-app-kblackbox.png
new file mode 100644
index 00000000..6e8f897e
--- /dev/null
+++ b/kblackbox/hi32-app-kblackbox.png
Binary files differ
diff --git a/kblackbox/hi48-app-kblackbox.png b/kblackbox/hi48-app-kblackbox.png
new file mode 100644
index 00000000..77c86d12
--- /dev/null
+++ b/kblackbox/hi48-app-kblackbox.png
Binary files differ
diff --git a/kblackbox/hi64-app-kblackbox.png b/kblackbox/hi64-app-kblackbox.png
new file mode 100644
index 00000000..f97a1f5c
--- /dev/null
+++ b/kblackbox/hi64-app-kblackbox.png
Binary files differ
diff --git a/kblackbox/kbbgame.cpp b/kblackbox/kbbgame.cpp
new file mode 100644
index 00000000..82028871
--- /dev/null
+++ b/kblackbox/kbbgame.cpp
@@ -0,0 +1,740 @@
+//
+// KBlackbox
+//
+// A simple game inspired by an emacs module
+//
+// File: kbbgame.cpp
+//
+// The implementation of the KBBGame widget
+//
+
+#include <config.h>
+
+#include <qpopupmenu.h>
+#include <qkeycode.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qtooltip.h>
+#include <qstring.h>
+
+#include <kmessagebox.h>
+#include <kdebug.h>
+#include <kapplication.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kglobal.h>
+#include <kmenubar.h>
+#include <kiconloader.h>
+#include <khelpmenu.h>
+#include <kaction.h>
+#include <kstdaction.h>
+#include <kstatusbar.h>
+#include <kstdgameaction.h>
+
+#include "kbbgame.h"
+#include "util.h"
+#include "version.h"
+
+/*
+ Names of pixmap files.
+*/
+
+const char *pFNames[NROFTYPES] = {
+ "white",
+ "gray",
+ "green",
+ "red",
+ "blue",
+ "cyan",
+ "brown",
+ "green2"
+};
+
+/*
+ Creates the KBBGame widget and sets saved options (if any).
+*/
+
+KBBGame::KBBGame()
+{
+ int i;
+
+ QPixmap **pix = new QPixmap * [NROFTYPES];
+ pix[0] = new QPixmap();
+ *pix[0] = BarIcon( pFNames[0] );
+ if (!pix[0]->isNull()) {
+ kdDebug(12009) << "Pixmap \"" << pFNames[0] << "\" loaded." << endl;
+ for (i = 1; i < NROFTYPES; i++) {
+ pix[i] = new QPixmap;
+ *pix[i] = BarIcon( pFNames[i] );
+ if (!pix[i]->isNull()) {
+ kdDebug(12009) << "Pixmap \"" << pFNames[i] << "\" loaded." << endl;
+ } else {
+ pix[i] = pix[i-1];
+ pix[i]->detach();
+ kdDebug(12009) << "Cannot find pixmap \"" << pFNames[i] << "\". Using previous one." << endl;
+ }
+ }
+ } else {
+ kdDebug(12009) << "Cannot find pixmap \"" << pFNames[0] << "\". Pixmaps will not be loaded." << endl;
+ delete pix[0];
+ delete pix;
+ pix = NULL;
+ }
+ gr = new KBBGraphic( pix, this, "KBBGraphic" );
+
+ statusBar()->insertItem(i18n("Score: 0000"), SSCORE);
+ statusBar()->insertItem(i18n("Placed: 00 / 00"), SBALLS);
+ statusBar()->insertItem(i18n("Run: yesno"), SRUN);
+ statusBar()->insertItem(i18n("Size: 00 x 00"), SSIZE);
+
+ initKAction();
+
+ connect( gr, SIGNAL(inputAt(int,int,int)),
+ this, SLOT(gotInputAt(int,int,int)) );
+ connect( this, SIGNAL(gameRuns(bool)),
+ gr, SLOT(setInputAccepted(bool)) );
+ connect( gr, SIGNAL(endMouseClicked()),
+ this, SLOT(gameFinished()) );
+
+ /*
+ QToolTip::add( doneButton, i18n(
+ "Click here when you think you placed all the balls.") );
+ */
+
+ /*
+ Game initializations
+ */
+ running = FALSE;
+ gameBoard = NULL;
+
+ KConfig *kConf;
+ int j;
+ kConf = kapp->config();
+ kConf->setGroup( "KBlackBox Setup" );
+ if (kConf->hasKey( "Balls" )) {
+ i = kConf->readNumEntry( "Balls" );
+ balls = i;
+ switch (i) {
+ case 4: ballsAction->setCurrentItem(0); break;
+ case 6: ballsAction->setCurrentItem(1); break;
+ case 8: ballsAction->setCurrentItem(2); break;
+ }
+ } else {
+ balls = 4;
+ ballsAction->setCurrentItem(0);
+ }
+ if ((kConf->hasKey( "Width" )) &&
+ (kConf->hasKey( "Balls" ))) {
+ i = kConf->readNumEntry( "Width" );
+ j = kConf->readNumEntry( "Height" );
+ gr->setSize( i+4, j+4 ); // +4 is the space for "lasers" and an edge...
+ gameBoard = new RectOnArray( gr->numC(), gr->numR() );
+ switch (i) {
+ case 8: sizeAction->setCurrentItem(0); break;
+ case 10: sizeAction->setCurrentItem(1); break;
+ case 12: sizeAction->setCurrentItem(2); break;
+ }
+ } else {
+ gr->setSize( 8+4, 8+4 ); // +4 is the space for "lasers" and an edge...
+ gameBoard = new RectOnArray( gr->numC(), gr->numR() );
+ sizeAction->setCurrentItem(0);
+ }
+ if (kConf->hasKey( "tutorial" )) {
+ tutorial = (bool) kConf->readNumEntry( "tutorial" );
+ } else tutorial = FALSE;
+ tutorialAction->setChecked(tutorial);
+
+ setCentralWidget( gr );
+
+ setScore( 0 );
+ ballsPlaced = 0;
+
+ updateStats();
+
+ newGame();
+ setMinSize();
+
+ setupGUI();
+}
+
+/*
+ Saves the options and destroys the KBBGame widget.
+*/
+
+KBBGame::~KBBGame()
+{
+ KConfig *kConf;
+ QString s;
+
+ kConf = kapp->config();
+ kConf->setGroup( "KBlackBox Setup" );
+ kConf->writeEntry( "Balls", balls );
+ kConf->writeEntry( "Width", gr->numC() - 4);
+ kConf->writeEntry( "Height", gr->numR() - 4);
+ kConf->writeEntry( "tutorial", (int) tutorial );
+
+ delete gameBoard;
+ // All the rest has "this" for parent so it doesn't need to be deleted.
+}
+
+
+/*
+ Resizes yourself to fit the contents perfectly, from menu.
+*/
+void KBBGame::gameResize()
+{
+ resize( gr->wHint(), gr->hHint() + menuBar()->height() + statusBar()->height() +
+ toolBar()->height() );
+}
+
+void KBBGame::setMinSize()
+{
+ setMinimumSize( gr->wHint(), gr->hHint() + menuBar()->height() + statusBar()->height() +
+ toolBar()->height() );
+}
+
+/*
+ Settings of various options.
+*/
+void KBBGame::slotSize()
+{
+ int i = sizeAction->currentItem();
+ bool ok = false;
+ switch (i) {
+ case 0:
+ ok = setSize( 8, 8 );
+ break;
+ case 1:
+ ok = setSize( 10, 10 );
+ break;
+ case 2:
+ ok = setSize( 12, 12 );
+ break;
+ }
+
+ if (!ok) {
+ switch(gr->numR() - 4) {
+ case 8:
+ sizeAction->setCurrentItem(0); break;
+ case 10:
+ sizeAction->setCurrentItem(1); break;
+ case 12:
+ sizeAction->setCurrentItem(2); break;
+ }
+ }
+}
+
+void KBBGame::slotBalls()
+{
+ int i = ballsAction->currentItem();
+ bool ok = false;
+ switch (i) {
+ case 0:
+ ok = setBalls( 4 );
+ break;
+ case 1:
+ ok = setBalls( 6 );
+ break;
+ case 2:
+ ok = setBalls( 8 );
+ break;
+ }
+ if (!ok) {
+ switch (balls) {
+ case 4:
+ ballsAction->setCurrentItem(0); break;
+ case 6:
+ ballsAction->setCurrentItem(1); break;
+ case 8:
+ ballsAction->setCurrentItem(2); break;
+ }
+ }
+}
+
+void KBBGame::tutorialSwitch()
+{
+ tutorial = !tutorial;
+}
+
+/*
+ Creates a new game.
+*/
+void KBBGame::newGame()
+{
+ int i, j;
+
+ if (running) {
+ bool cancel;
+ cancel = KMessageBox::warningContinueCancel(0,
+ i18n("Do you really want to give up this game?"),QString::null,i18n("Give Up"))
+ == KMessageBox::Cancel;
+ if (cancel)
+ return;
+
+ abortGame();
+ }
+
+ gameBoard->fill( INNERBBT );
+ for (j = 0; j < (gr->numR()); j++) {
+ gameBoard->set( 0, j, OUTERBBT );
+ gameBoard->set( gr->numC()-1, j, OUTERBBT );
+ }
+ for (i = 0; i < (gr->numC()); i++) {
+ gameBoard->set( i, 0, OUTERBBT );
+ gameBoard->set( i, gr->numR()-1, OUTERBBT );
+ }
+ for (j = 2; j < (gr->numR()-2); j++) {
+ gameBoard->set( 1, j, LASERBBT );
+ gameBoard->set( gr->numC()-2, j, LASERBBT );
+ }
+ for (i = 2; i < (gr->numC()-2); i++) {
+ gameBoard->set( i, 1, LASERBBT );
+ gameBoard->set( i, gr->numR()-2, LASERBBT );
+ }
+ gameBoard->set( 1, 1, OUTERBBT );
+ gameBoard->set( 1, gr->numR()-2, OUTERBBT );
+ gameBoard->set( gr->numC()-2, 1, OUTERBBT );
+ gameBoard->set( gr->numC()-2, gr->numR()-2, OUTERBBT );
+
+ randomBalls( balls );
+ remap( gameBoard, gr->getGraphicBoard() );
+ gr->repaint( TRUE );
+ setScore( 0 );
+ detourCounter = -1;
+ ballsPlaced = 0;
+ running = TRUE;
+ updateStats();
+ emit gameRuns( running );
+}
+
+/*
+ Ends the current game.
+*/
+
+void KBBGame::gameFinished()
+{
+ if (running) {
+ QString s;
+ if (ballsPlaced == balls) {
+ getResults();
+ abortGame();
+ if (score <= (balls*3))
+ s = i18n("Your final score is: %1\n"
+ "You did really well!");
+ else
+ s = i18n("Your final score is: %1\n"
+ "I guess you need more practice.");
+
+ KMessageBox::information(this,
+ s.arg(KGlobal::locale()->formatNumber(score, 0)));
+ } else {
+ s = i18n( "You should place %1 balls!\n"
+ "You have placed %2.")
+ .arg(KGlobal::locale()->formatNumber(balls, 0))
+ .arg(KGlobal::locale()->formatNumber(ballsPlaced, 0));
+
+ KMessageBox::sorry(this, s);
+ }
+ }
+}
+
+/*
+ Computes the final score and indicate errors.
+*/
+
+void KBBGame::getResults()
+{
+ int i, j, tgam, tgra;
+ RectOnArray *r = gr->getGraphicBoard();
+ for (j = 0; j < (gr->numR()); j++) {
+ for (i = 0; i < (gr->numC()); i++) {
+ tgam = gameBoard->get( i, j );
+ tgra = r->get( i, j );
+ if ((tgam == BALLBBT) && (tgra != TBALLBBG)) {
+ setScore( score+5 );
+ r->set( i, j, WBALLBBG );
+ gr->updateElement( i, j );
+ }
+ if ((tgam != BALLBBT) && (tgra == TBALLBBG)) {
+ r->set( i, j, FBALLBBG );
+ gr->updateElement( i, j );
+ }
+ }
+ }
+}
+
+/*
+ Aborts the current game.
+*/
+
+void KBBGame::abortGame()
+{
+ if (running) {
+ running = FALSE;
+ ballsPlaced = 0;
+ updateStats();
+ gr->clearFocus();
+ emit gameRuns( running );
+ }
+}
+
+/*
+ Gives the game up.
+*/
+
+void KBBGame::giveUp()
+{
+ if (running) {
+ bool stop;
+ stop = KMessageBox::warningContinueCancel(0,
+ i18n(
+ "Do you really want to give up this game?"),QString::null,i18n("Give Up"))
+ == KMessageBox::Continue;
+
+ if (stop) {
+ getResults();
+ abortGame();
+ }
+ }
+}
+
+/*
+ Displays game statistics.
+*/
+
+void KBBGame::updateStats()
+{
+ QString tmp;
+ QString s = i18n("Run: ");
+ if (running)
+ s += i18n("Yes");
+ else
+ s += i18n("No");
+ statusBar()->changeItem( s, SRUN );
+ s = i18n( "Size: " );
+ s += tmp.sprintf( "%2d x %2d",
+ gr->numC()-4, gr->numR()-4 );
+ statusBar()->changeItem( s, SSIZE );
+ s = i18n( "Placed: " );
+ s += tmp.sprintf( "%2d / %2d",
+ ballsPlaced, balls );
+ statusBar()->changeItem( s, SBALLS );
+}
+
+/*
+ Sets the score value to n.
+*/
+
+void KBBGame::setScore( int n )
+{
+ score = n;
+ statusBar()->changeItem( i18n("Score: %1").arg(n), SSCORE );
+}
+
+/*
+ Sets the size of the black box.
+*/
+
+bool KBBGame::setSize( int w, int h )
+{
+ bool ok = FALSE;
+ if (((w+4) != gr->numC()) || ((h+4) != gr->numR())) {
+ if (running) {
+ ok = KMessageBox::warningContinueCancel(0,
+ i18n(
+ "This will be the end of the current game!"),QString::null,i18n("End Game"))
+ == KMessageBox::Continue;
+
+ } else ok = TRUE;
+ if (ok) {
+ gr->setSize( w+4, h+4 ); // +4 is the space for "lasers" and an edge...
+ setMinSize();
+ gameResize();
+ delete gameBoard;
+ gameBoard = new RectOnArray( gr->numC(), gr->numR() );
+ if (running) abortGame();
+ newGame();
+ // gr->repaint( TRUE );
+ }
+ }
+ return ok;
+}
+
+/*
+ Sets the number of balls in the black box to n.
+*/
+
+bool KBBGame::setBalls( int n )
+{
+ bool ok = FALSE;
+ if (balls != n) {
+ if (running) {
+ ok = KMessageBox::warningContinueCancel(0,
+ i18n("This will be the end of the current game!"),QString::null,i18n("End Game"))
+ == KMessageBox::Continue;
+ } else ok = TRUE;
+ if (ok) {
+ balls = n;
+ if (running) abortGame();
+ newGame();
+ }
+ }
+ return ok;
+}
+
+/*
+ Puts n balls in the black box on random positions.
+*/
+
+void KBBGame::randomBalls( int n )
+{
+ int i;
+ random.setSeed(0);
+ for (i = 0; i < n; i++) {
+ int x=0, y=0; // there is OUTERBBT...
+ while (gameBoard->get( x, y ) != INNERBBT ) {
+ x = 2 + random.getLong(gameBoard->width()-4);
+ y = 2 + random.getLong(gameBoard->height()-4);
+ }
+ gameBoard->set( x, y, BALLBBT );
+ }
+}
+
+/*
+ This is, in fact, the whole game...
+*/
+
+int KBBGame::traceRay( int startX, int startY, int *endX, int *endY )
+{
+ int type, x, y, d, refl;
+ int slx, scx, srx, sly, scy, sry;
+ bool directionChanged;
+ *endX = x = startX;
+ *endY = y = startY;
+ /*
+ Just to avoid compiler warnings
+ */
+ type = slx = scx = srx = sly = scy = sry = 0;
+ /*
+ Get the initial direction d.
+ 0 .. up, 1 .. right, 2 .. down, 3 .. left
+ (0,0) is the upper-left corner.
+ */
+ if ((gameBoard->get( x, y-1 ) == INNERBBT) ||
+ (gameBoard->get( x, y-1 ) == BALLBBT)) { d = 0; }
+ else if ((gameBoard->get( x+1, y ) == INNERBBT) ||
+ (gameBoard->get( x+1, y ) == BALLBBT)) { d = 1; }
+ else if ((gameBoard->get( x, y+1 ) == INNERBBT) ||
+ (gameBoard->get( x, y+1 ) == BALLBBT)) { d = 2; }
+ else if ((gameBoard->get( x-1, y ) == INNERBBT) ||
+ (gameBoard->get( x-1, y ) == BALLBBT)) { d = 3; }
+ else return WRONGSTART;
+ /*
+ And now trace the ray.
+ */
+ while (1) {
+ switch (d) {
+ case 0:
+ slx = -1; scx = 0; srx = 1;
+ sly = -1; scy = -1; sry = -1;
+ break;
+ case 1:
+ slx = 1; scx = 1; srx = 1;
+ sly = -1; scy = 0; sry = 1;
+ break;
+ case 2:
+ slx = 1; scx = 0; srx = -1;
+ sly = 1; scy = 1; sry = 1;
+ break;
+ case 3:
+ slx = -1; scx = -1; srx = -1;
+ sly = 1; scy = 0; sry = -1;
+ break;
+ }
+ directionChanged = FALSE;
+ if (gameBoard->get( x+scx, y+scy ) == LASERBBT) {
+ type = DETOUR;
+ *endX = x+scx;
+ *endY = y+scy;
+ break;
+ }
+ if (gameBoard->get( x+scx, y+scy ) == BALLBBT) {
+ type = HIT;
+ break;
+ }
+ refl = 0;
+ if (gameBoard->get( x+slx, y+sly ) == BALLBBT) {
+ type = REFLECTION;
+ if (gameBoard->get( x, y ) == LASERBBT) break;
+ directionChanged = TRUE;
+ refl += 1;
+ }
+ if (gameBoard->get( x+srx, y+sry ) == BALLBBT) {
+ type = REFLECTION;
+ if (gameBoard->get( x, y ) == LASERBBT) break;
+ directionChanged = TRUE;
+ refl +=2;
+ }
+ // turn to the right
+ if (refl == 1) d = (d + 1) % 4;
+ // turn to the left
+ if (refl == 2) if ((d -= 1) < 0) d += 4;
+ // turn back -- no need to trace again the same way
+ if (refl == 3) break;
+ if (!directionChanged) {
+ x += scx;
+ y += scy;
+ }
+ }
+ return type;
+}
+
+/*
+ Remaps the gameBoard to its graphic representation.
+*/
+
+void KBBGame::remap( RectOnArray *gam, RectOnArray *gra )
+{
+ int i, j;
+ for (j = 0; j < (gam->height()); j++) {
+ for (i = 0; i < (gam->width()); i++) {
+ switch (gam->get( i,j )) {
+ case BALLBBT: if (tutorial) { gra->set( i,j, WBALLBBG ); break; }
+ case INNERBBT: gra->set( i,j, INNERBBG ); break;
+ case OUTERBBT: gra->set( i,j, OUTERBBG ); break;
+ case LASERBBT: gra->set( i,j, LASERBBG ); break;
+ default: gra->set( i,j, OUTERBBG );
+ }
+ }
+ }
+}
+
+/*
+ Processes the user input.
+*/
+
+void KBBGame::gotInputAt( int col, int row, int state )
+{
+ RectOnArray *r = gr->getGraphicBoard();
+ int type = r->get( col, row );
+ int x, y;
+ int ex, ey;
+ int w = gameBoard->width() - 2;
+ int h = gameBoard->height() - 2;
+
+ if (state & LeftButton) {
+ switch (type) {
+ case WBALLBBG: // because of the tutorial mode
+ case INNERBBG:
+ r->set( col, row, TBALLBBG );
+ ballsPlaced++;
+ break;
+ case MARK1BBG:
+ r->set( col, row, INNERBBG );
+ break;
+ case TBALLBBG:
+ r->set( col, row, INNERBBG );
+ ballsPlaced--;
+ break;
+ case LASERBBG:
+ int endX, endY, result;
+ result = traceRay( col, row, &endX, &endY );
+ r->set( col, row, LFIREBBG );
+ //kdDebug << endX << " " << endY << endl;
+ if (col == 1) x = 0; else
+ if (col == w) x = w + 1;
+ else x = col;
+
+ if (row == 1) y = 0; else
+ if (row == h) y = h + 1;
+ else y = row;
+
+ switch (result) {
+ case DETOUR:
+ r->set( endX, endY, LFIREBBG );
+ r->set( x, y, detourCounter );
+ if (endX == 1) ex = 0; else
+ if (endX == w) ex = w + 1;
+ else ex = endX;
+ if (endY == 1) ey = 0; else
+ if (endY == h) ey = h + 1;
+ else ey = endY;
+ r->set( ex, ey, detourCounter-- );
+ gr->updateElement( x, y );
+ gr->updateElement( ex, ey );
+ gr->updateElement( endX, endY );
+ setScore( score+2 );
+ break;
+ case REFLECTION:
+ r->set( x, y, RLASERBBG );
+ gr->updateElement( x, y );
+ setScore( score+1 );
+ break;
+ case HIT:
+ r->set( x, y, HLASERBBG );
+ gr->updateElement( x, y );
+ setScore( score+1 );
+ break;
+ case WRONGSTART:
+ kdDebug(12009) << "Wrong start?! It should't happen!!" << endl;
+ break;
+ }
+ break;
+ }
+ } else if (state & RightButton) {
+ switch (type) {
+ case INNERBBG:
+ r->set( col, row, MARK1BBG );
+ break;
+ /*case MARK1BBG:
+ r->set( col, row, INNERBBG );
+ break;*/
+ }
+ }
+ gr->updateElement( col, row );
+ updateStats();
+}
+
+void KBBGame::initKAction()
+{
+// game
+ KStdGameAction::gameNew(this, SLOT(newGame()), actionCollection());
+ (void)new KAction( i18n("&Give Up"), SmallIcon("giveup"), 0, this, SLOT(giveUp()), actionCollection(), "game_giveup" );
+ (void)new KAction( i18n("&Done"), SmallIcon("done"), 0, this, SLOT(gameFinished()), actionCollection(), "game_done" );
+ (void)new KAction( i18n("&Resize"), 0, this, SLOT(slotResize()), actionCollection(), "game_resize" );
+ KStdGameAction::quit(this, SLOT(close()), actionCollection());
+
+
+// settings
+ sizeAction = new KSelectAction( i18n("&Size"), 0, this, SLOT(slotSize()), actionCollection(), "options_size");
+ QStringList list;
+ list.append(i18n(" 8 x 8 "));
+ list.append(i18n(" 10 x 10 "));
+ list.append(i18n(" 12 x 12 "));
+ sizeAction->setItems(list);
+
+ ballsAction = new KSelectAction( i18n("&Balls"), 0, this, SLOT(slotBalls()), actionCollection(), "options_balls");
+ list.clear();
+ list.append(i18n(" 4 "));
+ list.append(i18n(" 6 "));
+ list.append(i18n(" 8 "));
+ ballsAction->setItems(list);
+ tutorialAction = new KToggleAction( i18n("&Tutorial"), 0, this, SLOT(tutorialSwitch()), actionCollection(), "options_tutorial" );
+// KStdAction::keyBindings(guiFactory(), SLOT(configureShortcuts()),
+//actionCollection());
+
+// keyboard only
+ (void)new KAction( i18n("Move Down"), Qt::Key_Down, gr, SLOT(slotDown()), actionCollection(), "move_down" );
+ (void)new KAction( i18n("Move Up"), Qt::Key_Up, gr, SLOT(slotUp()), actionCollection(), "move_up" );
+ (void)new KAction( i18n("Move Left"), Qt::Key_Left, gr, SLOT(slotLeft()), actionCollection(), "move_left" );
+ (void)new KAction( i18n("Move Right"), Qt::Key_Right, gr, SLOT(slotRight()), actionCollection(), "move_right" );
+ (void)new KAction( i18n("Trigger Action"), Qt::Key_Return, gr, SLOT(slotInput()), actionCollection(), "move_trigger" );
+}
+
+void KBBGame::slotResize()
+{
+ setMinSize();
+ gameResize();
+}
+
+#include "kbbgame.moc"
diff --git a/kblackbox/kbbgame.h b/kblackbox/kbbgame.h
new file mode 100644
index 00000000..70f6ad48
--- /dev/null
+++ b/kblackbox/kbbgame.h
@@ -0,0 +1,104 @@
+//
+//
+// KBlackBox
+//
+// A simple game inspired by an emacs module
+//
+// File: kbbgame.h
+//
+// The definition of the KBBGame widget
+//
+
+#ifndef KBBGAME_H
+#define KBBGAME_H
+
+#include "kbbgfx.h"
+#include "util.h"
+
+#include <kmainwindow.h>
+#include <krandomsequence.h>
+
+class KSelectAction;
+class KToggleAction;
+
+/*
+ Types of the boxes (used f.e.g. in the traceRay() method)
+*/
+
+#define OUTERBBT 0
+#define INNERBBT 1
+#define LASERBBT 2
+#define BALLBBT 3
+
+/*
+ Ray-tracing results.
+*/
+
+#define WRONGSTART -1
+#define DETOUR 0
+#define REFLECTION 1
+#define HIT 2
+
+/*
+ * Statusbar IDs.
+ */
+#define SSCORE 0
+#define SBALLS 1
+#define SRUN 2
+#define SSIZE 3
+
+class KBBGame : public KMainWindow
+{
+ Q_OBJECT
+public:
+ KBBGame();
+ ~KBBGame();
+
+signals:
+ void gameRuns( bool );
+
+private slots:
+ void slotSize();
+ void slotBalls();
+
+ void tutorialSwitch();
+
+ void newGame();
+
+ bool setSize( int w, int h );
+ bool setBalls( int n );
+ void setMinSize();
+ void randomBalls( int n );
+ void slotResize();
+ void gameResize();
+ void setScore( int n );
+ void updateStats();
+ void gameFinished();
+ void abortGame();
+ void giveUp();
+ void gotInputAt( int col, int row, int state );
+
+private:
+ int traceRay( int startX, int startY, int *endX, int *endY );
+ void remap( RectOnArray *gam, RectOnArray *gra );
+ void getResults();
+ void initKAction();
+
+ int balls;
+ int detourCounter;
+ int ballsPlaced;
+ bool running;
+ bool tutorial;
+ RectOnArray *gameBoard;
+ KBBGraphic *gr;
+
+ int score;
+ /* QLabel *scoreText;
+ QLabel *statusText;*/
+ KRandomSequence random;
+
+ KSelectAction *ballsAction, *sizeAction;
+ KToggleAction *tutorialAction;
+};
+
+#endif // KBBGAME_H
diff --git a/kblackbox/kbbgfx.cpp b/kblackbox/kbbgfx.cpp
new file mode 100644
index 00000000..d37edc1e
--- /dev/null
+++ b/kblackbox/kbbgfx.cpp
@@ -0,0 +1,473 @@
+//
+//
+// KBlackBox
+//
+// A simple game inspired by an emacs module
+//
+// File: kbbgfx.cpp
+//
+// The implementation of the KBBGraphic widget
+//
+
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qcolor.h>
+#include <qkeycode.h>
+#include <qwmatrix.h>
+
+#include "kbbgfx.h"
+#include "util.h"
+
+/*
+ Constructs a KBBGraphic widget.
+*/
+
+KBBGraphic::KBBGraphic( QPixmap **p, QWidget* parent, const char* name )
+ : QWidget( parent, name )
+{
+ int i;
+
+ curRow = curCol = 0;
+ setFocusPolicy( NoFocus );
+ setBackgroundColor( gray );
+ setCellWidth( CELLW ); // set width of cell in pixels
+ setCellHeight( CELLH ); // set height of cell in pixels
+ setMouseTracking( FALSE );
+
+ pix = p;
+ if (pix == NULL) pixScaled = NULL;
+ else {
+ pixScaled = new QPixmap * [NROFTYPES];
+ for (i = 0; i < NROFTYPES; i++) {
+ pixScaled[i] = new QPixmap;
+ }
+ }
+ graphicBoard = NULL;
+ drawBuffer = NULL;
+}
+
+/*
+ Destructor: deallocates memory for contents
+*/
+
+KBBGraphic::~KBBGraphic()
+{
+ int i;
+
+ if (pix != NULL) {
+ for (i = 0; i < NROFTYPES; i++) {
+ delete pix[i];
+ }
+ delete pix;
+ }
+ if (pixScaled != NULL) {
+ for (i = 0; i < NROFTYPES; i++) {
+ delete pixScaled[i];
+ }
+ delete pixScaled;
+ }
+ delete graphicBoard;
+ delete drawBuffer;
+}
+
+/*
+ Sets the size of the table
+*/
+
+void KBBGraphic::setSize( int w, int h )
+{
+ if ((w != numCols) || (h != numRows)) {
+ delete graphicBoard;
+ graphicBoard = new RectOnArray( w, h );
+ graphicBoard->fill( OUTERBBG );
+ setNumCols( w );
+ setNumRows( h );
+ setCellWidth( CELLW );
+ setCellHeight( CELLH );
+ minW = cellW * numRows;
+ minH = cellH * numCols;
+ emit(sizeChanged());
+ }
+}
+
+void KBBGraphic::setCellWidth( int w )
+{
+ cellW = w;
+}
+
+void KBBGraphic::setCellHeight( int h )
+{
+ cellH = h;
+}
+
+void KBBGraphic::setNumRows( int rows )
+{
+ numRows = rows;
+}
+
+void KBBGraphic::setNumCols( int cols )
+{
+ numCols = cols;
+}
+
+/*
+ Scales all pixmaps to desired size.
+*/
+
+void KBBGraphic::scalePixmaps( int w, int h )
+{
+ int i, w0, h0;
+ QWMatrix wm;
+
+ w0 = pix[0]->width();
+ h0 = pix[0]->height();
+ wm.scale( (float) w / (float) w0, (float) h / (float) h0 );
+ for (i = 0; i < NROFTYPES; i++) {
+ *pixScaled[i] = pix[i]->xForm( wm );
+ }
+}
+
+/*
+ Returns the sizes of the table
+*/
+
+int KBBGraphic::numC() { return numCols; }
+int KBBGraphic::numR() { return numRows; }
+int KBBGraphic::width() { return cellW * numRows; }
+int KBBGraphic::height() { return cellH * numCols; }
+int KBBGraphic::wHint() const { return minW; }
+int KBBGraphic::hHint() const { return minH; }
+QSize KBBGraphic::sizeHint() const { return QSize(wHint(), hHint()); }
+
+/*
+ Returns a pointer to graphicBoard
+*/
+
+RectOnArray *KBBGraphic::getGraphicBoard() { return graphicBoard; }
+
+/*
+ Handles cell painting for the KBBGraphic widget.
+*/
+
+void KBBGraphic::paintCell( QPainter* p, int row, int col )
+{
+ if (pix == NULL) paintCellDefault( p, row, col );
+ else paintCellPixmap( p, row, col );
+}
+
+void KBBGraphic::paintCellPixmap( QPainter* p, int row, int col )
+{
+ int w = cellW;
+ int h = cellH;
+ int x2 = w - 1;
+ int y2 = h - 1;
+ int type;
+ QPixmap pm;
+
+ // kdDebug(12009) << p->viewport().width() << endl;
+
+ switch (type = graphicBoard->get( col, row )) {
+ case MARK1BBG: pm = *pixScaled[MARK1BBG]; break;
+ case OUTERBBG: pm = *pixScaled[OUTERBBG]; break;
+ case INNERBBG: pm = *pixScaled[INNERBBG]; break;
+ case LASERBBG: pm = *pixScaled[LASERBBG]; break;
+ case LFIREBBG: pm = *pixScaled[LFIREBBG]; break;
+ case FBALLBBG: pm = *pixScaled[FBALLBBG]; break;
+ case TBALLBBG: pm = *pixScaled[TBALLBBG]; break;
+ case WBALLBBG: pm = *pixScaled[WBALLBBG]; break;
+ default: pm = *pixScaled[OUTERBBG];
+ }
+ // kdDebug(12009) << pm.width() << " " << w << endl;
+ p->drawPixmap( 0, 0, pm );
+ // bitBlt( this, col * w, row * h, &pm );
+
+ p->setPen( black );
+
+ if (type == INNERBBG) {
+ p->drawLine( x2, 0, x2, y2 ); // draw vertical line on right
+ p->drawLine( 0, y2, x2, y2 ); // draw horiz. line at bottom
+ p->drawLine( 0, 0, x2, 0 );
+ p->drawLine( 0, 0, 0, y2 );
+ }
+
+ /*
+ Extra drawings for boxes aroud lasers.
+ */
+ QString s;
+ switch (type) {
+ case RLASERBBG:
+ s.sprintf( "%c", 'R' );
+ p->drawText( 1, 1, x2-1, y2-1, AlignCenter, s );
+ break;
+ case HLASERBBG:
+ s.sprintf( "%c", 'H' );
+ p->drawText( 1, 1, x2-1, y2-1, AlignCenter, s );
+ break;
+ }
+ if (type < 0) {
+ s.sprintf( "%d", -type );
+ p->drawText( 1, 1, x2-1, y2-1, AlignCenter, s );
+ }
+
+ /*
+ Draw extra frame inside if this is the current cell.
+ */
+ p->setPen( yellow );
+ if ( (row == curRow) && (col == curCol) ) { // if we are on current cell,
+ if ( hasFocus() ) {
+ p->drawRect( 0, 0, x2, y2 );
+ }
+ else { // we don't have focus, so
+ p->setPen( DotLine ); // use dashed line to
+ p->drawRect( 0, 0, x2, y2 );
+ p->setPen( SolidLine ); // restore to normal
+ }
+ }
+}
+
+void KBBGraphic::paintCellDefault( QPainter* p, int row, int col )
+{
+ int w = cellW;
+ int h = cellH;
+ int x2 = w - 1;
+ int y2 = h - 1;
+ int type;
+ QColor color;
+
+ switch (type = graphicBoard->get( col, row )) {
+ case MARK1BBG: color = darkRed; break;
+ case OUTERBBG: color = white; break;
+ case INNERBBG: color = gray; break;
+ case LASERBBG: color = darkGreen; break;
+ case LFIREBBG: color = green; break;
+ case FBALLBBG: color = red; break;
+ case TBALLBBG: color = blue; break;
+ case WBALLBBG: color = cyan; break;
+ default: color = white;
+ }
+ p->fillRect( 0, 0, x2, y2, color );
+
+ p->setPen( black );
+ p->drawLine( x2, 0, x2, y2 ); // draw vertical line on right
+ p->drawLine( 0, y2, x2, y2 ); // draw horiz. line at bottom
+
+ /*
+ Extra drawings for boxes aroud lasers.
+ */
+ QString s;
+ switch (type) {
+ case RLASERBBG:
+ s.sprintf( "%c", 'R' );
+ p->drawText( 1, 1, x2-1, y2-1, AlignCenter, s );
+ break;
+ case HLASERBBG:
+ s.sprintf( "%c", 'H' );
+ p->drawText( 1, 1, x2-1, y2-1, AlignCenter, s );
+ break;
+ }
+ if (type < 0) {
+ s.sprintf( "%d", -type );
+ p->drawText( 1, 1, x2-1, y2-1, AlignCenter, s );
+ }
+
+ /*
+ Draw extra frame inside if this is the current cell.
+ */
+ if ( (row == curRow) && (col == curCol) ) { // if we are on current cell,
+ if ( hasFocus() ) {
+ p->drawEllipse( 1, 1, x2-2, y2-2 ); // draw ellipse
+ }
+ else { // we don't have focus, so
+ p->setPen( DotLine ); // use dashed line to
+ p->drawEllipse( 1, 1, x2-2, y2-2 ); // draw ellipse
+ p->setPen( SolidLine ); // restore to normal
+ }
+ }
+}
+
+/*
+ Xperimantal...
+*/
+
+void KBBGraphic::paintEvent( QPaintEvent* )
+{
+ int i, j;
+ QPainter paint( drawBuffer );
+
+ // kdDebug(12009) << drawBuffer->width() << endl;
+ for (i = 0; i < numRows; i++) {
+ for (j = 0; j < numCols; j++) {
+ paint.setViewport( j * cellW, i * cellH, width(), height() );
+ paintCell( &paint, i, j );
+ }
+ }
+ bitBlt( this, 0, 0, drawBuffer );
+}
+
+/*
+ Resize event of the KBBGraphic widget.
+*/
+
+void KBBGraphic::resizeEvent( QResizeEvent* )
+{
+ int w = QWidget::width();
+ int h = QWidget::height();
+ int wNew, hNew;
+
+ // kbDebug() << w << " " << h << " " << minW << " " << minH << endl;
+ if (w > minW) {
+ wNew = w / numC();
+ } else {
+ wNew = CELLW;
+ }
+ if (h > minH) {
+ hNew = h / numR();
+ } else {
+ hNew = CELLH;
+ }
+ if (pix != NULL) scalePixmaps( wNew, hNew );
+ setCellWidth( wNew );
+ setCellHeight( hNew );
+
+ delete drawBuffer;
+ drawBuffer = new QPixmap( cellW * numRows, cellH * numCols );
+}
+
+/*
+ Handles mouse press events for the KBBGraphic widget.
+*/
+void KBBGraphic::mousePressEvent( QMouseEvent* e )
+{
+ if (inputAccepted) {
+ /*
+ * Middle click finishes the game.
+ */
+ if (e->button() == MidButton) {
+ emit endMouseClicked();
+ return;
+ }
+ int oldRow = curRow;
+ int oldCol = curCol;
+ QPoint pos = e->pos(); // extract pointer position
+ curRow = pos.y() / cellH;
+ curCol = pos.x() / cellW;
+ //kdDebug(12009) << e->state() << " " << LeftButton << " " << e->state()&LeftButton << endl;
+ updateElement( oldCol, oldRow );
+ emit inputAt( curCol, curRow, e->button() );
+ }
+}
+
+
+/*
+ Handles mouse move events for the KBBGraphic widget.
+*/
+
+void KBBGraphic::mouseMoveEvent( QMouseEvent* e ) {
+ if (inputAccepted) {
+ int oldRow = curRow;
+ int oldCol = curCol;
+ QPoint pos = e->pos(); // extract pointer position
+ int movRow = pos.y() / cellH;
+ int movCol = pos.x() / cellW;
+ // kdDebug(12009) << movRow << " " << curRow << endl;
+ if ( (curRow != movRow) // if current cell has moved,
+ || (curCol != movCol) ) {
+ curRow = movRow;
+ curCol = movCol;
+ updateElement( oldCol, oldRow );
+ emit inputAt( curCol, curRow, e->state() );
+ }
+ }
+}
+
+void KBBGraphic::slotUp()
+{
+ if( curRow > 0 ) {
+ moveSelection( -1, 0 );
+ }
+}
+
+void KBBGraphic::slotDown()
+{
+ if( curRow < numRows-1 ) {
+ moveSelection( 1, 0 );
+ }
+}
+
+void KBBGraphic::slotLeft()
+{
+ if( curCol > 0 ) {
+ moveSelection( 0, -1 );
+ }
+}
+
+void KBBGraphic::slotRight()
+{
+ if( curCol < numCols-1 ) {
+ moveSelection( 0, 1 );
+ }
+}
+
+void KBBGraphic::slotInput()
+{
+ if ( !inputAccepted ) {
+ return;
+ }
+ emit inputAt( curCol, curRow, LeftButton );
+// updateElement( curCol, curRow );
+}
+
+void KBBGraphic::moveSelection(int drow, int dcol)
+{
+ if ( !dcol && !drow || !inputAccepted ) {
+ return;
+ }
+ curCol += dcol;
+ curRow += drow;
+ updateElement( curCol - dcol, curRow - drow );
+ updateElement( curCol, curRow );
+}
+
+/*
+ Handles focus reception events for the KBBGraphic widget.
+*/
+
+void KBBGraphic::focusInEvent( QFocusEvent* )
+{
+ repaint( FALSE );
+}
+
+
+/*
+ Handles focus loss events for the KBBGraphic widget.
+*/
+
+void KBBGraphic::focusOutEvent( QFocusEvent* )
+{
+ repaint( FALSE );
+}
+
+/*
+ Sets whether user input is processed or not.
+*/
+
+void KBBGraphic::setInputAccepted( bool b )
+{
+ inputAccepted = b;
+ if (b) setFocusPolicy( StrongFocus );
+ else setFocusPolicy( NoFocus );
+}
+
+/*
+ Updates the cell at (col,row).
+*/
+
+void KBBGraphic::updateElement( int col, int row )
+{
+ QPainter paint( this );
+
+ paint.setViewport( col * cellW, row * cellH, width(), height() );
+ paintCell( &paint, row, col );
+}
+
+#include "kbbgfx.moc"
diff --git a/kblackbox/kbbgfx.h b/kblackbox/kbbgfx.h
new file mode 100644
index 00000000..ae4d207c
--- /dev/null
+++ b/kblackbox/kbbgfx.h
@@ -0,0 +1,120 @@
+//
+//
+// KBlackBox
+//
+// A simple game inspired by an emacs module
+//
+// File: kbbgfx.h
+//
+// The definition of the KBBGraphic widget
+//
+
+#ifndef KBBGFX_H
+#define KBBGFX_H
+
+#include <qwidget.h>
+#include <qpixmap.h>
+
+#include "util.h"
+
+/*
+ Default size of a cell
+*/
+
+#define CELLW 32
+#define CELLH 32
+
+/*
+ Graphical types of the boxes
+*/
+
+#define OUTERBBG 0
+#define INNERBBG 1
+#define LASERBBG 2
+#define FBALLBBG 3
+#define TBALLBBG 4
+#define WBALLBBG 5
+#define MARK1BBG 6
+#define LFIREBBG 7
+
+/*
+ These have the same pixmaps as some of those above...
+*/
+
+#define RLASERBBG 8
+#define HLASERBBG 9
+
+#define NROFTYPES 8
+
+/*
+ Negative numbers are deflected lasers...
+*/
+
+class KBBGraphic : public QWidget
+{
+ Q_OBJECT
+public:
+ KBBGraphic( QPixmap** p=0, QWidget* parent=0, const char* name=0 );
+ ~KBBGraphic();
+
+ friend class KBBGame;
+
+ void setSize( int w, int h );
+ RectOnArray *getGraphicBoard();
+ int numC();
+ int numR();
+ int width();
+ int height();
+ int wHint() const;
+ int hHint() const;
+ void setCellWidth( int w );
+ void setCellHeight( int h );
+ void setNumRows( int rows );
+ void setNumCols( int cols );
+
+public slots:
+ void setInputAccepted( bool b );
+ void updateElement( int col, int row );
+ void slotUp();
+ void slotDown();
+ void slotLeft();
+ void slotRight();
+ void slotInput();
+
+signals:
+ void sizeChanged();
+ void inputAt( int, int, int );
+ void endMouseClicked();
+
+protected:
+ virtual QSize sizeHint() const;
+ void paintEvent( QPaintEvent* );
+ void mousePressEvent( QMouseEvent* );
+ void mouseMoveEvent( QMouseEvent* );
+ void focusInEvent( QFocusEvent* );
+ void focusOutEvent( QFocusEvent* );
+ void resizeEvent( QResizeEvent* e );
+
+ void moveSelection(int drow, int dcol);
+
+private:
+ void paintCell( QPainter* p, int row, int col );
+ void paintCellDefault( QPainter*, int row, int col );
+ void paintCellPixmap( QPainter*, int row, int col );
+ void scalePixmaps( int w, int h );
+ RectOnArray *graphicBoard;
+ int curRow;
+ int curCol;
+ bool inputAccepted;
+ int minW;
+ int minH;
+ int cellW;
+ int cellH;
+ int numCols;
+ int numRows;
+ QPixmap **pix;
+ QPixmap **pixScaled;
+ QPixmap *drawBuffer;
+};
+
+#endif // KBBGFX_H
diff --git a/kblackbox/kblackbox.desktop b/kblackbox/kblackbox.desktop
new file mode 100644
index 00000000..a599cec6
--- /dev/null
+++ b/kblackbox/kblackbox.desktop
@@ -0,0 +1,77 @@
+[Desktop Entry]
+GenericName=Blackbox Logic Game
+GenericName[be]=Лагічная гульня з чорнай скрыняй
+GenericName[bg]=Логическа игра
+GenericName[bn]=যুক্তির খেলা ব্ল্যাকবক্স
+GenericName[bs]=Logička igra "Crna kutija"
+GenericName[ca]=Joc de lògica Blackbox
+GenericName[cs]=Logická hra s černou skříňkou
+GenericName[cy]=Gêm Resymeg Blackbox
+GenericName[da]=Blackbox logikspil
+GenericName[de]=Logikspiel
+GenericName[el]=Παιχνίδι λογικής Blackbox
+GenericName[eo]=Divenlogika ludo
+GenericName[es]=Juego de lógica Blackbox
+GenericName[et]=Blackboxi loogikamäng
+GenericName[eu]=Blackbox joko logikoa
+GenericName[fa]=بازی Blackbox Logic
+GenericName[fi]=Logiikkapeli
+GenericName[fr]=Jeu de logique Blackbox
+GenericName[he]=משחק לוגיקה
+GenericName[hr]=Blackbox logička igra
+GenericName[hu]=Logikai
+GenericName[is]=Blackbox kænskuleikur
+GenericName[it]=Gioco di logica Blackbox
+GenericName[ja]=ブラックボックス論理ゲーム
+GenericName[km]=ល្បែង​តក្កវិជ្ជា Blackbox
+GenericName[ko]=블랙박스 논리 게임
+GenericName[lt]=Blackbox loginis žaidimas
+GenericName[lv]=Melnās kastes loģikas spēle
+GenericName[mk]=Логичка игра Blackbox
+GenericName[nb]=Logikkspillet Blackbox
+GenericName[nds]=Blackbox Logikspeel
+GenericName[ne]=कालोबाकस युक्तिसंगत खेल
+GenericName[nl]=Blackbox: Logisch spel
+GenericName[nn]=Logikkspelet Blackbox
+GenericName[pl]=Gra logiczna - Czarna skrzynka
+GenericName[pt]=Jogo de Lógica Caixa Preta
+GenericName[pt_BR]=Jogo lógico de Caixa Preta
+GenericName[ru]=Чёрный ящик
+GenericName[se]=Logihkkaspeallu Blackbox
+GenericName[sk]=Blackbox logická hra
+GenericName[sl]=Logična igra Blackbox
+GenericName[sr]=Логичка игра црне кутије
+GenericName[sr@Latn]=Logička igra crne kutije
+GenericName[sv]=Svart låda logiskt spel
+GenericName[ta]=கறுப்புபெட்டி லாஜிக் விளையாட்டு
+GenericName[uk]=Гра на логіку (чорний ящик)
+GenericName[wa]=Djeu d' lodjike noere boesse
+GenericName[zh_TW]=黑盒子智力遊戲
+Exec=kblackbox %i %m -caption "%c"
+Name=KBlackBox
+Name[af]=Kblackbox
+Name[ar]=لعبة الصندوق الأسود (KBlackBox)
+Name[be]=Чорная скрыня
+Name[bn]=কে-ব্ল্যাকবক্স
+Name[hi]=के-ब्लेकबॉक्स
+Name[hu]=Fekete doboz
+Name[is]=Svarti kassinn
+Name[ne]=केडीई कालोबाकस
+Name[pa]=ਕੇ-ਬਲੈਕ ਬਾਕਸ
+Name[pl]=Czarna skrzynka
+Name[pt_BR]=KCaixa Preta
+Name[sv]=Kblackbox
+Name[ta]=கேகருப்பு பெட்டி
+Name[tg]=KҚуттии Сиёҳ
+Name[th]=กล่องดำ - K
+Name[tr]=Kara Kutu
+Name[uk]=Чорна скринька
+Name[zh_TW]=KBlackBox 黑盒子
+Icon=kblackbox
+Path=
+DocPath=kblackbox/index.html
+Type=Application
+Terminal=false
+X-KDE-StartupNotify=true
+X-DCOP-ServiceType=Multi
+Categories=Qt;KDE;Game;BoardGame;
diff --git a/kblackbox/kblackboxui.rc b/kblackbox/kblackboxui.rc
new file mode 100644
index 00000000..c7c2b634
--- /dev/null
+++ b/kblackbox/kblackboxui.rc
@@ -0,0 +1,24 @@
+<!DOCTYPE kpartgui>
+<kpartgui name="kblackbox" version="5">
+
+<MenuBar>
+ <Menu name="game"><text>&amp;Game</text>
+ <Action name="game_giveup" append="new_merge"/>
+ <Action name="game_done" append="new_merge"/>
+ <Separator/>
+ <Action name="game_resize" append="misc_merge"/>
+ </Menu>
+ <Menu name="settings"><text>&amp;Settings</text>
+ <Action name="options_size" append="save_merge"/>
+ <Action name="options_balls" append="save_merge"/>
+ <Action name="options_tutorial" append="save_merge"/>
+ </Menu>
+</MenuBar>
+
+<ToolBar name="mainToolBar" noMerge="1"><text>Main Toolbar</text>
+ <Action name="game_new"/>
+ <Action name="game_giveup"/>
+ <Action name="game_done"/>
+</ToolBar>
+
+</kpartgui>
diff --git a/kblackbox/main.cpp b/kblackbox/main.cpp
new file mode 100644
index 00000000..ba0db293
--- /dev/null
+++ b/kblackbox/main.cpp
@@ -0,0 +1,46 @@
+//
+// KBlackbox
+//
+// A simple game inspired by an emacs module
+//
+// File: main.cpp
+//
+// The main() function
+//
+
+
+#include <kapplication.h>
+#include <klocale.h>
+#include <kcmdlineargs.h>
+#include <kaboutdata.h>
+
+#include "kbbgame.h"
+#include "version.h"
+
+
+static const char description[] = I18N_NOOP("KDE Blackbox Game");
+
+/*
+ The program starts here.
+*/
+
+int main( int argc, char **argv )
+{
+ KAboutData aboutData( "kblackbox", I18N_NOOP("KBlackBox"),
+ KBVERSION, description, KAboutData::License_GPL,
+ "(c) 1999-2000, Robert Cimrman");
+ aboutData.addAuthor("Robert Cimrman",0, "cimrman3@students.zcu.cz");
+ KCmdLineArgs::init( argc, argv, &aboutData );
+
+ KApplication a;
+ KGlobal::locale()->insertCatalogue("libkdegames");
+
+ if (a.isRestored())
+ RESTORE(KBBGame)
+ else {
+ KBBGame *w = new KBBGame;
+ a.setMainWidget(w);
+ w->show();
+ }
+ return a.exec();
+}
diff --git a/kblackbox/pics/Makefile.am b/kblackbox/pics/Makefile.am
new file mode 100644
index 00000000..bfc5d607
--- /dev/null
+++ b/kblackbox/pics/Makefile.am
@@ -0,0 +1,10 @@
+
+# add here all files
+pics_DATA = blue.xpm brown.xpm cyan.xpm gray.xpm green.xpm red.xpm white.xpm\
+ green2.xpm giveup.xpm done.xpm
+
+picsdir = $(kde_datadir)/kblackbox/pics
+
+# extra files for "make dist"
+EXTRA_DIST = $(pics_DATA)
+
diff --git a/kblackbox/pics/blue.xpm b/kblackbox/pics/blue.xpm
new file mode 100644
index 00000000..fca9f04c
--- /dev/null
+++ b/kblackbox/pics/blue.xpm
@@ -0,0 +1,199 @@
+/* XPM */
+static char *blue[] = {
+/* width height num_colors chars_per_pixel */
+" 48 48 144 2",
+/* colors */
+".. c #04021c",
+".# c #7476fc",
+".a c #3c3e3c",
+".b c #040284",
+".c c #2422bc",
+".d c #1412a4",
+".e c #3c3edc",
+".f c #acaefc",
+".g c #242224",
+".h c #3432cc",
+".i c #5c5afc",
+".j c #0402a4",
+".k c #04024c",
+".l c #1412bc",
+".m c #4c4ef4",
+".n c #9492fc",
+".o c #2c2ac4",
+".p c #cccafc",
+".q c #141214",
+".r c #545654",
+".s c #0c0aa4",
+".t c #3432e4",
+".u c #1c1abc",
+".v c #0c0a9c",
+".w c #04022c",
+".x c #8486fc",
+".y c #040294",
+".z c #1c1ab4",
+".A c #3c3eec",
+".B c #bcbefc",
+".C c #343234",
+".D c #6c6afc",
+".E c #04026c",
+".F c #a4a2fc",
+".G c #dcdafc",
+".H c #0c0ab4",
+".I c #4c4a4c",
+".J c #3c3adc",
+".K c #2c2ad4",
+".L c #646264",
+".M c #1c1acc",
+".N c #1412b4",
+".O c #3432dc",
+".P c #0406b4",
+".Q c #4c4aec",
+".R c #0c0a0c",
+".S c #7c7efc",
+".T c #b4b6fc",
+".U c #2c2a2c",
+".V c #6462fc",
+".W c #0406a4",
+".X c #04025c",
+".Y c #1416bc",
+".Z c #5456fc",
+".0 c #9c9afc",
+".1 c #d4d2fc",
+".2 c #1c1a1c",
+".3 c #0c0ea4",
+".4 c #3c3ae4",
+".5 c #1c1ebc",
+".6 c #04023c",
+".7 c #2426cc",
+".8 c #040694",
+".9 c #4442ec",
+"#. c #444644",
+"## c #04068c",
+"#a c #1416ac",
+"#b c #4442e4",
+"#c c #3436d4",
+"#d c #2c2ecc",
+"#e c #5c5e5c",
+"#f c #4446f4",
+"#g c #8c8efc",
+"#h c #c4c6fc",
+"#i c #3c3a3c",
+"#j c #7472fc",
+"#k c #04027c",
+"#l c #acaafc",
+"#m c #e4e2fc",
+"#n c #0c0eb4",
+"#o c #545254",
+"#p c #2c2ed4",
+"#q c #6c6a6c",
+"#r c #040224",
+"#s c #7c7afc",
+"#t c #444244",
+"#u c #04028c",
+"#v c #2422c4",
+"#w c #1412ac",
+"#x c #3c3ee4",
+"#y c #242624",
+"#z c #3432d4",
+"#A c #5c5efc",
+"#B c #0402ac",
+"#C c #040254",
+"#D c #4c4efc",
+"#E c #9496fc",
+"#F c #2c2acc",
+"#G c #cccefc",
+"#H c #141614",
+"#I c #5c5a5c",
+"#J c #4446ec",
+"#K c #0c0aac",
+"#L c #3436e4",
+"#M c #1c1ac4",
+"#N c #0c0e9c",
+"#O c #040234",
+"#P c #2422d4",
+"#Q c #8c8afc",
+"#R c #04029c",
+"#S c #1c1eb4",
+"#T c #3c3ef4",
+"#U c #c4c2fc",
+"#V c #343634",
+"#W c #6c6efc",
+"#X c #040274",
+"#Y c #a4a6fc",
+"#Z c #dcdefc",
+"#0 c #4c4e4c",
+"#1 c #1c1ecc",
+"#2 c #1416b4",
+"#3 c #3436dc",
+"#4 c #8482fc",
+"#5 c #bcbafc",
+"#6 c #0c0e0c",
+"#7 c #2c2e2c",
+"#8 c #6466fc",
+"#9 c #9c9efc",
+"a. c #d4d6fc",
+"a# c #1c1e1c",
+"aa c #4c4af4",
+"ab c #2426c4",
+"ac c #0406ac",
+"ad c #040264",
+"ae c #1416c4",
+"af c #0c0eac",
+"ag c #3c3aec",
+"ah c #1c1ec4",
+"ai c #040244",
+"aj c #2426d4",
+"ak c #04069c",
+"al c #4442f4",
+"am c #0c0ebc",
+"an c #2c2edc",
+/* pixels */
+".I.C.Ua#.C#0#i.2#H.q#y#i#t.U.g#H.g#7.R.U#i#V#i#t#7a#.g.g#V#y#7.g#i#.#0#7#o.g.2a##y.R#i#.#0.U.g.2",
+"#.#H.g#0a#.I.ga#.2#7.I.U.U#y#.a##t.U#7#7a#.2a##7#t#o#i#ya#.C.2#V.a.U.C#i.2#Va#.q#7.a.I.I#V#y.g#.",
+".C.C#6#i#H#t#Va#.U#.#e#V#H.g.I#H#q.a#i.C#y.U.2#H#y#0#e#..g#H#H.2a##7#6.g#V#o#t#7#7.C#..I.2#y.q#7",
+"a##ia##7#V#7#ia##t.L.L#o.U#Va##V#e.C.kad#X.b#u.y#u#u.b#u.b#k.X#V#..I#H.R.r#..ra#.qa#.g#i#y#i.Ua#",
+"#t.g.C#V.Ia##6.2.a.C.C.a#V.2#7.Cadad.E#k#k.b.E#X#X#k.b#u.y#u#u#u.b.C#6.U#e.I.C.2#H#y#7#V#V.a.Ca#",
+"#.#H#o#t#y#t.g.2#y#y#y#Va#.gad.E.b.b.y.y#R#R.y#R.y#R.y.y.b.b#u#R.y#u.b.a.I.I#y.q.U.C.Ua#.U#..g.U",
+".I.U#0#0.C#0#Va##7.g#y#7.kad#X#k.b.y#u#k#k.b.y#R#R#Bac#B.j#u.b.y.j.j.y#k.b#V.aa#.2.U#7.a.2#H#7.r",
+"#0#6#o#oa##0#i.U.2.g#0.k#Xad.E#X#k#k#k.b#k.b.b.b.b.b#Rac.P#B#R.b#B#B.j.j#R#u.L.g.U#H#7#i.C#7.2.C",
+"#..U.U.U.C.C#7#0#7.g.X.Ead#X#X#k.b.b#u.b#u.y.b#u#Ram#1#P.l#B#R#u#uamac#R.j.j#k.g#H.2#V.I.Ca#a#.2",
+".I.I#.#y#0#0#i#7#.#C.E.E.E#X#k#k.b#u#u#u#u#u.y#R.K.9.tae#B#R.y#u#R.jam#B#B.j#R.b.C#6.2.a.U#H.q.C",
+".g#0#o#..C#0#V.U.kad#k#X#k.b.b.b.y.y.y#u.y.y.jac#A#W.H.y#R#B.jam.K.Haeam#B#R#R#R.ba#.R#y#6.I#V.g",
+".U.2#V#7a#.g.g.k.k.X.E#X#k.b#u#u.y.y.y.W.Y.u.4#W.K#R.j#4.T#A#8ag#A#L#Pae.P#B#R#R.y.E#y#i#V#e.U#y",
+"a#.2#ya#.g.C#y#C#C.k#X#k.b#u#u.y.y#R.W#2ab.O.m.j.j#B#A.B#1#1.Paj.##Wanam#n#B#B.j.y#u#y.2.U.2.C#y",
+"a#a#.2#t#7.C.k.Xadad#X#k.b#k.b#u#Rak.W#R.j.jac#L.S#g#5am.j#R#R#B#B#Taaae.lam.P.j.y#u#X.Ua#.a#0#y",
+"a#.g#y#t#t#7ai.Ead#X#X#k.b#u#u#u.yak.j#n#v.K#dab#v#x#Dam.Ham#B.j#R#1.V.Kae#M.P.j#R#u#k#y.C#t.r#i",
+".g#y.U.g#.#O.k.X#X#k.b#k.b.y.y.yak.sac#F#w#2.z.5#v#pag#P#s.T.G#L.y#B.S.t#Mae.P#R#R#u#u#k#0#.#0.C",
+"#7.q#V#y.C#Cad.X#X.b.b#k#u.y#R#R.W.s#K.7#aak#2.c#F#L.t.Sa.#Ua.#j#R#Ral.A#n.H.H#R.y.y#u.b.C.r#e#i",
+".2a##i#V#O.kadad#k#u#u.b#uak#R.W.W.Y#F.5#N.s.dah.4.Z.i.F#m#G.T.B#B.jae.lac#n.l.j.y.y.b#uada##I.I",
+"#y.g#y#i.kai.X.E#k.b.b.b#u.yak#2.z.5#d.z.v#a.e#s.#.D#9#h#5#9#l#Y.M.P#M.H.P.Namac.y.y.b.b.E#6#..L",
+"#i#ia##o#C#Cad.E#X#k.b.b.b.b#uak.3#w.5.c#c#z.i.p#U#W.p.G.f#5#G.F#D.Y.M#n#Kac.j.P.y.y.y#u.b.q#.#o",
+"#7#o#H.a#C.E.Xad.E#X#X#u#u#u.8.8.v#N#w.c.##Q#E.B.x#5#Ua.#m#Z.1.f#D.M.H#B#B#R#R.j.j#R#R.y#ka##V#.",
+"#0.C#H#0.6.k#Cadad.E#X#k.b.yak.N.z#w#N#w#S#A#l#E#9#5#Y.T.p#5.1.G.xae.P.j.j.j#R.y#u#R.y.y.b.g#V#y",
+".2#y.2a#.6.6#Cadad.E#X.b#u.yaf#3#f.Q.3.3#Sab#5#E#l.x.D#9#l#E#Z#Y#Q#L.Ham.j.y#R.b.b.j.b.b.b.g#V#y",
+"#7.g.ga##O.kai.Xadad#k.b#u.s.A#j.S#A.d.v.z#a.f.0.n#s#8.p#Z.x.0#G.p.F#j.#ah.j#u#u#k#u#k.E.b.L.C#y",
+".2.R#H.U#r#Cai#C.X#C.E#X#u#n.c#8#4#Q#wak#N#b#5.0.m.m#9.p.G#Q.Q#x#J.J.Z.O.N.y.y#u.b.b#k.X#k.a#y.2",
+"a#.g.g.2..#Caiai.k#C.X#X#u#wak.c#E.x#j#A#4#E#W.e.h#Q.T.1.S#f#d#v.5.u#2.s#R.y.y.b.b.b#k.E.E.2.2a#",
+"#H#V#Va#.wadai.6.k.k#Cad.b.y.yak.caa.m#b.Q#p#S.z.D#4.#.x#8.O#J#J#z#paf#R.y.y.b.b.b#u#k.b#u.I.U#y",
+".U.U#V#y.kadai#O#C#C.Xad.b.8.b.b#u###u.v.3.d#a#c#L#c.zab.Z.V.V#A#L.O#n#R#R#u#u#u.y.y.y.b#k#y#6#V",
+".r#H.g#yaiai.X.6.k.Xad#C#kak.b.b#k.b.b#u#u#w.c#F.7ab.z#a.o.9.4.sak.s#nac.j.y#R.y#R#u.y#k.E#y.a.2",
+".C.U#6.2#r#O#Cai#C.X.X.X.E.W.b.b#k.b#u##akab.5.z#z#F.z.zab#aak#u.y.y#u.y#R.y#R#R#R#R#u#k.X.q.qa#",
+"#7.U#V#0.r#O.k#C.Xad.X#C.y.3.8#X#X.b#u#w.5.cak.8.v#aab#v#a.s#u#R#nak.y.b#u.y.y.y.y.y#k.E#Ha#.g#i",
+"#i.2.g#V#0.wai#C#C.X.Xad#u#u#k.E.E#k.y.3.v.8.b.8#u.8#N.3.s.3.W.N.u.Yac.y#u#u.y.y.y#u#X.X#i.U.C#I",
+"#i#y..#.#7#Vai#C.X#Cad.E#X#k#Xadad#k#u#u.8.b#u.v#wak.b.y.s#wafafaf.N#K#u#k.y#u#u.b.E#X#7.g#7#H#7",
+"a##ya#.aa#.2#r.6.k.Xad.E.Ead.E.Ead#X.b#u.3.y#k.b#w#2.3.s.3.s.s.W#Rak.y#k#k#u.b#X.Eadad#7#H.2.a#i",
+"#.#0.C.U#7#t#0.6#Oai.Xadad.Xad.Ead#k#k.bak.8#X#uak.s.s.Wakak.y.b#k#u#X.E#k#k#X.Ead#Ca#.q.a#7.g#V",
+".2.C#V#i#t#H.C#O.w#Oai#C#C#Cad#X#X.b.b.b.b.b#X#Xak.vakak#R.y#k#X#X#X.E.E#X#k#C.X.X.k#7.U.U#i.g.a",
+".2#ta#.g#o.C#7#6.6#O#Oai.k.k.X.E#X#X#k#X#X#X#X#kak.sakakak#R#X#X#X#X.Ead.Ead.Xad#C#e.g#7#7.g.q.C",
+".C#y.a.g.U#7.C.U.a..ai.6ai#C.X.Xadad.E#X#X#X.E#k#u.sak.yakak#R.y#u.Eadad#X#k.X.X#V.ra##i.a#H.2#y",
+"#i#y#y#ya#.a.C#H.a#V.w.6ai.k#C#C.Xadad.E.E#X#X#X#k.y.y#k.b#u.b.y#u#uadad#k#X.X#H.2#o#7.2.2#H#7#i",
+".a.2.2#.#V.2#V.q#0#0a#..#Oai.k.X.Xad.Eadad#X#k#u.b#k.X.Xadadad#k.b#k#Cad.k.k.aa#a##V#o#y#V.U#y.C",
+"#o#y#V.C.a.C.U#y.a.I#V#y#r.w.6ai.X.Xad.E.E.E.X#C.k#C.k#C.k#C.k#X.b.X.kai#O#.#i.U.I#V.a#y.U#..r#y",
+"#0.C#H.C.g#H.q.q#y.q.2#i#I#e#r.6.k#C#C.Xaiai.k.X#C.X.X#C#C.kai.Ead.k#O.a#V#7#0#o#.#H#i#i#y#o.I#0",
+"#i#7.ga#.a#V#7#H.U#V.C#6#i#..C.U#Oai#O#O#O.6aiad.E.X.k#C.k.6.X.k.6#H#7a##y#y.a#o.I.g#0.Ca##t.r#t",
+".g#6#0.I#y.q.U#t#7#y.U.a#y#H.U#V.a.g#r..#O.k#O.6.k.6ai.6#O.6#O.g.Ca##V#o#t#t.C#ta##i#i#7a##y#V#.",
+".2.U.ga#.g#ya##0#i.2.C.q#V#V#y.Ca##I#e.U#H.g#7#6#7#H.C#7.C#V#7a#.C.g.g.r.r#o#0.g.g#o.C#y.ga#.qa#",
+"#y#H.C.C.g.U.C#i#H.C.r.C#t#..U.2.a.r.r.a#7.2a#.2.C.C#H#H#H#t.2.2.U#y#y.g#.#o#7a#.ga##y.I.I.C.g#H",
+".C.Ua#.2#V#i#7.2a##7#.#t.2#q.aa##t#o#o#0.C.q#H#V#y#y.2.a#7a#.U#y#o.a.C#6.C#o#t#y.2.r#0#0.I#t.C.U",
+".Ua#.I#i#i#6#y#7#I.C#V.I#V#7a##H.U#H#i#y.2#H#i.L#t#t.C.q#t.g#i#V.a#I#.#i#i#..a#i#H#I#o#..g#V#7a#"
+};
diff --git a/kblackbox/pics/brown.xpm b/kblackbox/pics/brown.xpm
new file mode 100644
index 00000000..4ccd55fe
--- /dev/null
+++ b/kblackbox/pics/brown.xpm
@@ -0,0 +1,77 @@
+/* XPM */
+static char * image_name[] = {
+"48 48 26 1",
+" c #69A645141861",
+". c #514434D31040",
+"X c #30C220810820",
+"o c #41032CB21040",
+"O c #618541031861",
+"+ c #492430C21040",
+"@ c #59653CF31040",
+"# c #596538E31040",
+"$ c #28A21C710820",
+"% c #514438E31040",
+"& c #30C21C710820",
+"* c #61853CF31861",
+"= c #28A218610820",
+"- c #18610C300000",
+"; c #38E324920820",
+": c #186110400820",
+"> c #208114510820",
+", c #082004100000",
+"< c #104008200000",
+"1 c #410328A21040",
+"2 c #49242CB21040",
+"3 c #71C649241861",
+"4 c #38E328A21040",
+"5 c #69A649241861",
+"6 c #208118610820",
+"7 c #000000000000",
+" .Xo o O ++X+@+#@O.$%.. ##+&o*.=-$;:>-,<1..#+ ",
+"O2;O3# ##1o%O .##.oX*#@O.#.1&o#X1;.OX;%o+O@1+o@",
+"$::+#+#@%%X$+%#1;&4.+@#@@.*#.;#O;%1#*1o*.. #+",
+"&&$++411X$-<X+1;&1#@+41*@1+#.o@O;4X+@o+#.#*#@#1$",
+"..1++XX;&$$$@#1++.@+>=1%+;..o;+o>4o#O.++.##o##;o",
+"@;o*O#*@.%+X%.o##@@#+o* +;+%+;;4>o.@*+o+#oX>;;=.",
+"@1o%OO @.1>%*.#.+#@.#@ +o+++1.@+##OO#+@O%.1*@+O",
+"#;o.#@#.+.o1 5@##.o1X&1o;;+o+o#O+o#* .%O*.+oO *5",
+"XXo4++..1112 #+@++@%++o++ooo##++X&+@@++#ooo&+.1o",
+"1.%%@#OOo+2.*## ;1+o1++%1;4% #.@o;*O*+.#1o%+#+#+",
+"4o+@ @5*X+@@O@*OX1*;;o1%++%* @%O%1OO*.++o+#o%#*.",
+"o*#+#o%1:X+oo+++X;@&o+++1#O#+1&&X&+41o1+;o.%4o@#",
+"+ O#@1o+$+%4;+.%;1@X;.%#o11X11X&1X;1++++4211XXo1",
+".@+1*#@*1@O+##@+&1*;%@++X++1#@..*## 5@@.1@+;1+*%",
+"..XX+1+.&o%X4+%o$1.&+O1X=+##.+.@@+O @1o4=.12**O@",
+".@11%.+oX+1&+o14X#%X1%;+# *+.#%#oX++;=XX6%;1#+.+",
+"O 1o*.o;;.%o@*@#.OOX+%1o@O#+@ @%+1OO+o%#1O++@4.@",
+"%+;.*.1;+ @o.+.O*OO;. +%%*#.@ @#O# O.++@+@+o%Xo+",
+".+1.+o+o@ @1+2%%114:$#X;.#.+#%++##@+44;++@2+@;.@",
+"++1+X+@1**+;+1.#o.+>+O+. %+*#+%#..;1+;++.o#O1.@",
+"1+o+%o@o@@#2;&+#o.1&O oo#%+o+11%#+%X4.;1o%+.%$1+",
+"+#11o;++@+X;X$%*++1$#@;411o&1o+++X+X;1=$;o111&%.",
+".@1%@.O*O#%@2;##X+.X.%&$+%+&;.%o1;o&X%o12.1411##",
+"$1;##1+.#41%o>+#=;.X*@$X+#o;+**##%*11*o1+O@#%# +",
+"X+Xo;-=>$->;;-oO1@ 1O ;+ #+@ O%%#@1;.+;+O+...*+",
+"$#+@@+ @%;@ +X 3o*5+@@&.#@*1+#%+1o.1X%+o# +1+oo$",
+"X;$+@%** # 524 3o@@;#@X%@@@X+*%+o.%1o#.;%O;1#@O+",
+".*+ ##@@o%@$&++X2%&o+$+###&1*#..%*oo+.1#@4o*OO.",
+";o+5 #* O;@*X>++X1@12@X.*.@1.@;1+1o44o+;1+&;+++o",
+"X+o%+1.#.;.@&=O +2+;X%;+@o#o+#;;11o4X+o4++1++%%1",
+".#%#.+o++;+.>>o2&1@;XoX+%1o++%;#@.*@+@*.%#OO#O *",
+"o.+%.+o.#1.%X;#o&+@XX4;+@1+%+.+*@+@@%@*+@##O@@O*",
+"$>;+o2@@Oo+@.oO*# ;&@.##.#@%++@++@@@O*#@O O*@O#",
+"4;+*#O OO%.@+1@.%#@1X*#.@#* O%#@++#1o1XX14o+;1#.",
+"X;+@+%#@O%.@.4@@+.+oX.## @#%#++#%.#%@%+;++++X%#X",
+">>>&:$Xo#2+...OO+@*#+@OO5##O++..+o%@*O@+#@@@1.@>",
+"1+1+;.@+%X++1+#%11+;+.@++o+*.1.;+1o1o++4##o.1.@&",
+"1o+#+@*o1$$+4@%.%++X4o1;XX&X>>4=XXX;X1;>o#+*1#Oo",
+"oo.%;+@++oo@4++1%.%++#..+##%+o*++#@O.*.&oo;@+@O+",
+";++1$2*...*O2++2.11X1#@@4+@@..O@%@OO+%@;@*;o1.#X",
+"+%%1X@ @@#O5X@%@Oo1&1* %&+O*oo*@@@@.;# o* +@;XX;",
+"o;1;o@5@++##>4o1.111.@.X:+@1>6+++1+#+O +@*1.;111",
+".;;>>;.+1;.#<;+11;1++1X>-o+$6X+4;1+.X1+X11;%X#*#",
+" OO+11@@#% >#@%*#.+.+O+X* .%* @@ *%1.#+2;;@;;;.",
+" @1X22O @..@$*O.O##..+.>>#O#1.1@*O+1+@O.%;o@11o*",
+" @>&+;@#&;o+$@#1%+++++1:X* .X1$1++44#+%%@X1 #++ ",
+"o+:1@X@@o+@OoO@1o.++oo+=# %X.X@*.@*@#@@+>$.X>-X",
+"o=7:+=@*@O@#1#@o.#*1;o4XO5 *+#153%1%+;1X<7$%o1X."};
diff --git a/kblackbox/pics/cyan.xpm b/kblackbox/pics/cyan.xpm
new file mode 100644
index 00000000..591f9c90
--- /dev/null
+++ b/kblackbox/pics/cyan.xpm
@@ -0,0 +1,193 @@
+/* XPM */
+static char *cyan[] = {
+/* width height num_colors chars_per_pixel */
+" 48 48 138 2",
+/* colors */
+".. c #0c0a0c",
+".# c #048684",
+".a c #7cfefc",
+".b c #14c6c4",
+".c c #044a4c",
+".d c #4ceeec",
+".e c #04a6a4",
+".f c #34e2e4",
+".g c #0cb6b4",
+".h c #042a2c",
+".i c #4c4a4c",
+".j c #2cc6c4",
+".k c #2c2a2c",
+".l c #046a6c",
+".m c #b4fefc",
+".n c #1cb6b4",
+".o c #14a6a4",
+".p c #2cd6d4",
+".q c #049694",
+".r c #3cf2f4",
+".s c #041e1c",
+".t c #64fefc",
+".u c #24d2d4",
+".v c #5c5e5c",
+".w c #045a5c",
+".x c #04aeac",
+".y c #043a3c",
+".z c #3c3a3c",
+".A c #9cfefc",
+".B c #24c6c4",
+".C c #4cfefc",
+".D c #44e2e4",
+".E c #047a7c",
+".F c #d4fefc",
+".G c #1cbebc",
+".H c #3cdedc",
+".I c #049e9c",
+".J c #2ccecc",
+".K c #2cdedc",
+".L c #1c1a1c",
+".M c #545654",
+".N c #14aeac",
+".O c #141214",
+".P c #048e8c",
+".Q c #8cfefc",
+".R c #1ccecc",
+".S c #045254",
+".T c #0ca6a4",
+".U c #3ceaec",
+".V c #14b6b4",
+".W c #043234",
+".X c #343234",
+".Y c #047274",
+".Z c #c4fefc",
+".0 c #34d6d4",
+".1 c #046264",
+".2 c #0caeac",
+".3 c #044244",
+".4 c #444244",
+".5 c #5cfefc",
+".6 c #24bebc",
+".7 c #0c9e9c",
+".8 c #34cecc",
+".9 c #242224",
+"#. c #1cc6c4",
+"## c #3ce2e4",
+"#a c #545254",
+"#b c #24babc",
+"#c c #0c9a9c",
+"#d c #44eeec",
+"#e c #74fefc",
+"#f c #acfefc",
+"#g c #54fafc",
+"#h c #44eaec",
+"#i c #14bebc",
+"#j c #048284",
+"#k c #e4fefc",
+"#l c #1cb2b4",
+"#m c #0c0e0c",
+"#n c #048a8c",
+"#o c #84fefc",
+"#p c #044e4c",
+"#q c #4cf2f4",
+"#r c #04aaac",
+"#s c #34e6e4",
+"#t c #0cbabc",
+"#u c #042e2c",
+"#v c #4c4e4c",
+"#w c #2ccacc",
+"#x c #2c2e2c",
+"#y c #046e6c",
+"#z c #bcfefc",
+"#A c #1cbabc",
+"#B c #14aaac",
+"#C c #2cdadc",
+"#D c #049a9c",
+"#E c #042624",
+"#F c #6cfefc",
+"#G c #24d6d4",
+"#H c #646264",
+"#I c #045e5c",
+"#J c #04b2b4",
+"#K c #043e3c",
+"#L c #3c3e3c",
+"#M c #a4fefc",
+"#N c #24cacc",
+"#O c #047e7c",
+"#P c #dcfefc",
+"#Q c #1cc2c4",
+"#R c #04a2a4",
+"#S c #2cd2d4",
+"#T c #34dedc",
+"#U c #1c1e1c",
+"#V c #5c5a5c",
+"#W c #14b2b4",
+"#X c #141614",
+"#Y c #049294",
+"#Z c #94fefc",
+"#0 c #045654",
+"#1 c #0caaac",
+"#2 c #14babc",
+"#3 c #043634",
+"#4 c #343634",
+"#5 c #6c6a6c",
+"#6 c #ccfefc",
+"#7 c #0cb2b4",
+"#8 c #24c2c4",
+"#9 c #0ca2a4",
+"a. c #34d2d4",
+"a# c #1ccacc",
+"aa c #44f2f4",
+"ab c #14c2c4",
+"ac c #047674",
+"ad c #046664",
+"ae c #044644",
+"af c #444644",
+"ag c #242624",
+"ah c #54fefc",
+/* pixels */
+".i.X.k#U.X#v.z.L#X.Oag.z.4.k.9#X.9#x...k.z#4.z.4#x#U.9.9#4ag#x.9.zaf#v#x#a.9.L#Uag...zaf#v.k.9.L",
+"af#X.9#v#U.i.9#U.L#x.i.k.kagaf#U.4.k#x#x#U.L#U#x.4#a.zag#U.X.L#4#L.k.X.z.L#4#U.O#x#L.i.i#4ag.9af",
+".X.X#m.z#X.4#4#U.kaf.v#4#X.9.i#X#5#L.z.Xag.k.L#Xag#v.vaf.9#X#X.L#U#x#m.9#4#a.4#x#x.Xaf.i.Lag.O#x",
+"#U.z#U#x#4#x.z#U.4#H#H#a.k#4#U#4.v.X#p.1.Y#j.P#Y.P.##n.##j.E#I#4af.i#X...Maf.M#U.O#U.9.zag.z.k#U",
+".4.9.X#4.i#U#m.L#L.X.X#L#4.L#x.X.1.l.l#O#O.#.l.Yac.E.##n#Y#n.P.#.##4..#x#V.i.X.L#Xag#x#4#4#L.X#U",
+"af#X#a.4ag.4.9.Lagagag#4#Uag#I#y#j.##Y.q#D#D#Y#D#D.I#Y.q.#.##n.I#Y#n#j#L#v.iag.O.k.X.k#U.kaf.9.k",
+".i.k#v#v.X#v#4#U#x.9ag#x.cadacac#n.P#n#O#O.#.q#D#D#r.x.x.e.P.#.q#R.e.q.E.##4#L#U.L.k#x#L.L#X#x.M",
+"#v#m#a#a#U#v.z.k.L.9#v#p.Yad#yac.E#O#j#j#O#j.#.#.#.#.I#r#J.e.I#j.x.x#R#R#D.P#Hag.k#X#x.z.X#x.L.X",
+"af.k.k.k.X.X#x#v#x.9#0.lad#y.Y.E#j#j.#.#.P.P#n.P.q#t.R.uab#r#D.P.P#t#J.I.e.I#j.9#X.L#4.i.X#U#U.L",
+".i.iafag#v#v.z#xaf.S#y#y#yac.E#j.#.P.P#n.P.P.P#D.paa.fab#r.I#Y.P#D#R#t.x#r#R.I.#.X#m.L#L.k#X.O.X",
+".9#v#aaf.X#v#4#x.cad.Eac.E#j#j.##Y.q.q.P#Y#Y#R.x.5#F.2#D.I#r.e#t.K#t.b#t#r#D#R.q.##U..ag#m.i#4.9",
+".k.L#4#x#U.9.9ae.c#I#y.Y#O.##n.P.P.q.q.e#2#Q###F#C.I#R#o.m.5.t.U.5#s.uab#J#r.I#D.q.lag.z#4.v.kag",
+"#U.Lag#U.9.Xag#0.S#p#y.E#j#n.P#Y.q#D#R#W.B.0#q#R.I#r.5#za#a##J#G#e#F.K#t#t#r#r#R.q#nag.L.k.L.Xag",
+"#U#U.L.4#x.X#p#I.lad.Y.E.##j#j#Y#D#D#R#R#R.e#r#s.a.Q#z#t.e.I.I#r.x.r#q.b#i#t#J.e.q#n.Y.k#U#L#vag",
+"#U.9ag.4.4#xae.l.1.Y.E.E#j#n#n#n#Y.I#R.g.B.J#S#8.6##.C#t.g#t.x.I#D.R.t.K#i#.#J.e.q.P#jag.X.4.M.z",
+".9ag.kagaf.W#p.w#y#O#j.E.##Y#Y#D#D.T.e.J.N#W.n.G#8.p.U.u.a.m#P#s#D.e.a#T#.ab#J#R#D.P#nac#vaf#v.X",
+"#x.O#4ag.X.Sad#Iac.#.##j#n#D#D.I#R#1.2#N#B.I#W#8.J.f.f.a.F.Z.F#e#D.Iaa.U.g#7.g#D.q#Y#n#n.X.M.v.z",
+".L#U.z#4.W.c.1ad.E.##n#j.P#D.I.e.e#2#w#A.7#9.o#Q##ah.5#M#k#6.m#z#r.I.b#2.x.g#i.I#D#Y.##nad#U#V.i",
+"ag.9ag.z#pae.w.l#O#j#n.##n.P.I.N.n#A.J#l.7#B.H.a#e#F.A.Z#z.A#f#Ma##Ja#.g.x#2#t.x.q#Y.##j#y#maf#H",
+".z.z#U.M#p#0ad#yac.E#O.#.##n#n.q.T#B#A#b.0a..5#6.Z#F#6#P#f#z#6#M.Cab#..g#7.e.e.x.q#Y#D#n#O.Oaf#a",
+"#x#a#X#L.S.l.wad#y.Yac.##n#n#Y.q#c#9#B#b#e.Q#Z#z#o#z.Z.F#k#P.F#f.Ca#.g#r#r#R.I.e#R.I#D#Y#j#U#4af",
+"#v.X#X#v.y#p#0.1ad#yac#O.##Y.I.V.n.o#9.o.n.5#f#Z.A#z#M.m#6#z.F#P#o.b.x#r#R#R.q.q.P#D#Y#Y#j.9#4ag",
+".Lag.L#U.y.y.S.1.1.lac#O#n#D.2#T#d#q.7#9.n#8#z#Z#f#o#F.A#f#Z#P#M.Q#s#7#t#R#D.I.#.##R#n#j.#.9#4ag",
+"#x.9.9#U.W#p.c.wad.1#O#j.P.T.U#e.a.5.o.7#l#B#f.A#Z.a.t#6#P#o.A#6#6#M#e#ea##R.P#n#O#n.E#y.##H.Xag",
+".L..#X.k#E#0.3.S#I#0.lac.P.2.6.t#o.Q#B#D#c.D#z.A#q#q.A#6#P.Q.d###h.Hah.0#W.q.P.P.##j.E#I.E#Lag.L",
+"#U.9.9.L.s#0ae#K#p#0#I.Y.P#B#D.6#Z#o#e.5#o#Z#F.H.8.Q.m.F.aaa.J#8#A.G#W.T#D.q#Y.##j#j.E#y.l.L.L#U",
+"#X#4#4#U.h.1ae#K.c#p#0ad#j#D#Y.I#b#q.d#h.d.J.n#l#F#o#e#o.t#T#h#d.0#S.2#D#Y#Y#n#j.#.P#O#j.P.i#xag",
+".k.k#4ag.cad.3#3.S#0.w.1#j.q.##O#n#Y#n#c.7.o.N.0#T.0#l#8#g.t.t.5.f#T#7#R#D#Y#n.P#Y.q#Y#j.Eag#m#4",
+".M#X.9ag.3ae#0#K.c#0.1.w.E#D.##j#j#j.##n.P#B.6#w#N.B.n#B.j#h.H.T#D#9#7#r#R.q.q.q#D.P#Y#O#yag.z.L",
+".X.k#m.L#E.W.w.3#0.1#I#0#y#R.##j.E.##n.P#D#8.G.na.#w#l.n.B.N#D#Y#Y#Y#Y#Y.I.q#D#D#D#D#n#O.w#X.O#U",
+"#x.k#4#v.M#u.c#0.w.1#I#0#Y.T#Yacac#j.P.N#A.6#D#Y#c.N#8#8.N.7#Y#D#7.I.P#n#n#Y.q#Y.q#Y#O.l#X#U.9.z",
+".z.L.9#4#v.h.c.S.S#I.w.1.P#n#j.l.l.E#Y.T.7.P.#.q#Y#Y.7#1#9.T.I#W.G#i#r.q.#.P.q.q#Y#nac.w.z.k.X#V",
+".zag...4#x#4#K.S.w.w.1#yac#O#yadad.E#n.P#Y#j.P#c.N.q#n.P#9.N.2#1.2#W.2.P.E#Y#n.P#n#yac#x.9#x#X#x",
+"#U.9.L#L#U.L#E#K#p.wad#y.l.1.l.l.1.E#j.P.T#Y.E.##B#W.T#9.T.T.T#R.I.I#Yac#j#n.#ac.lad#I#x#X#U#L.z",
+"af#v#x.k#x.4#a#K.W.3.wad.1#Iad.ladac#O#j#D#Dac#n#D.T#9#R#R#D#Y.#ac#n.E#y.E#O.Y.lad.S#U#X.z#x.9#4",
+".L.X.z.zaf#X#x.W#u#3.3.S.S#0.1acac#j.##j.##jac.E#D.7.I#D#D.P#Oac.Yac.l.lacac.w.w.w.c#x.k#x.z.9#L",
+".L.4#U#U#a.X.X#m#3.W#3ae.c.S.w.l.Yac.Eacac.Y.Y.E#D.T.I#D.I.I.Y.Y.E.Y.lad#yad.w.1#0.v.9#x#x.9.O.X",
+".Xag#Lag.k#x.Xag.4.s#K#Kae#0.w.1.1ad#y#y.Yac#y.E.P#9.I.q.I#D.I.q.##y.1ad.Yac#I.w#4.M#U.z.z#X.Lag",
+".zag.9ag.L#L.X.L#L#4.h.yae.c.S#0#I.1ad.l#y#yac.Y#O#Y#Y#O.##n.##Y#Y#n.l.1.E.Y.w#X.L#a#x.L#U#X#x.z",
+".4.L#X.i#4#U#4.O#v#v.9.s#3.3.c#0#Iad.ladadac.E#n.##O#I.w.1.1ad#O#j#O.S.1#p.S#L#U#U#4#aag.X.kag.X",
+"#aag.z.X#L.Xagag#Laf#4ag.s.W.yae.w#I.1.l#y.l.1.S#p#p#p.S#p.S#pac#j.w.c.3#3af.z.k.i#4#Lag.kaf.Mag",
+"#v.X#X#x.9.L#X.O.9#X.L#4.v.v#E#K.c.S.w.waeaeae.w#0#I.w.S#0.cae.ladae.y#L#4#x#v.Maf#X.z.zag#a.i#v",
+".z#x.9#U#L#4.k#X#x#4.X#m.zaf.X#x.W.3#3.W#3#3.cad#y.w.S#p.c#K.w#p.y#X#x#Uagag#L#a.i.9#v.X#Uaf.M.4",
+".9#m#v.iag.Oag.4#xagag.4ag#X.k#4#Lag#E.s.W#p.W.y.c#K.3.y.y.y.W.9#4#U#4#a.4.4.X.4#U.z.z#x#Uag#4af",
+".L.k.9#U.9.k#U#a.z#U.X.O.X#4ag.X#U#V.v.k#X.9#x#m#x#X#4#x.X#4#x#U.X.9.9.M.M#a.i.9ag#a.Xag.9#U.O#U",
+"ag#X.X.Xagag.X#4.L.X#a.X.4af.k.L#L.M.M#L#x.L#U.L#4.X.O#X#X.4#U.L.kagag.9af#a#x#U.9#Uag.i.i.X.9#X",
+".X.k#U.L#4.z.X.L#U#xaf.4.L#5#L#U.4#a#a.i#4.O#X#4agag.L#L#x#U.k.9.M#L.X#m.X#a.4ag.L#a#v#v.i.4.X.k",
+".k#U.i.z.z#mag#x.M.X#4.i#4#x#U#X.k.O.zag.L#X.z#H.4.4.X.O.4.9.z#4#L#Vaf#L.zaf#L.z#X.v#aaf.9#4#x#U"
+};
diff --git a/kblackbox/pics/done.xpm b/kblackbox/pics/done.xpm
new file mode 100644
index 00000000..218de4e2
--- /dev/null
+++ b/kblackbox/pics/done.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * done_xpm[] = {
+"26 26 4 1",
+" c None",
+". c #000000000000",
+"X c #C71B9E799E79",
+"o c #861786178617",
+" ",
+" ",
+" ",
+" .. ",
+" .X. ",
+" .Xo. ",
+" .Xo. ",
+" .XX. ",
+" .XX. ",
+" .XX. ",
+" ..XX. ",
+" ......XXX. ",
+" .XXX.XoXXXX. ",
+" .XXXX.XoXXXXX. ",
+" .....XXoXXXXXX...... ",
+" .XXXX.XoXXXXXXoXXXX. ",
+" .XXXX.XXoXXXXoXXXXX. ",
+" .....XXXXooooXXXoXX. ",
+" .XXXX.XXXXXXXXXoXXX. ",
+" .XXXX.XXoXXXXXoXXX. ",
+" .....XXoXXXX....... ",
+" .XXXX.XoXX.. ",
+" ......... ",
+" ",
+" ",
+" "};
diff --git a/kblackbox/pics/giveup.xpm b/kblackbox/pics/giveup.xpm
new file mode 100644
index 00000000..4c67802a
--- /dev/null
+++ b/kblackbox/pics/giveup.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char * giveup_xpm[] = {
+"22 21 4 1",
+" c None",
+". c #000000000000",
+"X c #B6DA8E388617",
+"o c #FFFFFFFFFFFF",
+" ",
+" .. ",
+" .X.... ",
+" .XX.ooo. ",
+" .X.ooooo. ",
+" .X.oooooo... ",
+" .XX.ooooooooo. ",
+" .X.ooooooooooo. ",
+" .X.oooooooooooo. ",
+" .XX.oooooooooooo. ",
+" .X. ....oooooooo. ",
+" .X. .ooooooo. ",
+" .X. .ooooo. ",
+" .XX. ...oo. ",
+" .X. .o. ",
+" .X. . ",
+" .XX. ",
+" .X. ",
+" .. ",
+" ",
+" "};
diff --git a/kblackbox/pics/gray.xpm b/kblackbox/pics/gray.xpm
new file mode 100644
index 00000000..913b3afc
--- /dev/null
+++ b/kblackbox/pics/gray.xpm
@@ -0,0 +1,150 @@
+/* XPM */
+static char *gray[] = {
+/* width height num_colors chars_per_pixel */
+" 48 48 95 2",
+/* colors */
+".. c #070707",
+".# c #080808",
+".a c #090909",
+".b c #0a0a0a",
+".c c #0b0b0b",
+".d c #0c0c0c",
+".e c #0d0d0d",
+".f c #0e0e0e",
+".g c #0f0f0f",
+".h c #101010",
+".i c #111111",
+".j c #121212",
+".k c #131313",
+".l c #141414",
+".m c #151515",
+".n c #161616",
+".o c #171717",
+".p c #181818",
+".q c #191919",
+".r c #1a1a1a",
+".s c #1b1b1b",
+".t c #1c1c1c",
+".u c #1d1d1d",
+".v c #1e1e1e",
+".w c #1f1f1f",
+".x c #202020",
+".y c #212121",
+".z c #222222",
+".A c #232323",
+".B c #242424",
+".C c #252525",
+".D c #262626",
+".E c #272727",
+".F c #282828",
+".G c #292929",
+".H c #2a2a2a",
+".I c #2b2b2b",
+".J c #2c2c2c",
+".K c #2d2d2d",
+".L c #2e2e2e",
+".M c #2f2f2f",
+".N c #303030",
+".O c #313131",
+".P c #323232",
+".Q c #333333",
+".R c #343434",
+".S c #353535",
+".T c #363636",
+".U c #373737",
+".V c #383838",
+".W c #393939",
+".X c #3a3a3a",
+".Y c #3b3b3b",
+".Z c #3c3c3c",
+".0 c #3d3d3d",
+".1 c #3e3e3e",
+".2 c #3f3f3f",
+".3 c #404040",
+".4 c #414141",
+".5 c #424242",
+".6 c #434343",
+".7 c #444444",
+".8 c #454545",
+".9 c #464646",
+"#. c #474747",
+"## c #484848",
+"#a c #494949",
+"#b c #4a4a4a",
+"#c c #4b4b4b",
+"#d c #4c4c4c",
+"#e c #4d4d4d",
+"#f c #4e4e4e",
+"#g c #4f4f4f",
+"#h c #505050",
+"#i c #515151",
+"#j c #525252",
+"#k c #535353",
+"#l c #545454",
+"#m c #555555",
+"#n c #565656",
+"#o c #575757",
+"#p c #585858",
+"#q c #595959",
+"#r c #5a5a5a",
+"#s c #5b5b5b",
+"#t c #5c5c5c",
+"#u c #5d5d5d",
+"#v c #5e5e5e",
+"#w c #5f5f5f",
+"#x c #606060",
+"#y c #616161",
+"#z c #626262",
+"#A c #636363",
+"#B c #646464",
+"#C c #696969",
+/* pixels */
+"#c.P.H.t.R#d.Y.r.p.j.D.X.5.I.z.n.x.N.b.F.Z.S.X.4.N.u.z.y.V.A.K.B.V.9#f.K#g.z.s.u.C.c.V#a#f.H.z.r",
+".7.n.B#f.u#b.z.s.s.J#a.I.I.B.9.w.6.H.M.L.w.o.w.O.5#j.W.D.v.O.r.S.2.I.N.X.r.W.u.k.J.4#c#b.Q.G.y##",
+".N.R.f.V.q.6.R.v.G.8#y.R.l.z#c.l#C.2.U.O.D.J.q.j.E#c#u.9.y.o.n.s.w.M.f.B.W#i.4.M.K.N.8#b.r.D.j.M",
+".x.X.t.L.S.M.V.x.8#y#A#i.K.R.w.T#w.P.8.t.n.w.6.y.y.Q#g.6.q.o.J.T#.##.l.a#m.9#n.w.g.w.A.W.G.W.E.u",
+".3.z.Q.S#b.w.g.o.2.Q.P.4.Q.q.M.K.u.0.2.L.y.u.J.E.2.J.P.E.o.G.Y.z.O.S.e.J#s#b.M.s.m.F.L.R.T.2.Q.v",
+".8.n#j.4.C.3.A.s.E.B.B.T.v.C.r.x.C#t#l#i.e.x.o.o.Y.W.Q.E.G.Y.Y.D.w.C.n.1#d##.H.l.G.O.H.u.I.6.z.I",
+"##.I#h#e.O#j.R.w.J.A.C.L.T#g.1.y.K.s.M#r.7.E.t.L.X.U.C.h#..1.A.Y#a.t.M#b#q.W.X.x.q.I.L.0.s.p.L#n",
+"#d.i#j#i.v#d.Y.I.t.x#h.Z.T#b##.w.9#d.k.Z.E.P.q.5.S.B.s.6.1.l.O.6.7.w.I#e#c.R#A.B.F.p.J.Y.R.I.t.M",
+".7.H.J.I.R.N.L#e.L.A.D.B.R.A.F.z.E.J.3.G.C.q.t.p.u.D.F.m.s.d.O.S.J.C#f.7.X.J#p.A.q.q.U#b.O.w.u.t",
+"#c#a.7.D#f#h.Z.J##.R.T.O.C.3.5.j.W.L.7.S.N.N.7.2.s.p.S.t.B.s.N.m##.z.7#g.O.J.y.w.P.g.p.0.F.o.l.N",
+".z#f#l.8.O#f.R.J.z.A.X#b.0.0#u.L.K.J.2.R.t.i.S.x.k.O.W.D.J#a.5.F.D.L.F.Q.S.K.l.I.M.w.c.F.h#b.S.z",
+".H.s.T.K.t.z.z.B.I.t.O.4.9.O.P.p.g.S.Z.f.C.T.6.K.S.F.y.Y.H.x.v.C.E.S.Y.k.O.X.H.z.p.m.D.V.Q#v.E.F",
+".v.p.C.v.z.O.G.s.X.z.u.u.q.u.2.E.4#m.Y.s.J.J.X.C.v.2.A.u#e#f#..6#g.p#i.F#q#i.1.q.X.Y.F.q.I.s.P.C",
+".u.v.u.4.O.Q.V.p.C.l.Q.r.R#z#k.C#a#u.I.M#k.U.P.1.I.Q.B.G.1#e.V#k#h.u#q.4.Q.0.z.u.u.B.R.G.w.Z#e.F",
+".v.z.B.6.5.K.Y.G.I.m.U.y#d.7.5.F.1.y#b#s#o.X.g.N.G.L.o.p.T#B#.#m#h.4#r.X.P#f.z.M.l.n.R.H.O.5#n.X",
+".A.F.G.B.9.3.V.3.V.A.4.S##.O.u.t.0.k#e#o.R.v.w.B.p.J.L#n.K.6#j.V.i.2.Y.V.O.L.o.C.7#d.Q.A#g###e.O",
+".J.j.W.D.N.J.t.O.h.z.H.C.N.s.y.o.s.Q.c.h.M.L.j.z.P.I#c#e#i.y.J.u.q.X.t.M.K.w.t.F.8#..1.V.R#k#u.X",
+".s.t.V.T.y.1.T.l.w.n.q.M.A.C.R.X.7.N.R.y.I.u.C#q#x.A#.#i#a.0.9.A.I.t.O.s.5#j.D.r.t.M.V.U.K.x#s#a",
+".C.z.D.Z.q.K.G.C.0.D.E.A.D.U#g#a.Y.D.I.P.q.O.q#e.V.J.I.H.4.7#..u.j.A#c##.z#s.F.S#j.y.l.K.Y.i.6#B",
+".W.Z.u#l.B.z.t.E.S.J#k#b.h#f.9.o.G.g.C.t.P#t.X.U.8.t.5.W.v.V.Q.S.j.T.R#e.U.F.w.0.7.S.T.Y.P.j###i",
+".L#k.q.2#d.I.Y.u.S.K.S#w.C.U.w.5.P.G.Q.P#d#h.G.Y.9.k.7.K.U.R.A.N.O.E.Q#m#h.5.j.F.O.c.2.W.5.v.R#.",
+"#g.Q.k#f.1.3.9.J.s.U.R#u.6.C.h.y.A.E.k.J.P.M.q#d#f.v.D.h#e#x.K.g.u.R.4#y#y.9.F...X.r.A#a.N.x.T.B",
+".p.F.n.v#d.2.0.R.8.A.U.6.1.H.U.m.P.w.D.H.N.B.9.8.V.F.z.Z.3.0.T.u.X.T.T#d#m.M.n.D.l.I##.0.v.B.V.C",
+".O.y.z.y.Z#l#b.6.8.N.l.2.V.5.9.O.M.n.S.Z.8.1#o#e.T.A.v.B.Q.m.F.t.q.O.z.0.2.v.4#r.T.p.7#k.I#y.N.C",
+".o.d.p.G.v.i.N.S.W.C.B.I.U.0.i.T.u.u.H.Z.E.C.F.7#..v.K.P#n#d.w.Y#g.Q.3.R.R.r###k#e.S.q.9.v.2.D.t",
+".v.z.z.t.6.3.6.3.H.h.s.y#.#p#e.p#n#d.V.N.Q.B#g#..F.P.r.1.N.F.F#a.Q.P.s.d.O.A.s#e#s#a.4.y.J.r.s.u",
+".n.R.U.v.3.0.W#a#d.P.Q.t.U.3#c.J.J.O.N.U.x.w.9#i.G.A.H.W.B.5#r.D.d.r.z.1#q.K.y#d.5#b#c.x#f#c.J.E",
+".G.G.R.E.V.I.u.2#h.D#h.T.Q.U.Z.W.J.O.M.E.C.G.x.x.B.P.O.y.3.2.J.9.8#b.v#c#d.R.C.P.M.6#i.X.F.C.g.S",
+"#o.m.x.F.O.j.T.Y.s.U.J.r.N.K.x.D.T#g.Y.S.N.C.U#i#u.L.E.0.U.o.V.2.1.2.v.2#i.Y.0.F.j.P#k#a.G.F.Y.q",
+".Q.G.h.r.j.s.U#l.7.o.F.K#a.2.T.y.E#g.2.E.O.d.F.2.Q.s.G.M#h.z.x.K.5.I.M.2#j#e.8.D.T.s.J.S.K.l.i.v",
+".K.G.S#e#q.V.i#..T.x.C.n#e#c.6.Y.T#f#a.w.w.c.L.w.A.n.B.s.Q.4.H.R.C.O.K.v.J.I.1.Q.m.o.K.B.q.u.z.W",
+".Y.r.A.U#f.1.m.K.7#j.X.W#d#a##.9.V.w.F.Y.L.e.z.z.Z.M.V.T.H.5.w.G.l.V.t.M.w.m#a.7.5#a.M#g.X.I.S#q",
+".Y.B.#.7.J.U.k.8#s.9.J.S.V.S.E#e#l.H.C#e.L.f.F.P#B.X.C.7.M.G.G.X.P.5.R.B.K.D.7#b#t#h.S.O.z.K.p.J",
+".v.B.s.Z.v.s.V#g#l.q.Q.J.o.o.I#h#q.4.W#f.6.y.H.l.Z.Q.N.o.N.I.g.n.M#v#r.m.K.J.z.7.w.s.H.H.q.t.Z.X",
+".9#e.M.H.M.4#h#f.S.v.5.G.w.E.X.V.5.5#e.9.p#f#o.4.y.u.V.E.N#b#..q.I.K.9.B.6.S.o.E.H.m.x.l.Y.K.A.T",
+".p.R.W.Y.7.o.P.I.u.J.7.E.h.E.v.t.w.J.E.H.x#o#u#a#z.O.i.B.7#v#..B.M.k.K.x.D.L.M.0.I.P.L.H.J.X.y.1",
+".s.6.w.w#j.P.O.f.i.y.S.F.n.P#e.0.P.x.Q#a.S.Q#q#A.U.w.N.E.2#e.U.A.B.n.v.4.L.v.P.J#a#A.x.O.M.z.j.P",
+".O.D.0.B.G.N.O.F.6.x.Q.G.W.n.0.9#m.O.4#e#d#p#k.6.A.n.t.E.0.s.z.#.x.r.m.u.O.E.H.z.S#p.t.W.W.p.q.F",
+".W.E.A.C.t.1.O.q.1.U#s#f#s.2#o#z#q.X.A.1.G.L.W.V.U##.F#l.G.7.K.A.P.e.w.z.S.9.R.q.r#h.N.q.t.q.I.Y",
+".4.s.o##.R.t.R.j#c#e.A#e##.0.3.3.0.3.V#b.I.6.A.j.1.1.E#e.x#j.L.I#b.O.F#.#b#d.0.w.u.R#i.H.Q.F.B.Q",
+"#j.B.W.P.1.Q.G.F.Z##.U.D.Y.O.G.x.I.e.E.y.V#r#f#f.D.w.A.M.s.M.g.G.2.s.J.3.J##.V.G#b.W.0.B.I#.#m.B",
+"#e.R.n.N.z.q.l.h.B.l.q.V#t#y.X.F.Z.t.l.E#h#g#.#m.X.s.E.M.J.o.m.R.R.N.B.3.T.M#f#l##.m.Y.T.F#i#b#e",
+".X.M.w.v.3.R.I.o.J.U.P.f.X#..Q.J.N.z.s.L#k.5.I.E.5.O.W.h.P.o.C.S.9.o.K.w.B.C.0#l#a.y#f.P.v.7#o.2",
+".y.e#g#b.C.j.G.3.J.C.F.1.E.l.G.V.1.C.D.s.u.2.z.T.y.L.G.X.n.R.R.A.R.w.U#g.6.5.N.4.u.W.X.M.u.D.S#.",
+".p.I.B.t.x.G.w#g.Z.t.Q.k.R.T.E.M.x#q#z.H.m.C.O.d.N.p.R.M.Q.W.K.x.O.z.z#p#n#k#e.A.C#k.R.B.C.t.l.t",
+".F.n.P.P.D.G.N.U.q.P#l.P.2#..G.r.2#m#k.4.K.s.t.r.R.N.m.m.m.4.s.s.G.C.G.w.8#i.M.v.y.y.D#a##.O.A.m",
+".Q.G.v.t.R.Y.P.s.w.L.8.7.t#C.4.t.5#k#k#c.R.i.n.W.E.D.q.1.M.w.G.B#l.3.M.f.R#i.6.E.p#k#h#f#b.7.O.G",
+".J.t#b.X.Z.f.B.M#p.O.T#b.V.K.v.m.I.k.X.E.s.m.W#x.6.4.P.j.3.z.X.T.3#q#a.Z.W##.2.X.q#t#h.8.B.S.N.u"
+};
diff --git a/kblackbox/pics/green.xpm b/kblackbox/pics/green.xpm
new file mode 100644
index 00000000..f5d4a505
--- /dev/null
+++ b/kblackbox/pics/green.xpm
@@ -0,0 +1,218 @@
+/* XPM */
+static char *green[] = {
+/* width height num_colors chars_per_pixel */
+" 48 48 163 2",
+/* colors */
+".. c #040204",
+".# c #047e04",
+".a c #14be14",
+".b c #044204",
+".c c #7c7e7c",
+".d c #049e04",
+".e c #2cde2c",
+".f c #1cce1c",
+".g c #0cae0c",
+".h c #444244",
+".i c #042204",
+".j c #048e04",
+".k c #3cee3c",
+".l c #2cbe2c",
+".m c #046204",
+".n c #149e14",
+".o c #34ce34",
+".p c #1cae1c",
+".q c #242224",
+".r c #646264",
+".s c #3cde3c",
+".t c #049604",
+".u c #041a04",
+".v c #14c614",
+".w c #24d624",
+".x c #048604",
+".y c #045204",
+".z c #04a604",
+".A c #0cb60c",
+".B c #545254",
+".C c #043204",
+".D c #047204",
+".E c #14a614",
+".F c #1cb61c",
+".G c #343234",
+".H c #34d634",
+".I c #747274",
+".J c #3ce63c",
+".K c #24be24",
+".L c #34e634",
+".M c #148e14",
+".N c #4cee4c",
+".O c #2cc62c",
+".P c #149614",
+".Q c #141214",
+".R c #8c8a8c",
+".S c #2cce2c",
+".T c #0c0a0c",
+".U c #0c7e0c",
+".V c #1cbe1c",
+".W c #044a04",
+".X c #0c9e0c",
+".Y c #34de34",
+".Z c #14ae14",
+".0 c #4c4a4c",
+".1 c #042a04",
+".2 c #0c8e0c",
+".3 c #046a04",
+".4 c #1c9e1c",
+".5 c #24ae24",
+".6 c #2c2a2c",
+".7 c #6c6a6c",
+".8 c #0c960c",
+".9 c #24c624",
+"#. c #2cd62c",
+"## c #0c860c",
+"#a c #045a04",
+"#b c #0ca60c",
+"#c c #14b614",
+"#d c #5c5a5c",
+"#e c #043a04",
+"#f c #047a04",
+"#g c #1ca61c",
+"#h c #24b624",
+"#i c #3c3a3c",
+"#j c #3cd63c",
+"#k c #44e644",
+"#l c #34c634",
+"#m c #1c1a1c",
+"#n c #848684",
+"#o c #24ce24",
+"#p c #44ee44",
+"#q c #3cd23c",
+"#r c #44e244",
+"#s c #1cc61c",
+"#t c #7c7a7c",
+"#u c #4cf64c",
+"#v c #040604",
+"#w c #048204",
+"#x c #14c214",
+"#y c #044604",
+"#z c #848284",
+"#A c #04a204",
+"#B c #2ce22c",
+"#C c #0cb20c",
+"#D c #444644",
+"#E c #042604",
+"#F c #049204",
+"#G c #2cc22c",
+"#H c #046604",
+"#I c #14a214",
+"#J c #34d234",
+"#K c #1cb21c",
+"#L c #242624",
+"#M c #646664",
+"#N c #3ce23c",
+"#O c #049a04",
+"#P c #041e04",
+"#Q c #24da24",
+"#R c #048a04",
+"#S c #045604",
+"#T c #04aa04",
+"#U c #0cba0c",
+"#V c #545654",
+"#W c #043604",
+"#X c #047604",
+"#Y c #14aa14",
+"#Z c #1cba1c",
+"#0 c #343634",
+"#1 c #34da34",
+"#2 c #747674",
+"#3 c #3cea3c",
+"#4 c #24c224",
+"#5 c #34ea34",
+"#6 c #149214",
+"#7 c #2cca2c",
+"#8 c #149a14",
+"#9 c #141614",
+"a. c #0c7a0c",
+"a# c #8c8e8c",
+"aa c #2cd22c",
+"ab c #0c0e0c",
+"ac c #0c820c",
+"ad c #1cc21c",
+"ae c #044e04",
+"af c #0ca20c",
+"ag c #34e234",
+"ah c #4c4e4c",
+"ai c #042e04",
+"aj c #0c920c",
+"ak c #046e04",
+"al c #1ca21c",
+"am c #24b224",
+"an c #2c2e2c",
+"ao c #6c6e6c",
+"ap c #0c9a0c",
+"aq c #2cda2c",
+"ar c #0c8a0c",
+"as c #045e04",
+"at c #0caa0c",
+"au c #14ba14",
+"av c #5c5e5c",
+"aw c #043e04",
+"ax c #1caa1c",
+"ay c #24ba24",
+"az c #3c3e3c",
+"aA c #3cda3c",
+"aB c #44ea44",
+"aC c #34ca34",
+"aD c #1c1e1c",
+"aE c #24d224",
+"aF c #44f244",
+"aG c #1cca1c",
+/* pixels */
+"#i#M.G#L#Laoa#.0.Ban#maz.G.raoaoaz.q#D#D#0.B#M.q.q#0.Gan.0aD.6.7ah.r#Dah#D.q#9.h#Lah#D.B#ianaz.G",
+".Bab#0#m#m#L.0.6abanah.6azah.B.qan.0.caz.6#i.c#V.h.7#D#Van#Laz#0.0#0.G.B#V.7#0.G#maD.6.G.0#D.h.q",
+"#V#i.0.B.hazanah#L.r.0anaz.B#L.B.Q#i.Q#d.q#L.Rahanaz.q.0#i.6#V#iao.r#L.G#2.7.q#V.Q.6#0#DavaD.G#M",
+"#9#i#Dah#i.0an.I#M#z#D.q.q.Gaz#D#9az.T#Maz#9#V.6.Gaz.6aDaD#m#D.0.qah#0#M.r.Baz#9.h#L#i.6#LaD.6az",
+"an.haz.0az.G#i#d#V.Bao.r.6#0#m.B.i.C#eaw.b#y#y.W.W.W.W#y.baw#Waw#Wao#L#M.7#L.haD.q#L.qanah#z#m#L",
+"#V#m#0#i#V.Gan#L#iazah.B.G#E#W#e#y.y#S.m.m#H.3.Dakak#H#Hak.Dak.3#H.y.y.Wao.haz#d.Ianan#d.qao.I#D",
+"#d#d.q.6#L.0ah.r.Gah.G#E#e#y.Wae#S#a#H.3.D.x#R#R.j#R#R.j#R#R.x#R#R#R#R.D.W.b.6.B#D.G#ian#i#Dav.h",
+"#Mavan#M#D.c#n#M.Ban.1.b.W.y#S#a.m#H#H.3.3.3#f#R#R.t#O#O.d.d.d#O.t#F#F#F#R.y.b#0#Dan#m.G.q.B.7ah",
+"#D#0.B.q.h#0avan#d.1#e.Wae#S#a.D#X.3.3.3akak.#.##w#w#R#R.d.Aau.A#T.g.z#A#A#X.y.W.qazaD#Lao#Daz.r",
+".r#Vah#0.G#ianah#E#e.bae.y#a.3#f#X.D.D#f#w.##f#w.#.#.##R#O#caG.a.A.A.A.A#T.z#X#S#y#D#m#i.I.0az#D",
+"ao.B#i#i.7ah#i.u#W.b#y.y#S.m#X#f#X.x#F.j.j.t#F#R#R.x.x#R#O#A#s.waG.v#x.v.A.z#w.3ae#W.Qah#2#0.B#L",
+".7.Qaz.T#V.7.6#Eaw#y.W.yas.3#X#f.##R#F#O.t.t.t#F.j.j.t#O#c.9.w.eaqaEaGaG#U#T#F.3.m#San.G#L#m.q.6",
+"aDaD#0.hanaz#P.1#y.W.y#S#Hak#X#w.x#F.X#b#bat#A.d#Aat.V#o.Y.k.k.k#B.w.a.A#C#C.d#Rak.m#e.q#d#0ah.q",
+"#L#L#dan.6#0#P.C#y.y#a.m#Hak#f#w.j.8af#Y#b#b#batau#1#p#p.L.eaG.L#5#Baq.f#U.A#O#R#f.3.W.Qah.0.7.h",
+".0.h#L#m.6#V.i.C.W#a#a.m#Hak#f#R#Fapafat#Z.V#s#.#raB.YaG#saGaE.w#3.Laq#o.a.g.d#F.#ak.yab.7ao#L.h",
+".Gaz.haz#L.u.i#W.bae#S#Hakak#f#R.8af#Y#4.9.o.HaA#N.J#o#sadaG#s.f#3.L.wadau#T.d#F#w#X.y.1.q#0#i.Q",
+"#V.haz.h#0.u#E#eawae#a.3#f#f#war.P.E#K.5#G.o.s.J.L.YaE#..Y#.aG#x#Qaq.w.a.Aat.d#F#w.D#S.b.B#M#2.0",
+"#0.0#dav#d.u.1.Caw.yasak#f#waraj.2.nalax.S.Y#N#Nag#Bag#3aBaF.L#xaG.waa.a#C.g#O#F.x.D.m.y#L#Dah#t",
+"an#i#Mao.r#P.1.C#eae.m.D#f#war#6ar.M#8.5#J.J.J.L#3#3aF#kaF#u.k.w#x#x#s#Uau.A#A.t.j.Das.W#M#D.0av",
+".0.haz#Man#Pai#Waw.y.m.D#f##aj.8.P#8.p.O.s#3.k#p.kaFaB#p#u#u#u#BaE.v#x#c#C#c.z#F.x.Das.yao#i.6.G",
+"#V.G#9az#i.i#W.C#yas#Hak#f#war.8.n.Eay#7aa#N.J#3#p#p#N#u#u#u#u.k.e#o.a#C#U#x#C#R#w.D.m.yao#Dav#i",
+"aD#0.Q#L#M#E.C.C.W#Sas#H.D.#araj#8.E.K.S.Saa.s.J.saA#r.N#p#uaF.k.L.w.fau.a#c#T#F#w.Das.y#d#0.6.q",
+".6.6an.qaz#Eai.C.b.y#a#Hak#faraj.2#6ay#7.o.H.s.s#jaC#j.saAaB#paF.J.e.9.V.g.X.z#O#wak#S#S#D#9an.h",
+".6.Baz#9aD.iai.C#eae#a#H.3.D.#acarar#8.O#J.H.saC..#l.H#r#J#j#J.s.H#Gad#b.t#F.j.x#w#H.y#S#L#Lah#D",
+"#0#0#9.6#i#E.C.C#eaeas#H.D#f#f.#.D.U.Pay.O#J#J#G.5.l#J.s.Oay#hay#h.p#K#b#F#R#R.##Xakas#S#V.BaD#i",
+"#0az.G.h.6#Eai.1#e.y.m.D#f.x.U#f.3.D.U.2#g#h.5.5#h#q#N.H.o#G.l#Gax#g.X.X.j.x.x#f#X#X.Dae.r#d.G.q",
+"#i.q#L#D#0.i#E#E#W.y.3#f.#.2.2#Xak.3#Xa.##.P.4ax.OaA.s#7.YaA#1#J#Y.Eaj.2aj#R#R.x.#.D.D.Wavaoan#L",
+"ab.G#ian#d.i.iai#W.W.3#f.#ac#6.#.3ak#X##.M.P.n#h.O#j.o.9aA#p#p#3.H.F.X.Eaf#O.j#R#fakakaw.B.6#z.q",
+"#dan#d#V.0#P.i.Cai#e#H.D#facajacakak.D.M#8#gay#GaC.O.F.K#1#N#1.Y#1#..Fau#Y#A.d.x.D.D.3awan.7avao",
+"#0aD#i#Vah#P.i#W#W#e#H.3#X#facak.m.makar#Iamamax.p.paxay.S.H#G.F.9.9#s#c.X.X.d#wak.3.m#W#L.haDaz",
+"#D.6an#iav.u.i.C.C#eae.m.3akakas#a#a.3ac.Paj#8#8#8#g.F.K#h#K.E.8#8.V.K.Zap#F.jakak.3ae.C#Vanan#D",
+".0aD#V#iaz.u.i#Wai#e#y.yasas.mas#S#a.3#wac.2.P#8.2#6#I.n#g.E.p.naj#Y#Z#O.##f.D.3.3#a#y.1.Iah.Baz",
+".6.0.B.r#Lab#P.C#W.C.bae.y#S#a.m#Has#H#X.Uacaj.Pac#f.U.2#8.E.E.2.xap#Y.8.D#H.m#Has.y#y#M#D#M#9.7",
+".Iahah#0.Gab#Pai#W#W#yae#S#Sas#H.3.3.D#X#X#X.D.#.D.makak.#.8.2.xac.Xap#w#Hasasas.yae#e#t#d#i#z.0",
+".G.6.6#0ah.T.u.i.C#e.b#y.y#S#aas#H#H.3#H#Has.mak.3asas#aas.3.D#f.##Rajak#a.y#a.yae.W.1.canaDav.G",
+"#2#Van.q#iahaD#P.1#Waw.b.W.W.y#S#S#S#a#a#a#a#Sasas#S.Wae.y#S#a.m#X.D#w.m#a.y.y.W.y#eaz.T#d#L.h.q",
+"#M.G.q#9.6#L.Q.u.iai#W#e#e.b#y.W.Waeaeaeaeaeaeae.W.W.yaeaeae.y.y#aak.D.3.m#Sae#y.b.1.T#L.6#L.0#9",
+".G#V#d#D.0ah#0#9.u.iai.C#W#eaw.b.b#y.Wae.W.W.yae.yasasas.m#Saeae.m.3.m.mas.y.W#eaian#Da#aoananan",
+"an.q#Lanaz.G.h#9#9#P.i.1ai#W#e#eawawaw.b.W#S#aas.m.masas#Sae.b.W#a#a#a.y.y#y#e.1aoan.c.r.q.0aDaz",
+".G#D.c#0.0.h#M.qaD#v.u#P.1.1.C.C.C#W#eaw.b#y.y.y.y.yae.W.y#y#e.b#yae.W.b.b#W#E.7#2#z.r#V.G#L.7#i",
+"az.r.q#M#M#i#9#V#i.TaD.u#P.i#E.1.1aiai#Waw.b#y#y.b.b.bawaw#Wai#W#eaw#Wai.1#P#d.R#2.B.B#0.h.G#iaD",
+".B.h#m#d.0.Q#0#L#L#maD#9ab.u.u#P.i.i#Eai.C#W#W.C.Caiai.C.C.1.1aiai#E.i.u#D.QaD#M#2#Lanah#d#0.6#M",
+"#0az.6anaz.q#m.0.G#L.hav.0abab#v.u.u.u#P.i#P.i#P.i#P.i#P#P.u#P.u.uavaoah#dab#m.q#t#L#0.0az#m#L#M",
+".q.G#L.6#V#D.6.G#D#9az#0.h.G.h#0#0an.hao#M.Gazan.Q#Daz.B#M#Mazah#0anah#V.G#0.qavav.7#V.0aDaz#L#m",
+".6ah.q#V#M#daz#0.han.6az.6#maz#Lahav#L.7ahan.6#0anazan#9.hav.6#d#mazav.0#M.0anav.G#daz#0.0.G#9an",
+"an#M.0.I.IaD.6#D#0.6an#m#i#0#d#0#i.B.G.h#L#0an#iaD.0.q#V.6#zah.Gaz#D.6#i.Bao.c#Vaz#V#m#m.Qan.q.B",
+".r#i.r#Vah#V.h#iaD.6aDazan#v.B#0.r#M#VaD.ran.G#Lah.rav#D.G.Ban.I#t.G#0ahao.0.0.0#i#9.6#iav.c#D.0",
+"#Lan.0.6.Ban.q#man.0#0#t#i.q#V.0#2#dan#D.G.q.qan#mav.0.0#L#L#L.R#V#L#M.G.B#i.G#L.G#m#0.G#D.0ah.q"
+};
diff --git a/kblackbox/pics/green2.xpm b/kblackbox/pics/green2.xpm
new file mode 100644
index 00000000..92ef2acb
--- /dev/null
+++ b/kblackbox/pics/green2.xpm
@@ -0,0 +1,300 @@
+/* XPM */
+static char *green2[] = {
+/* width height num_colors chars_per_pixel */
+" 48 48 245 2",
+/* colors */
+".. c #040204",
+".# c #3cc23c",
+".a c #044204",
+".b c #848284",
+".c c #444244",
+".d c #2ca22c",
+".e c #0c620c",
+".f c #8cc68c",
+".g c #4ce24c",
+".h c #448244",
+".i c #2c622c",
+".j c #045604",
+".k c #042204",
+".l c #249224",
+".m c #6ca66c",
+".n c #147214",
+".o c #449244",
+".p c #44d244",
+".q c #242224",
+".r c #34b234",
+".s c #447244",
+".t c #2c722c",
+".u c #2c822c",
+".v c #a4a2a4",
+".w c #1c521c",
+".x c #54b254",
+".y c #1c421c",
+".z c #5cf65c",
+".A c #043204",
+".B c #5c925c",
+".C c #1c621c",
+".D c #5cc25c",
+".E c #3ca23c",
+".F c #94e294",
+".G c #84d284",
+".H c #349234",
+".I c #6cb66c",
+".J c #646264",
+".K c #147a14",
+".L c #2c7a2c",
+".M c #2c8a2c",
+".N c #044a04",
+".O c #5ce25c",
+".P c #449e44",
+".Q c #54d254",
+".R c #043a04",
+".S c #44ca44",
+".T c #448a44",
+".U c #5ca25c",
+".V c #7cc27c",
+".W c #1c5a1c",
+".X c #041a04",
+".Y c #8c8a8c",
+".Z c #2c6a2c",
+".0 c #0c5a0c",
+".1 c #3cba3c",
+".2 c #7cb67c",
+".3 c #1c8e1c",
+".4 c #545254",
+".5 c #2caa2c",
+".6 c #343234",
+".7 c #1c6a1c",
+".8 c #747274",
+".9 c #0c6a0c",
+"#. c #c4c2c4",
+"## c #249a24",
+"#a c #b4b3b4",
+"#b c #5ceb5c",
+"#c c #54dc54",
+"#d c #5cae5c",
+"#e c #4cc34c",
+"#f c #144414",
+"#g c #042c04",
+"#h c #247524",
+"#i c #549354",
+"#j c #44b544",
+"#k c #7cfe7c",
+"#l c #3c753c",
+"#m c #3c833c",
+"#n c #1c4d1c",
+"#o c #5c9c5c",
+"#p c #3cad3c",
+"#q c #8cfe8c",
+"#r c #349d34",
+"#s c #247c24",
+"#t c #3c7d3c",
+"#u c #3c8c3c",
+"#v c #143b14",
+"#w c #548c54",
+"#x c #7ccc7c",
+"#y c #2c5d2c",
+"#z c #141514",
+"#A c #949694",
+"#B c #248424",
+"#C c #8cde8c",
+"#D c #145514",
+"#E c #447d44",
+"#F c #64b464",
+"#G c #143614",
+"#H c #144b14",
+"#I c #549d54",
+"#J c #3c6e3c",
+"#K c #7cbe7c",
+"#L c #a4fea4",
+"#M c #44c444",
+"#N c #0c440c",
+"#O c #4c4c4c",
+"#P c #34a334",
+"#Q c #146314",
+"#R c #54ee54",
+"#S c #4c854c",
+"#T c #346434",
+"#U c #6cce6c",
+"#V c #2c942c",
+"#W c #6cb26c",
+"#X c #1c741c",
+"#Y c #4c944c",
+"#Z c #4cda4c",
+"#0 c #2c2c2c",
+"#1 c #3cb43c",
+"#2 c #6cfe6c",
+"#3 c #347434",
+"#4 c #348334",
+"#5 c #6c9e6c",
+"#6 c #0c0d0c",
+"#7 c #4cae4c",
+"#8 c #acacac",
+"#9 c #54cd54",
+"a. c #6c6c6c",
+"a# c #5c5c5c",
+"aa c #3c3c3c",
+"ab c #7c7c7c",
+"ac c #1c1c1c",
+"ad c #9cfe9c",
+"ae c #74be74",
+"af c #949294",
+"ag c #cccacc",
+"ah c #bcbabc",
+"ai c #9c9e9c",
+"aj c #8cce8c",
+"ak c #84da84",
+"al c #1c851c",
+"am c #54e554",
+"an c #0c540c",
+"ao c #4cd34c",
+"ap c #245324",
+"aq c #5cb25c",
+"ar c #64f364",
+"as c #0c340c",
+"at c #246424",
+"au c #44a244",
+"av c #74b874",
+"aw c #1c7c1c",
+"ax c #347c34",
+"ay c #348c34",
+"az c #0c4c0c",
+"aA c #64e264",
+"aB c #4c9b4c",
+"aC c #0c3c0c",
+"aD c #4ccc4c",
+"aE c #4c8d4c",
+"aF c #64a364",
+"aG c #84c684",
+"aH c #245c24",
+"aI c #346c34",
+"aJ c #145c14",
+"aK c #44bb44",
+"aL c #84ba84",
+"aM c #248c24",
+"aN c #34ac34",
+"aO c #64bc64",
+"aP c #246c24",
+"aQ c #146c14",
+"aR c #2c9c2c",
+"aS c #64ee64",
+"aT c #5cdc5c",
+"aU c #64ac64",
+"aV c #0c2d0c",
+"aW c #244b24",
+"aX c #64fc64",
+"aY c #649d64",
+"aZ c #44aa44",
+"a0 c #3c9d3c",
+"a1 c #84ce84",
+"a2 c #9c9a9c",
+"a3 c #4c7e4c",
+"a4 c #74ae74",
+"a5 c #5cca5c",
+"a6 c #54a254",
+"a7 c #3c923c",
+"a8 c #84fe84",
+"a9 c #94fe94",
+"b. c #94de94",
+"b# c #acfeac",
+"ba c #74ce74",
+"bb c #74fe74",
+"bc c #3cc63c",
+"bd c #044604",
+"be c #848684",
+"bf c #444644",
+"bg c #2ca62c",
+"bh c #0c660c",
+"bi c #8cca8c",
+"bj c #448644",
+"bk c #2c662c",
+"bl c #042604",
+"bm c #249624",
+"bn c #6caa6c",
+"bo c #147614",
+"bp c #449644",
+"bq c #242624",
+"br c #34b634",
+"bs c #6cfa6c",
+"bt c #2c762c",
+"bu c #2c862c",
+"bv c #a4a6a4",
+"bw c #1c561c",
+"bx c #54b654",
+"by c #1c461c",
+"bz c #043604",
+"bA c #5c965c",
+"bB c #1c661c",
+"bC c #84d684",
+"bD c #646664",
+"bE c #147e14",
+"bF c #2c7e2c",
+"bG c #2c8e2c",
+"bH c #5ce65c",
+"bI c #54d654",
+"bJ c #043e04",
+"bK c #44ce44",
+"bL c #448e44",
+"bM c #5ca65c",
+"bN c #7cc67c",
+"bO c #1c5e1c",
+"bP c #041e04",
+"bQ c #8c8e8c",
+"bR c #2c6e2c",
+"bS c #0c5e0c",
+"bT c #7cba7c",
+"bU c #545654",
+"bV c #2cae2c",
+"bW c #343634",
+"bX c #1c6e1c",
+"bY c #747674",
+/* pixels */
+".4af.cbWbWa2agbD.8aabqbU.cbea2#AbU#0a#a##Oa..Y#0#0#Oaaaa.JbqaabQa..b.JbDa#.6acbU.6bDa#a..4aabUbf",
+"bY#z#ObqbqaabDaa#z.ca.aaa#bD.8.6aaa.#abUaa#O#8aba#afa#bY.c.6.4bfbDbf.c.8.8bQ#Obfac#0aabf.Ja#a##0",
+"abbUa..8a#bU.ca.bW.ba.aabU.8.6.8#z#O#zab#0bWahbDaabU#0bD#ObW.8#Oaf.bbW.caiaf#0bYacbW#Oa#ab#0bfbQ",
+"ac.4.J.8.4a.aaa2bQ#a.J.6.6bfbUa#.qa##6bQ.4acbYaaaa.4aa#0bq.q.JbD.6a.bfbebea.bUaca#.6.4aabWbqbW.4",
+".ca#bUbDa#.cbU.baba.#Abeaa#Obqa..Rbd.0aQ#saM#raNaK#j.E.3aw.e.j.abz#A.6.YbQbWbUbq#0bW#0aabD#a.qbW",
+"bYbq.4#Oabbf.c.6.4a#.8bYbfbP#g.AaC#nbk#E#I.I#x#C#C.G#F#daF#w#lap#N#gbl.kafbUbUaba2aa.cbY#0#Aa2.J",
+".b.b#0aabWa.a.bebfbD.c.XbP.k#g.A#f.wbk#E#i.maL.fbiaj#Ka4#5#w#l#yaW#GaVbPbP.XbW.8a#.c#O.c#O.JabbU",
+"bQbe.cbQ.J#8ahbQ.8.c.X.XbP.k#gasby#yaI#E#w.Uav.2avbnaYbAa3.s#TaW.yas#g.kbP.X.X#Oa#aa.q.c#0a.bQa.",
+".J#O.8.6a##Obeaaab.X.X.XbP.k#gas#fapaI#t#Y.U#WavavavbnaF#EaH#n#n#vas#g.kbP.X.X.X#0.4bq.6#A.J.4be",
+".YbY.8.4bfbU.ca..X.X.XbPbPbl#gas#fapaI#EaE#oaUaU#FaUaF#I#Sat#H#faCas#g.k.kbP.X.X.X.J.q#Oaia#.4.J",
+"aia.bU#O#Aa.#ObP.XbP.XbP.k#g#gas#H#DbwbR#m.T#I.UbMbMa6#i#maI#D#H#Nas.A#g.kbPbP.X.X.X#za..vbf.8#0",
+"#Aaca##6ab#AaabPbP.k.k.k.k#g.AaC#HbwbOaP#tbL.oaB#IaB.o#mbt.CaJ#Daz.abz#g#gblbPbPbPbP.cbf.6.q#0aa",
+"#0#0#Oa#.cbU.k.k.kblblbl#g#gbzbJaz#DaJ.7#s.u#ua7a7ay#B#s#s#s.7.Can#N.R.A#g#gbl.kbP.k.k#0abbfa.#0",
+"bW.6.b.caa#Obl#g#gaV.A.A.AbzbJ.aanbS#Q#XbFayayaybG.HaZ#r#B#X#Q.7#Q#DazbJbzbz#g#g#g#gbl#za.bDbQa#",
+"bDa#bWbqaabY.AasaV#gasaC.RbJ.aazan#Q#Xaw#BaM#V#P#9#9#PaM#sboaQ#QbX#QaJaz#N#v#f.y.yas.A#zbQafbWa#",
+"#Oa#.JbUbW.RaCasaC#v#v#N#Nazan.0#QaQbo#r#e#9.QaAbIaKaRaMalaw.nbh#XbXaJ#D#H#f#n#naW#nbJ.R#0bf#Oac",
+"bYa#bUa#.4bd#DaW#n#n.w#Haz#D#Qaw#saM#P#e.Q.OaTbI#MaN.d.d.d.3bobh.n#Q#QaJ#D.wap#y#T#T#N.a.8bQ.va#",
+".4a..bbeaban#3#t#yaI#y#D#D#QbX#B#V#PaK.Q.OaSaSaobcbrbVao.Q.Q.l.9.9.nbXaJ#D.WaI#J#E#l#D.C.6a#a.bv",
+"aa#Oaf#AbQ.ebj#w.h#E.i.W#Q.7#sbG#r#p#M.OaSbH#Z#Z.pbKam#2aS#c#1bEbhbhaQ.CaJbOaI#E#waEat#h.Ya#.Jab",
+"a.a#a#bQ.cbo#YbnaY#SbRatbBbX#B#V#P#1aoaS#b#b#R.g.g.zbb#kararao.l.KaQaQ#hatat#3#waY#ibX#uaf#Oaa.c",
+"ab#O.qbU.4a0aUavaF#E#3aPaPaw#sbmaR#1.S#b#b.zaXaXaX#ka9#kbb#2#c#P.3bo#Q#Q.7aP.Z#o.m#IbF.P#Aa#ab.4",
+"#0bfac.6af.x.V#xbn#w#tbt#h#s#B#V.d.r.Sam.z#2bbbb#q#L#La9#qbbaS.1aR.3aw#XaPbt#3#t.Uae.H#7bY#Oaa#0",
+"aaaa.c.6bU.DaOa1bT#o.hax.L#saM#raN#Marar#2a8#ka9#Lb##Lad#qa8bsao#p#rbG.u#4.oaEbAaEaq#r.Da#acaaa#",
+"aa.8bUac.6#UbabCbN.Ubj#m.u#s.MaRaN#Mam#2#2#q#q#L..b##La9#q#k#2bH#eaNbG.ubp#I#YavbN#dbma5.6.6bD.J",
+"#O.4.qaa#Obx#Ca1.VaUbjax.L#saM#VaR#1ambbbb#qad#La9#L#La8bb#2aSaDaK#P#B#BbL.TaEaU.VaB.E.D.8.8bq#O",
+"#Oa#bfa#aa.x#x#Fav#o#t.t#h#B#B#V##bg.#ambb#qa9#qad#L#qaXaXbb#bbI.r#Vaw#saP#mbjaE#wbn.GaZbebY.c.6",
+".4.6bWbD#Oa0auaB#W.B#3aP#h.ubGbG.l##aNbc.gaXbba8ad#La8#Rbb#karaT#PaMaQ#QbB.t#t#w#tbAbT#V.b#AaabW",
+"#zbfbU.c.b.uay#I#i#iaIaPaP#s.HaMaM##.5.S#caX#2#qadad#2.garbbaTaDaNbGbobXaP.taE#waI#JaFaw.8bW#a#0",
+"beaabeaba.#X.L#S#l#latbObB#hbG.MalaM.dbK.O#2a8#q#qbb#ZbH#b.O.Q#j#PbGawbXbBbR#l#E#y#T#i#Qbfaf.baf",
+"#O#0#Oab.8aJaP#J#yaH#nbwaJbB#sbo.n.K.l#1#cbs#2bsarao.S#caT.Q#1aR#V#B#h.7.Watbk#y#n#y#3.0.6bUbqbU",
+"bDaa.c.4.b.a.W#y#nby#N#N#DanaJbS.e.9al#PaK.1#eaoaDbKaD.Q#M#1aRaw#X#X.7aJ#D#n.wbyaW#y#HbdbY.caa.J",
+"bD#0ab.4a#.R#faW#vaCasaC#N.Nanan.0.ebo#V.d#p#1#1#1aKaK#1aN#rbGawaQaQbBazbJ.Ras#fby#naC.RaibD.8bU",
+".ca.bYbQbWaa#gas#vas.A.A.RbJazan.0.eaQ#BaMaR#p#paRaRaR.H#VbG#BbX.0aJan#Nbz#g#gasasas.A.Y.J.Y.qaf",
+"ai.8.8.4#ObWbl.kaV#gas#g.A.R.aazan#QaQ#X#s#B#B#VbG.M.M#Baw#sbX#Qanan#NbJ#g#gbl#gbl#gbl#8ab#O#8bD",
+"#Oaaaa#Oa.#0bl.kbP.kbl#g#g.A.R#NanaJbB#h#hbF.ububuayay#4.L.7#Qan#N.abJ.A#g.k.k.kbP.k.k#8.c#0.bbf",
+"#8ab.c.6bUa.ab.XbPbPbP.kbl#gbzbJ#N#H.C.t.L#m#u#u#u.o.o.TaxaPbO#H#N.R.A#g.k.kbPbPbPbPbU#6bY.6a#.6",
+"#A#O#0.qaaaa#O.X.X.XbPbP.k#g#g.A#N.wat#3.hbL#i#I.U#I#YbL.hbRaH#DaCbz#gbl.kbPbP.X.XbP#6aaaabWbD.q",
+"bfab.bbDbD.8.4bD.X.X.XbPbP.kblas#fapaI#laE#i#i#I#i.T.h#t#3aI.i#naC.A#g#g.kbP.X.X.X.ca##.a2aa.c.c",
+"bfbWbWbfa#.ca#.JbU.X.X.XbP.k#gasby#y#l#E#w.haE.haE.h#S#E#E#l#T#n#vasaV.kbP.X.X.X#A.c#8bQ.6bD#0bU",
+"bfbD#a.4bDbDbQ#0.8ac.X.XbPbPblaCaW.i.s#S.BaYaYaY.m.m.maY#wa3aIap.yasaV.kbP.X.X#Abv#abebY.cbWaf#O",
+"a#af#0a2#Aa#ac.b.4#0bYbPbP.k#g#v#n#y#l#w.Bbn.2aGajbiaGbTaY.haIap#fasaV.kbP.X.b#.bv.8bY#Oa#bfbU#0",
+"ab.Jbq.ba.ac#ObWaabq#0bUbW.k#g.A#fbwbk.haFavajb..Faka1.VaFaxaH#naC#g#g.k.J#zbq.YbvbWbfa.ab#OaabQ",
+"#Oa#aabfa#.6bqa.bfaa.Jbea.aabfac.RbdanaQbFbG.E#p#1#p##albo.e.j.NbJ.Y#A.8ab#zbq.6#8bW#ObDa#bq.6af",
+".6#ObWaa.bbD.c#ObDacbU.4a#bfa##O#O.c.Ja2#Abfa#.cac.Ja#.8bQ#AbUa.#Oaa.8bYbf#O.6.bbeafabbD#0bUaabq",
+".c.8bW.bbQ.ba#.4.J.c.cbUaa#0bUaaa..bbWa2.8aaaa.4aabUaa.qa#.baaab.qbUbebD#AbD.cbebf.bbU.4a.bfac.c",
+"bf#Aa.#8bv#0aabD.4aa.c#0bU#O.b#ObUbYbfa#bW#O.c#O#0a.#0abaaah.8#ObU.Jaa.4bY#A#aabbUbYbqbq#z.c.6.8",
+"afa#af.bbYabbD#Obq.c#0bU.c#6bY#Oaf#Aab#0bQ.cbfaaa.bQ.Ya#bfbY.cai#8bf#Oa.a2a.bDbD.4.qaa.4.Y#8bDa.",
+"aa.ca..cbY.c.6#0bfbD.4#a.4.6aba.bv.b.c.Jbf.6#0.cbq.ba.a.bW.6bW#.abaabQ#ObY.4#ObWbfbq#O.ca.bD.8.6"
+};
diff --git a/kblackbox/pics/red.xpm b/kblackbox/pics/red.xpm
new file mode 100644
index 00000000..8e96946e
--- /dev/null
+++ b/kblackbox/pics/red.xpm
@@ -0,0 +1,202 @@
+/* XPM */
+static char *red[] = {
+/* width height num_colors chars_per_pixel */
+" 48 48 147 2",
+/* colors */
+".. c #0c0a0c",
+".# c #fc7674",
+".a c #8c0204",
+".b c #dc3e3c",
+".c c #3c3a3c",
+".d c #ac1614",
+".e c #fcaeac",
+".f c #c42a2c",
+".g c #4c0204",
+".h c #ac0204",
+".i c #fc5a5c",
+".j c #1c1e1c",
+".k c #f44e4c",
+".l c #dc2e2c",
+".m c #fc9294",
+".n c #fccacc",
+".o c #9c0e0c",
+".p c #545654",
+".q c #ec3e3c",
+".r c #c41e1c",
+".s c #2c0204",
+".t c #ac0e0c",
+".u c #9c0204",
+".v c #bc2224",
+".w c #6c0204",
+".x c #dc3634",
+".y c #ec4644",
+".z c #d42224",
+".A c #141214",
+".B c #fc8684",
+".C c #4c4a4c",
+".D c #bc1614",
+".E c #fcbebc",
+".F c #fc6a6c",
+".G c #2c2e2c",
+".H c #fca2a4",
+".I c #fcdadc",
+".J c #646264",
+".K c #c42624",
+".L c #bc0e0c",
+".M c #9c0a0c",
+".N c #d42a2c",
+".O c #ac0a0c",
+".P c #ec3a3c",
+".Q c #1c0204",
+".R c #fc7e7c",
+".S c #940204",
+".T c #e44644",
+".U c #c41a1c",
+".V c #444244",
+".W c #b41e1c",
+".X c #fcb6b4",
+".Y c #5c0204",
+".Z c #fc6264",
+".0 c #242624",
+".1 c #fc5654",
+".2 c #fc9a9c",
+".3 c #fcd2d4",
+".4 c #f43e3c",
+".5 c #cc1e1c",
+".6 c #3c0204",
+".7 c #b40e0c",
+".8 c #a40204",
+".9 c #7c0204",
+"#. c #e43634",
+"## c #f44644",
+"#a c #e43e3c",
+"#b c #b41614",
+"#c c #cc2a2c",
+"#d c #b40604",
+"#e c #fc4e4c",
+"#f c #e43234",
+"#g c #a40e0c",
+"#h c #5c5e5c",
+"#i c #d43234",
+"#j c #1c1a1c",
+"#k c #fc8e8c",
+"#l c #545254",
+"#m c #bc1e1c",
+"#n c #fcc6c4",
+"#o c #fc7274",
+"#p c #343634",
+"#q c #fcaaac",
+"#r c #fce2e4",
+"#s c #6c6a6c",
+"#t c #0c0e0c",
+"#u c #fc7a7c",
+"#v c #8c0604",
+"#w c #c41614",
+"#x c #3c3e3c",
+"#y c #540204",
+"#z c #ac0604",
+"#A c #fc5e5c",
+"#B c #242224",
+"#C c #f45254",
+"#D c #dc3234",
+"#E c #fc9694",
+"#F c #fccecc",
+"#G c #5c5a5c",
+"#H c #ec4244",
+"#I c #c42224",
+"#J c #340204",
+"#K c #ac1214",
+"#L c #9c0604",
+"#M c #740204",
+"#N c #dc3a3c",
+"#O c #ec4a4c",
+"#P c #d42624",
+"#Q c #141614",
+"#R c #fc8a8c",
+"#S c #4c4e4c",
+"#T c #bc1a1c",
+"#U c #fcc2c4",
+"#V c #fc6e6c",
+"#W c #343234",
+"#X c #fca6a4",
+"#Y c #fcdedc",
+"#Z c #646664",
+"#0 c #cc2624",
+"#1 c #bc1214",
+"#2 c #a40a0c",
+"#3 c #d42e2c",
+"#4 c #b40a0c",
+"#5 c #240204",
+"#6 c #fc8284",
+"#7 c #2c2a2c",
+"#8 c #cc1a1c",
+"#9 c #640204",
+"a. c #440204",
+"a# c #840204",
+"aa c #fcbabc",
+"ab c #f44244",
+"ac c #cc2224",
+"ad c #b41214",
+"ae c #e43a3c",
+"af c #f44a4c",
+"ag c #e44244",
+"ah c #b41a1c",
+"ai c #a41214",
+"aj c #940604",
+"ak c #444644",
+"al c #fc6664",
+"am c #fc9e9c",
+"an c #fcd6d4",
+"ao c #a40604",
+"ap c #cc2e2c",
+"aq c #d43634",
+/* pixels */
+".C#W#7.j#W#S.c#j#Q.A.0.c.V#7#B#Q#B.G..#7.c#p.c.V.G.j#B#B#p.0.G#B.cak#S.G#l#B#j.j.0...cak#S#7#B#j",
+"ak#Q#B#S.j.C#B.j#j.G.C#7#7.0ak.j.V#7.G.G.j#j.j.G.V#l.c.0.j#W#j#p#x#7#W.c#j#p.j.A.G#x.C.C#p.0#Bak",
+"#W#W#t.c#Q.V#p.j#7ak#h#p#Q#B.C#Q#s#x.c#W.0#7#j#Q.0#S#hak#B#Q#Q#j.j.G#t#B#p#l.V.G.G#Wak.C#j.0.A.G",
+".j.c.j.G#p.G.c.j.V.J.J#l#7#p.j#p#h#W.g#9#Ma#.a.S.a.aa#.aa#.9.Y#pak.C#Q...pak.p.j.A.j#B.c.0.c#7.j",
+".V#B#W#p.C.j#t#j#x#W#W#x#p#j.G#W#9#9.w.9.9a#.w#M#M.9a#.a.S.a.a.aa##W#t#7#h.C#W#j#Q.0.G#p#p#x#W.j",
+"ak#Q#l.V.0.V#B#j.0.0.0#p.j#B#9.wa#a#.S.S.u.u.S.u.S.u.S.Sa#a#.a.u.S.aa##x.C.C.0.A#7#W#7.j#7ak#B#7",
+".C#7#S#S#W#S#p.j.G#B.0.G.g#9#M.9a#.S.a.9.9a#.S.u.u.h#z.h.8.aa#.S.8.8.S.9a#.c.c.j#j#7.G#x#j#Q.G.p",
+"#S#t#l#l.j#S.c#7#j.j#l.g#M#9.w#M.9.9.9a#.9a#a#a#a#a#.u#z#d.h.ua#.h.h.u.8.u.a.J.0.0#Q.G.c#W.G#j#W",
+"ak#7#7#7#W#W.G#S#W#B#y.w.w.w#M.9a#a#.aa#.a.Sa#.a.u.L.5.z#1.h.u.a.S.L#d.u.8.u.9#B#j#j#p.C#W.j.j#j",
+".C.Cak.0#S#S#x#7ak#y#M.w.w#M.9a#a#.a.a.a.a.a.S.u.N#H#f#w.h.u.S.a.S.8.L.h.h.8.8a##W#t#j#x#7#Q.A#W",
+"#B#S#lak#W#S#W.G.g#9.9#M.9a#a#a#.a.u.S.a.S.S.8#z#A#V#4.S.u.h.8.L.l.L#w.L.8.u.u.Sa#.j...0#t.C#p#B",
+"#7#j#p.G#j#B#Ba..g.Y.w#M.9a#a#.a.S.S.Sao.D#Tae#V.l.u.8#6.X.Zal.P.i.Pac#w#4.h.u.u.S.w.0.c#p#h#7.0",
+".j#j.0.j#B#W.0#y#y.g#M.9a#.a.a.S.S.uao#b.K#D.k.8.u.h.Z.E#8#8#d#P.#.F.l.L#4.h.h.8.S.a#7#Q#7#j#W.0",
+".j.j#j.V#W#W.g.Y.w#9.w.9a#.9a#.S.u#L#2.u.8.8#zae#u#k.X.L.8.u.u.h#z.4###w#1.L#d.8.ua##M#7.j.c#S#7",
+".j#B.0.V#x.G.g.w#9#M.9#Ma#.a.a.a.a#L.8.7#I#c#3#I.v#a#e.L#4.L#z.8.u.5.Z.l#w#w#4.8.S.aa##7#W.V.p.c",
+"#B.0#7.0ak#J.g.Y.w.9a#.9a#.S.S.u#L#2ao.N#K#bah#m#I#i.P.z#u.X.I.P.S.h.R#D.U#w#d.8.u.a.a#M#Sak#S#W",
+".G.A.c.0#W#y#9.Y#M.aa#.9.a.u.S.uao.O.O#c#K.M#b#I#c#.#f.Ran#Uan#V.u.uab.q.7.O#4.u.S.Sa#.a#W.p#h.c",
+"#j#j#p#p#J.g#9#9.9a#.aa#.a#L.uaoao.D#c#m.M#g#g#mae#e.i.H#Y#F.X.E.h.8#w.L#d.7#1.8.S.Sa#.a#9.j#G.C",
+".0#B.0.c.ga..Y.w.9a#a#a#.a.a#2#K#Tah#iah.M#K.b#u.##V.H#naaam#X#q#8#4.U.7#z#1#1.h.S.Sa#a#.w.A.V.J",
+".c#x.j#l#y#y#9.w#M.9a#a#.aa#.a#L#g#K.W.vaqaq.i.n#U#o.n.I.eaa.3.H#e#1#8.7#4.8.8#d.S.S.S.a.9.Aak#l",
+".G#l#j#x#y#9.Y#9.w.w#Ma#.a.a.Sajajai#K#m#u#R.2.E#6aa#U.I#r#Y.3.e#e#8#4.h.h.u.u.8.8.u.u.Sa#.j#pak",
+"#S#W.A#S#J#y#y#9.w.w.9.9a#.S#Lad#Tai#gai.W.i#q#Eamaa#X.X.naa.3.I.B#w#d.8.8.8.u.S.a.u.S.aa##B#p.0",
+"#j.0#Q#B.6.6#y.Y#9.w#M.9.a.u.t.x.yaf.o#g#m.Kaa#E#q#6#V.2#q.2#Y.H#R#.#4.L.8.S.u.aa#.8.aa#a##B.c#B",
+"#W#B#B.j#J.ga..Y#9#9.9a#.a#2#H#V#6#Aai.o.d.d.e.2.m#ual.n#Y#6.2#F.n.H#o.#.r.8.a.a.9a#.9.wa#.J.G.0",
+"#Q#t#j#7#5#ya.#y.Y#y.w#M.aad#mal#6.B#K.M.Magaa.2#C.kam.nan#k#Oag.y#N.i#Dad.S.S.aa#a#.9.Y.9#x.0#j",
+".j#B#B#j.Q#ya.a..g#y.Y#M.a#K#L.v#E#R#o.i#6#E#V.bap#R.X.3#6##ap#I#m#T#b#2.S.u.aa#a#a#.9.w.w#j#j.j",
+"#Q#W#p.j.s#9a..6.g#y#y#9a#.S.S.M#mafaf.T#O#i.Wah.F#6.#.Bal#D.y.y#D.N.t.u.S.S.aa#a#.a.9a#.a.C#7.0",
+"#7#7#W#7a..w.6.6.g#y.Y#9a#.Sa#a#.a#v.a.M#g#g.d#iaeaqah.K.1.Z#A#A#.#Dad.8.u.Sa#.a.S.S.S.9.9#B.A#p",
+".p#Q.j#7a.a..Y.6.g#y#9#y.9#La#a#.9a#a#.a.a.d.v#c#0.Kah.d.f#Hae#2#Lao.t#z.u.S.u.S.u.a.S.9.w.0.c#j",
+"#W#7#t#j#5#J#ya.#y#9.Y.Y.w#2a#a#.9a#.a#v#L#I.v#b#i#cahah.K.d#L.a.S.S.S.S.u.S.u.u.u.u.a.9.Y#Q.A.j",
+".G#7#p#S#G.s.g#y.Y#9.Y#y.S#g.S#M#Ma#.a#K#m.v.Maj.M.d.K#I.d#2.a#L#K#L.a.a.a.S.S.S.S.S.9.w#j#j#B#p",
+".c#j#B#p#S.sa.#y#y.Y.Y#9.a.a.9.w.w.9.S#g.M.Sa#aj.aaj.M#g#g#2.Mad.U.D.O.Sa#.a.S.S.S.a#M#y.c#7#p#G",
+".c.0...V#7#pa.#y.Y#y#9.w#M.9.w#9#9.9.a.aaja#.a.M#K#La#.S#2#K.t.O.t.7.O.S.9.S.a.aa#.w#M#W#B.G#Q.G",
+".j#B#j#x.j#j#5.6.g.Y#9.w.w#9.w.w#9#Ma#.a#g.S.9a##K#b#g#2#g.O#gao.u#L.S#M.9.aa##M.w.w.Y#7#j.j.c.c",
+"ak#S.G#7#W.V#S.6#Ja..Y#9#9.Y#9.w#9.9.9a##Laj#M.a#L#2#2ao#L#L.Sa#.9.a#M#M.9.9#M.w#9#y.j.A.c.G#B#p",
+"#j#W.c.c.V#Q#W#J.s.6.6#y#y#y#9#M#Ma#a#a#a#a##M#M#L.M#L#L.u.a.9#M#M#M.w.w#M.9#y.Y.Y.g.G#7#7.c#B#x",
+"#j.V.j.j#l#W.G#t#J#J#Ja..g#y.Y.w#M#M.9#M#M#M#M.9#L#2#L#L#L.u#M#M#M#M#9#9.w#9.Y.Y#y.J#B.G.G#B#t#p",
+"#W.0#x.0#7.G#W#7.V.Qa..6a.#y.Y.Y#9#9.w#M#M#M.w.9.aao#L.S#L#L.u.S.a.w#9#9#M.9.Y.Y#p.p.j.c#x#Q#j#7",
+".c.0#B.0#j#x#W#Q#x.c#5.6a..g#y#y.Y#9#9.w.w#M#M#M.9.S.S.9.a.aa#.S.a.a.w#9.9#M.Y#j#j#l.G#j#j#j#7#p",
+"#x#j#jak#p#j#p.A.C.C#B#5#J.6.g.Y.Y#9.w#9#9#M.9.aa#.9.Y.Y#9#9#9.9a#.9#y.Y.g.g.c.j.j#W#l.0#p.0.0#p",
+"#l.0#p#W#x#W#7.0#xak#p.0#5.s.6a..Y.Y#9.w.w.w.Y#y.g#y.g.g.g#y.g#Ma#.Y.ga.#J.C#p#7.C#p#x.0#7ak.p.0",
+"#S#p#Q#W.0#Q.A.A.0#Q#j.c#G.J#5.6.g#y#y.Ya.a..g.Y#y.Y.Y#y#y.ga..w#9a.#J.V#W#W#S.pak#Q.c.c.0#l.C#S",
+".c.G#B.j#x#p#7#Q#7#p#W#t.cak#W#7#Ja.#J#J#J.6a.#9.w.Y.g#y.g.6.Y.g.6#Q#7.j#B.0.c.p.C#B#S#W.jak.p.V",
+"#B#t#S.C.0.A#7.V.G.0#7#x.0.A#7.c#x#B#5.Q#J.g#J.6.g.6a..6#J.6#J#B#W#B#p#l.V.V.G.V#j.c.c.G.j.0#pak",
+"#j#7#B.j#B.0.j#S.c.j#W.A#p#p.0.G#B#G.J#7.A.0.G...G#j#W.G#W.c#7.j#W#B#B.p.p#l#S#B.0#l#W.0#B.j.A.j",
+".0#Q#W#W.0#7#W#p#j#W#l#W.Vak#7#j#x.p#l.V.G#j.j#j#W#W#Q#Q#Q#x#j.j.0.0.0#Bak#l.G.j#B.j.0.C.C#W#B#Q",
+"#W#7.j#j#W.c#W#j.j.Gak.V#j#Z.V#j.V#l#lak#p.A#Q.c.0.0#j#x#W.j#7.0.p.V.G#t#W#l.V.0#j#l#S#S.C.V#W#7",
+"#7.j.C.c#x#t.0.G.p#W#pak.c.G.j#Q#7.A#x.0#j#Q.c#hak#x#W.A#x#B.c#p#x#G.C#x#p.C#x.c#Q#h#lak#B#p.G.j"
+};
diff --git a/kblackbox/pics/white.xpm b/kblackbox/pics/white.xpm
new file mode 100644
index 00000000..06c38cec
--- /dev/null
+++ b/kblackbox/pics/white.xpm
@@ -0,0 +1,100 @@
+/* XPM */
+static char *white[] = {
+/* width height num_colors chars_per_pixel */
+" 48 48 45 1",
+/* colors */
+". c #9e9e9e",
+"# c #9f9f9f",
+"a c #a0a0a0",
+"b c #a1a1a1",
+"c c #a2a2a2",
+"d c #a3a3a3",
+"e c #a4a4a4",
+"f c #a5a5a5",
+"g c #a6a6a6",
+"h c #a7a7a7",
+"i c #a8a8a8",
+"j c #a9a9a9",
+"k c #aaaaaa",
+"l c #ababab",
+"m c #acacac",
+"n c #adadad",
+"o c #aeaeae",
+"p c #afafaf",
+"q c #b0b0b0",
+"r c #b1b1b1",
+"s c #b2b2b2",
+"t c #b3b3b3",
+"u c #b4b4b4",
+"v c #b5b5b5",
+"w c #b6b6b6",
+"x c #b7b7b7",
+"y c #b8b8b8",
+"z c #b9b9b9",
+"A c #bababa",
+"B c #bbbbbb",
+"C c #bcbcbc",
+"D c #bdbdbd",
+"E c #bebebe",
+"F c #bfbfbf",
+"G c #c0c0c0",
+"H c #c1c1c1",
+"I c #c2c2c2",
+"J c #c3c3c3",
+"K c #c4c4c4",
+"L c #c5c5c5",
+"M c #c6c6c6",
+"N c #c7c7c7",
+"O c #c8c8c8",
+"P c #c9c9c9",
+"Q c #cacaca",
+/* pixels */
+".aefbgjl.jtledrehhigdfkmrnehqkoffilj#ehrgefdaecd",
+"abgmennigjiiichejkkyJnpglnkprkpsIFGrmcmptrleacc.",
+"edcbkCtGCing#mIHINLLHLHjgGKNIILADIGJGCangjxFxumw",
+"srlxyzHzFxIAGFLLGKJIJHILNLLIMFFIFJJDFFyDxptxzxqn",
+"mwopxAwCzCyLFGDNLMNEFILOMOKFIxGIGLGBKIDFHysqutzi",
+"usnEExCGEyGMuDHilsirFMMCyKGFIDxsBNJECEBDIzxptumu",
+"qwyykvgonihhpoptsssvqltvurwNIFGtqkJFICDCDgdjgios",
+"if#ilefjiehojprpxquqjvvuxstkrCBxBsrhrljmrtqljfpf",
+"iebkjjqfmkrwztsvqxwrGtsuuxyutqotvjnmgiiipslndidi",
+"fcptmgpBpvGJyzCyFCwBDrmppyqpnkovposormdilkuomwnd",
+"vAtmtDDyEBMGCGAuBGMMHONMPMkINNMMKNHFJBFFmBurxqAw",
+"uDwtuCBGADJzwJJLKONNNPPPOOMNPNPKLMLNGJJGDxEmwtBp",
+"rFwGyyFxHDDJAHEMNPNNPPNNOOKNOPNIPMKKHHKLAGwuyEsv",
+"xArkjvzyrzvGDIIFHLHMPPOPNPuunwuzqOKJIAIKIwtCDlvu",
+"mrnwtusxqDvuwuuwltuxDmwGxtFxFCyvCtBBowilzJxuBktp",
+"jpivtAuACsDCBHEFvBzwwxBDvyFIGzEEBCzvzDnfnmwAsqyv",
+"msmxoryqtvywEutuyBCHFCFDGCyNNLHzzxDACwvtklhqmtso",
+"wpklzBAFCxDEttJKMJMOPMMMQOQQPLNCECzzCABCGsrnrprl",
+"tDyxvwxFyAEEFJKCOJFONNNPOQPQOOQOLGHGHBwIJKAEAlyt",
+"mCAvvvDJwsACHJPGMNFMLNPOQOPNNOPPKDxEExHIJCFHvirw",
+"uwsvyuAFxwCJEJKIKLHJLMQNQLDMINPGEvHJFHIIFHuDupnm",
+"xtxxCvszAGDAEHIDKHGMNQNNONIIFJPJBJNEHFvEzxvHxtpv",
+"sBBvruxpsGwKEELDHMNDGyyGIHKIBGHGILKFBuGzAAntzsBx",
+"twyxlqCqIAKKvEDJIKEKFJIIMOJINELJKIOHstyJyEynryBw",
+"rslylqqsFGLExGzHKHMCMKPPIONMMGDJDMIJKuABBptzzsBy",
+"yqnprxCzutGMBEDCFJINIIKIIQJGEwwQHNHGCsrrDHFrzovf",
+"tqjrtvAzyoAFMEDEEGMNNLCDDHDEJCECEEuDzAxDzzuqpnmj",
+"oskqzyGwutuvEDDHuKGINJKDEEBGEEHDACvxzyBysCrqrwlo",
+"tBvumruxDpzBFKyAwFNMFBPPOQHNPNIFBvIHByECJyAqyvpw",
+"uEDCzBvByKJyEEIKJCGMJLOPPQPOQOIIFPJIGGExFEyCtArv",
+"rtCAAxAEJECGzNKIMMLLJQPPOOOONKPFKIPMIEBFDJHEBxuw",
+"xsHGxxxFAyxAKOKDPPNKIKLQLJOOPLPNLHALOyHFEJzEBzqz",
+"ghkeDtsyHKruqMMJDwNyrEPPOMPFAIEwrBwoJJEIzuppsxrq",
+"hmpkkhsolrsvsDywwGxzFHzDoCGFyAAmrxoErAxuvslyvskq",
+"igkjkntygplnwrwABGvHzIvssytusDuAwqAzuyrshnlAtowg",
+"qqouloxxywlgpBvzEFABBwwspxzuomqyPJxupgxrvpmvojnh",
+"vwikzgwCEEFHMgitruxuszNPNOqrPKLOKJKGJGxpspCztwoh",
+"yDwirCtzAJNJLMKMNMJJOOONNKOKMONLNLFJGEDGEFFttptr",
+"uByvvAvzyDKHLHKKOHOKNLNPPJPMJFNJJIEILHAGEDxAwozz",
+"vpwxssvznoIJKIFGELINNFJMEHNOLMMOJHHBjpGwDCzsuwBy",
+"#avzxjqixhkmjJGBkhmrttqyvxqxxLrvvqlmioqsxxDBvyuu",
+"phghddtolkmkilpqmyjtqtnnBsswDqvrswhgttmrqqvpjhdc",
+"hdffkporpwskmupqfjshwsuugppuxkkpikmkhmmlgnjeejc.",
+"dceelgkkvtjllqqrhtslnnniedke#ekorefeIzkgblcdhdgd",
+"nvxBxglcnifGqdhFHMHLHIIJHDljmipKHKGEzzzEuhbg#wsy",
+"ouwuwzqEDEyFEADAwFHIJNEFzIFJIGJICCEzBDFswpAwEvDw",
+"osuIzFuECvDADBHGGJIJIJKDFKIGGHExCCJxzDBwstCyFEwr",
+"tpvjzBtvCABHFEDEGBoHfeiILILLGKGAEHGyClgcBwGFuuie"
+};
diff --git a/kblackbox/util.cpp b/kblackbox/util.cpp
new file mode 100644
index 00000000..7282fe41
--- /dev/null
+++ b/kblackbox/util.cpp
@@ -0,0 +1,68 @@
+//
+//
+// KBlackBox
+//
+// A simple game inspired by an emacs module
+//
+// File: util.cpp
+//
+// The implementation of the RectOnArray class
+//
+
+#include "util.h"
+
+RectOnArray::RectOnArray( int newWidth, int newHeight )
+{
+ w = newWidth;
+ h = newHeight;
+ array = new ArrayType[w*h];
+}
+
+RectOnArray::~RectOnArray()
+{
+ delete[] array;
+}
+
+/*
+ Size info...
+*/
+
+int RectOnArray::width() { return w; }
+int RectOnArray::height() { return h; }
+
+/*
+ Utility function for mapping from 2D table to 1D array
+*/
+
+int RectOnArray::indexOf( int col, int row ) const
+{
+ return (row * w) + col;
+}
+
+/*
+ Return content of cell
+*/
+
+ArrayType RectOnArray::get( int col, int row )
+{
+ return array[indexOf( col, row )];
+}
+
+/*
+ Set content of cell
+*/
+
+void RectOnArray::set( int col, int row, ArrayType type )
+{
+ array[indexOf( col, row )] = type;
+}
+
+/*
+ Fill all cells witj type
+*/
+
+void RectOnArray::fill( ArrayType type )
+{
+ int i;
+ for (i = 0; i < w*h; i++) array[i] = type;
+}
diff --git a/kblackbox/util.h b/kblackbox/util.h
new file mode 100644
index 00000000..9effb880
--- /dev/null
+++ b/kblackbox/util.h
@@ -0,0 +1,42 @@
+//
+//
+// KBlackBox
+//
+// A simple game inspired by an emacs module
+//
+// File: util.h
+//
+// The definition of the RectOnArray class
+//
+
+#ifndef UTIL_H
+#define UTIL_H
+
+/*
+ This is used for gameBoard and graphicBoard fields
+*/
+
+#define ArrayType int
+
+class RectOnArray
+{
+public:
+ RectOnArray( int w, int h );
+ ~RectOnArray();
+
+ int get( int col, int row );
+ void set( int col, int row, ArrayType type );
+ void fill( ArrayType type );
+
+ int width();
+ int height();
+
+private:
+ int indexOf( int col, int row ) const;
+
+ int w;
+ int h;
+ ArrayType *array;
+};
+
+#endif // UTIL_H
diff --git a/kblackbox/version.h b/kblackbox/version.h
new file mode 100644
index 00000000..f959cc8c
--- /dev/null
+++ b/kblackbox/version.h
@@ -0,0 +1 @@
+#define KBVERSION "0.3.0"