[Pkg-wmaker-commits] [wmbubble] 13/207: Half-merge in TAIL from my maintained version. Massive changes: remove gtk1, replace with wmxp library I wrote for this dockapp and resize it to 58x58 instead of 56x56.
Doug Torrance
dtorrance-guest at moszumanska.debian.org
Mon Aug 24 04:17:51 UTC 2015
This is an automated email from the git hooks/post-receive script.
dtorrance-guest pushed a commit to branch master
in repository wmbubble.
commit cdd98616fabdd74f6eab0fd50e048b0b522ef656
Author: Robert Jacobs <rnjacobs at mit.edu>
Date: Tue Aug 30 00:37:01 2011 -0700
Half-merge in TAIL from my maintained version. Massive changes: remove
gtk1, replace with wmxp library I wrote for this dockapp and resize it
to 58x58 instead of 56x56.
---
Makefile | 21 +-
bubblemon.c | 833 ++++++++++++++++++++-------------------------------
clockfont.txt | 36 +++
debian/README.Debian | 7 +
debian/changelog | 125 ++++++++
debian/compat | 1 +
debian/control | 19 ++
debian/copyright | 15 +
debian/dirs | 2 +
debian/docs | 2 +
debian/menu | 2 +
debian/rules | 64 ++++
debian/wmbubble.1x | 77 +++++
include/bubblemon.h | 30 +-
include/clockfont.h | 19 ++
include/frame.xbm | 42 +++
include/numbers-2.h | 3 +
misc/digits.xpm | 15 +
misc/load_58.c | 370 +++++++++++++++++++++++
misc/load_58.xcf | Bin 0 -> 5358 bytes
misc/load_58.xpm | 66 ++++
misc/mem_58.c | 371 +++++++++++++++++++++++
misc/mem_58.xcf | Bin 0 -> 5572 bytes
misc/mem_58.xpm | 66 ++++
misc/numbers.xcf | Bin 0 -> 1237 bytes
misc/numbers.xpm | 14 +
wmx11pixmap.c | 139 +++++++++
wmx11pixmap.h | 20 ++
28 files changed, 1834 insertions(+), 525 deletions(-)
diff --git a/Makefile b/Makefile
index ee9ad52..b1c0ac0 100644
--- a/Makefile
+++ b/Makefile
@@ -16,33 +16,33 @@ USER_CFLAGS = -O3 -ansi -Wall
# USER_CFLAGS = -ansi -Wall -pg -O3 -DPRO
# test coverage cflags
# USER_CFLAGS = -fprofile-arcs -ftest-coverage -Wall -ansi -g -DPRO
-BUILD_CFLAGS = `gtk-config --cflags`
+BUILD_CFLAGS =
CFLAGS = $(USER_CFLAGS) $(BUILD_CFLAGS) ${EXTRA}
BINARY=bubblemon
SHELL=sh
OS = $(shell uname -s)
-OBJS = bubblemon.o
+OBJS = bubblemon.o wmx11pixmap.o
CC = gcc
# special things for Linux
ifeq ($(OS), Linux)
OBJS += sys_linux.o
- LIBS = `gtk-config --libs | sed "s/-lgtk//g"`
+ LIBS = -lX11
INSTALL = -m 755
endif
# special things for FreeBSD
ifeq ($(OS), FreeBSD)
OBJS += sys_freebsd.o
- LIBS = `gtk-config --libs | sed "s/-lgtk//g"` -lkvm
+ LIBS = -lX11 -lkvm
INSTALL = -c -g kmem -m 2755 -o root
endif
# special things for OpenBSD
ifeq ($(OS), OpenBSD)
OBJS += sys_openbsd.o
- LIBS = `gtk-config --libs | sed "s/-lgtk//g"`
+ LIBS = -lX11
endif
#special things for SunOS
@@ -65,7 +65,7 @@ ifeq ($(OS), SunOS)
endif
CFLAGS = $(USER_CFLAGS) $(BUILD_CFLAGS) ${EXTRA}
OBJS += sys_sunos.o
- LIBS = `gtk-config --libs` -lkstat -lm
+ LIBS = -lX11 -lkstat -lm
INSTALL = -m 755
endif
@@ -76,6 +76,15 @@ all: $(BINARY)
$(BINARY): $(OBJS)
$(CC) $(CFLAGS) -o $(BINARY) $(OBJS) $(LIBS)
+bubblemon.o: bubblemon.c wmx11pixmap.h include/bubblemon.h \
+ include/sys_include.h include/clockfont.h include/numbers-2.h \
+ include/ducks.h include/digits.h misc/load_58.c misc/mem_58.c \
+ misc/numbers.xpm
+
+wmx11pixmap.o: wmx11pixmap.c wmx11pixmap.h
+
+sys_%.o: sys_%.c include/bubblemon.h include/sys_include.h
+
clean:
rm -f $(BINARY) *.o *.bb* *.gcov gmon.* *.da *~
diff --git a/bubblemon.c b/bubblemon.c
index 46bade6..197d9d0 100644
--- a/bubblemon.c
+++ b/bubblemon.c
@@ -1,6 +1,11 @@
-/* BubbleMon dockapp 1.46r
+/* BubbleMon dockapp 1.50r
+ *
+ * Todo: merge in wmfishtime/bubblefishymon, reduce number of
+ * compilation-time settings, make more things configurable via xresources.
*
* - dockapp for Window Maker/Blackbox/E/Afterstep/SawBabble
+ * - Code from Robert Jacobs <rjacobs at eamp.org>, 2010-2011
+ * - Code from the debian maintainers, 2005-2009
* - Code outside of bubblemon_update copyright 2000, 2001
* timecop at japan.co.jp
* - oleg dashevskii <od at iclub.nsu.ru> made changes to collect memory
@@ -13,11 +18,6 @@
* - Phil Lu <wplu13 at netscape.net> Dan Price <dp at rampant.org> - Solaris/SunOS
* port
* - Everything else copyright one of the guys below
- *
- * TODO: Anything else? Add fish?
- *
- * *************************************************************************
- *
* Bubbling Load Monitoring Applet
* - A GNOME panel applet that displays the CPU + memory load as a
* bubbling liquid.
@@ -44,7 +44,7 @@
*/
#define _GNU_SOURCE
-#define VERSION "1.46r"
+#define VERSION "1.50r"
/* general includes */
#include <stdio.h>
@@ -55,11 +55,9 @@
#include <string.h>
/* x11 includes */
-#include <gdk/gdk.h>
-#include <gdk/gdkx.h>
+#include "wmx11pixmap.h"
#include <X11/Xresource.h>
-#include "include/master.xpm"
#include "include/bubblemon.h"
#include "include/sys_include.h"
@@ -73,19 +71,19 @@
#include "include/digits.h"
#endif
#if defined(ENABLE_MEMSCREEN)
-#include "include/load_screen.h"
-#include "include/mem_screen.h"
+#include "misc/load_58.c"
+#include "misc/mem_58.c"
+#include "misc/numbers.xpm"
#endif
/* #define DEBUG_DUCK 1 */
#ifndef NAME
-#define NAME "bubblemon"
+#define NAME "wmbubble"
#endif
/* local prototypes *INDENT-OFF* */
static void bubblemon_setup_samples(void);
-static void bubblemon_setup_colors(void);
static void bubblemon_allocate_buffers(void);
static void bubblemon_update(int proximity);
static void make_new_bubblemon_dockapp(void);
@@ -94,14 +92,12 @@ static void bubblemon_session_defaults(void);
static int get_screen_selection(void);
#if defined(ENABLE_CPU) || defined(ENABLE_MEMSCREEN)
/* draw functions for load average / memory screens */
-static void draw_pixel(unsigned int x, unsigned int y, unsigned char *buf,
- unsigned char *c);
+static void draw_pixel(unsigned int x, unsigned int y, unsigned char *buf, char *c);
static void draw_history(int num, int size, unsigned int *history,
unsigned char *buf);
-static void draw_digit(int srcx, int srcy, int destx, int desty);
+static void draw_digit(int num, unsigned char * whither, unsigned char red, unsigned char grn, unsigned char blu);
static void draw_string(char *string, int x, int y, int color);
-static void draw_cpudigit(const int what, const int where,
- unsigned char *kit);
+static void draw_cpudigit(int what, unsigned char *whither);
static void render_secondary(void);
static void realtime_alpha_blend_of_cpu_usage(int cpu, int proximity);
@@ -146,6 +142,8 @@ int memscreen_megabytes = 0;
int shifttime = 0;
+int pale = 0;
+
#define INT_VAL 0
#define DOUBLE_VAL 1
#define COLOR_VAL 2
@@ -295,20 +293,12 @@ int main(int argc, char **argv)
#ifdef PRO
int cnt = 25000;
#endif
- GdkEvent *event;
+ XEvent event;
#ifdef FPS
o = f = y = 0;
#endif
- /* initialize GDK */
- if (!gdk_init_check(&argc, &argv)) {
- fprintf(stderr,
- "GDK init failed, bye bye. Check \"DISPLAY\" variable.\n");
- exit(-1);
- }
- gdk_rgb_init();
-
/* dynamically generate getopt string depending on compile options
* we are going to borrow 256 char string from exec function, and
* also build up the "compiled features" string */
@@ -356,36 +346,13 @@ int main(int argc, char **argv)
memscreen_enabled = 0;
break;
case 'p':
- {
+ /* p stands for PALE changes the colors from BLUE and RED to PERIWINKLE and CYAN */
/* no sense having -p if memscreen isn't compiled in, right?
* what we are going to do is to change the colors as follows:
*
- * (48,140,240) replaced with (158,196,237) - more pale blue
- * (237,23,23) replaced with (0,255,233) */
- unsigned char *p = mem_screen;
-
- while (p < mem_screen + sizeof(mem_screen))
- if (*p == 48) { /* hopefully no other colors beginning with 48 */
- *p++ = 158;
- *p++ = 196;
- *p++ = 237;
- } else if (*p == 237) { /* hopefully no other colors beginning with 237 */
- *p++ = 0;
- *p++ = 255;
- *p++ = 233;
- } else
- p += 3;
-
- p = load_screen;
-
- while (p < load_screen + sizeof(load_screen))
- if (*p == 48) { /* hopefully no other colors beginning with 48 */
- *p++ = 158;
- *p++ = 196;
- *p++ = 237;
- } else
- p += 3;
- }
+ * normal numbers- (48,140,240) replaced with (158,196,237) - more pale blue
+ * was red, now cyan? (237,23,23) replaced with (0,255,233) */
+ pale = 1;
break;
case 'k':
memscreen_megabytes = 1;
@@ -401,12 +368,22 @@ int main(int argc, char **argv)
}
}
- argc -= optind;
- argv += optind;
+ if (mem_screen.width != mem_screen.height || mem_screen.width != BOX_SIZE ||
+ load_screen.width != load_screen.height || load_screen.width != BOX_SIZE) {
+ fprintf(stderr, "mem_screen (%dx%d) or load_screen (%dx%d) dimensions don't match applet dimensions (%dx%d)",
+ mem_screen.width,mem_screen.height,load_screen.width,load_screen.height,BOX_SIZE,BOX_SIZE);
+ return 1;
+ }
/* zero data structure */
memset(&bm, 0, sizeof(bm));
+ /* initialize Ximage */
+ bm.xim = initwmX11pixmap(NAME,argc,argv);
+
+ argc -= optind;
+ argv += optind;
+
#if defined(__FreeBSD__) || defined(__linux__)
if (init_stuff())
exit(-1);
@@ -423,27 +400,22 @@ int main(int argc, char **argv)
#else
while (1) {
#endif
- while (gdk_events_pending()) {
- event = gdk_event_get();
- if (event) {
- switch (event->type) {
- case GDK_DESTROY:
- gdk_exit(0);
- exit(0);
- break;
- case GDK_BUTTON_PRESS:
- if (event->button.button == 3) {
+ while (XPending(wmxp_display)) {
+ XNextEvent(wmxp_display,&event);
+ switch (event.type) {
+ case ButtonPress:
+ if (event.xbutton.button == 3) {
bm.picture_lock = bm.picture_lock ? 0 : 1;
break;
}
- if (event->button.button <= argc) {
+ if (event.xbutton.button <= argc) {
snprintf(execute, 250, "%s &",
- argv[event->button.button - 1]);
+ argv[event.xbutton.button - 1]);
system(execute);
}
break;
#if defined(ENABLE_CPU) || defined(ENABLE_MEMSCREEN)
- case GDK_ENTER_NOTIFY:
+ case EnterNotify:
/* mouse in: make it darker, and eventually bring up
* meminfo */
proximity = 1;
@@ -451,7 +423,7 @@ int main(int argc, char **argv)
if (!bm.picture_lock)
bm.screen_type = get_screen_selection();
break;
- case GDK_LEAVE_NOTIFY:
+ case LeaveNotify:
/* mouse out: back to light */
proximity = 0;
break;
@@ -460,7 +432,6 @@ int main(int argc, char **argv)
break;
}
}
- }
#ifndef PRO
usleep(100000);
#else
@@ -487,12 +458,26 @@ int main(int argc, char **argv)
/* *INDENT-ON* */
/* actually draw the screen */
-#ifndef BLACKBOX
- gdk_draw_rgb_image(bm.win, bm.gc, 4, 4, 56, 56,
- GDK_RGB_DITHER_NONE, bm.rgb_buf, 56 * 3);
-#endif
- gdk_draw_rgb_image(bm.iconwin, bm.gc, 4, 4, 56, 56,
- GDK_RGB_DITHER_NONE, bm.rgb_buf, 56 * 3);
+ int xx,yy;
+ unsigned char * from=bm.rgb_buf;
+
+ for (xx=0;xx<BOX_SIZE*3;xx++) {
+ from[xx]/=4;
+ from[xx+BOX_SIZE*(BOX_SIZE-1)*3]=(255+from[xx+BOX_SIZE*(BOX_SIZE-1)*3])/2;
+ }
+
+ for (yy=0;yy<BOX_SIZE*BOX_SIZE*3;yy+=BOX_SIZE*3) {
+ from[yy ]/=4; from[yy+1]/=4; from[yy+2]/=4;
+ from[yy+(BOX_SIZE-1)*3 ]=(255+from[yy+(BOX_SIZE-1)*3] )/2;
+ from[yy+(BOX_SIZE-1)*3+1]=(255+from[yy+(BOX_SIZE-1)*3]+1)/2;
+ from[yy+(BOX_SIZE-1)*3+2]=(255+from[yy+(BOX_SIZE-1)*3]+2)/2;
+ }
+
+ for (yy=0;yy<BOX_SIZE;yy++)
+ for (xx=0;xx<BOX_SIZE;xx++,from+=3)
+ wmPutPixel(bm.xim,xx,yy,from[0],from[1],from[2]);
+
+ RedrawWindow(bm.xim);
#ifdef ENABLE_MEMSCREEN
/* update graph histories */
if (memscreen_enabled)
@@ -513,13 +498,13 @@ static int get_screen_selection(void)
if (first_time) {
first_time = 0;
- lshift_code = XKeysymToKeycode(GDK_WINDOW_XDISPLAY(bm.win),
+ lshift_code = XKeysymToKeycode(wmxp_display,
XStringToKeysym("Shift_L"));
- rshift_code = XKeysymToKeycode(GDK_WINDOW_XDISPLAY(bm.win),
+ rshift_code = XKeysymToKeycode(wmxp_display,
XStringToKeysym("Shift_R"));
}
- XQueryKeymap(GDK_WINDOW_XDISPLAY(bm.win), keys);
+ XQueryKeymap(wmxp_display, keys);
#if 0
if (0) { /* debug */
@@ -549,83 +534,6 @@ static int get_screen_selection(void)
/* This is the function that actually creates the display widgets */
static void make_new_bubblemon_dockapp(void)
{
-#define MASK GDK_BUTTON_PRESS_MASK | \
- GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK
-
- GdkWindowAttr attr;
- GdkWindowAttr attri;
- Window win;
- Window iconwin;
-
- XSizeHints sizehints;
- XWMHints wmhints;
-
- attr.width = 64;
- attr.height = 64;
- attr.title = NAME;
- attr.event_mask = MASK;
- attr.wclass = GDK_INPUT_OUTPUT;
- attr.visual = gdk_visual_get_system();
- attr.colormap = gdk_colormap_get_system();
- attr.wmclass_name = NAME;
- attr.wmclass_class = NAME;
- attr.window_type = GDK_WINDOW_TOPLEVEL;
-
- sizehints.flags = USSize;
- sizehints.width = 64;
- sizehints.height = 64;
-
- bm.win = gdk_window_new(NULL, &attr,
- GDK_WA_TITLE | GDK_WA_WMCLASS |
- GDK_WA_VISUAL | GDK_WA_COLORMAP);
- if (!bm.win)
- fprintf(stderr, "Cannot make toplevel window\n");
-
- attri.width = 64;
- attri.height = 64;
- attri.title = NAME;
- attri.event_mask = MASK;
- attri.wclass = GDK_INPUT_OUTPUT;
- attri.visual = gdk_visual_get_system();
- attri.colormap = gdk_colormap_get_system();
- attri.wmclass_name = NAME;
- attri.wmclass_class = NAME;
- attri.window_type = GDK_WINDOW_TOPLEVEL;
-
- bm.iconwin = gdk_window_new(bm.win, &attri,
- GDK_WA_TITLE | GDK_WA_WMCLASS);
- if (!bm.iconwin)
- fprintf(stderr, "Cannot make icon window\n");
-
- win = GDK_WINDOW_XWINDOW(bm.win);
- iconwin = GDK_WINDOW_XWINDOW(bm.iconwin);
- XSetWMNormalHints(GDK_WINDOW_XDISPLAY(bm.win), win, &sizehints);
-
- wmhints.initial_state = WithdrawnState;
- wmhints.icon_window = iconwin;
- wmhints.icon_x = 0;
- wmhints.icon_y = 0;
- wmhints.window_group = win;
- wmhints.flags =
- StateHint | IconWindowHint | IconPositionHint | WindowGroupHint;
- XSetWMHints(GDK_WINDOW_XDISPLAY(bm.win), win, &wmhints);
-
- bm.gc = gdk_gc_new(bm.win);
-
- bm.pixmap =
- gdk_pixmap_create_from_xpm_d(bm.win, &(bm.mask), NULL, master_xpm);
- gdk_window_shape_combine_mask(bm.win, bm.mask, 0, 0);
- gdk_window_shape_combine_mask(bm.iconwin, bm.mask, 0, 0);
-
- gdk_window_set_back_pixmap(bm.win, bm.pixmap, False);
- gdk_window_set_back_pixmap(bm.iconwin, bm.pixmap, False);
-
- gdk_window_show(bm.win);
-#ifdef KDE_DOCKAPP
- /* makes the dockapp visible inside KDE wm */
- gdk_window_show(bm.iconwin);
-#endif
-
/* We begin with zero bubbles */
bm.n_bubbles = 0;
@@ -633,8 +541,6 @@ static void make_new_bubblemon_dockapp(void)
bubblemon_allocate_buffers();
bubblemon_setup_samples();
-
- bubblemon_setup_colors();
#undef MASK
} /* make_new_bubblemon_dockapp */
@@ -642,14 +548,13 @@ static void make_new_bubblemon_dockapp(void)
* This function, bubblemon_update, gets the CPU usage and updates
* the bubble array and main rgb buffer.
*/
-static void bubblemon_update(int proximity)
-{
+static void bubblemon_update(int proximity) {
Bubble *bubbles = bm.bubbles;
- unsigned int i, loadPercentage, *col, x, y;
- unsigned char *ptr, *buf, *buf_ptr;
- unsigned int aircolor, watercolor, aliascolor;
+ unsigned int i, loadPercentage, x, y;
+ unsigned char reds[3], grns[3], blus[3];
+ unsigned char *ptr, *bubblebuf_ptr;
+ enum bubblebuf_values { watercolor, antialiascolor, aircolor };
unsigned int waterlevels_goal;
- /*int current_waterlevel_goal; */
/* These values are for keeping track of where we have to start
drawing water. */
@@ -657,7 +562,7 @@ static void bubblemon_update(int proximity)
unsigned int real_waterlevel_min, real_waterlevel_max;
/* These values are for keeping track how deep the duck is inside water */
- unsigned int action_min = 56;
+ unsigned int action_min = BOX_SIZE;
static unsigned int last_action_min = 0;
/* Find out the CPU load */
@@ -670,35 +575,31 @@ static void bubblemon_update(int proximity)
#endif /* ENABLE_MEMSCREEN */
/*
- The buf is made up of ints (0-(NUM_COLORS-1)), each pointing out
- an entry in the color table. A pixel in the buf is accessed
- using the formula buf[row * w + column].
- */
-
+ The bubblebuf is made up of int8s (0..2), correspodning to the enum. A
+ pixel in the bubblebuf is accessed using the formula bubblebuf[row * w
+ + column].
+ */
/* y coordinates are counted from here multiplied by 256 */
/* to get actual screen coordinate, divide by 256 */
- buf = bm.bubblebuf;
- col = bm.colors;
waterlevel_max = 0;
- waterlevel_min = MAKEY(56);
+ waterlevel_min = MAKEY(BOX_SIZE);
/* Move the water level with the current memory usage. */
- waterlevels_goal = MAKEY(56) - ((bm.mem_percent * MAKEY(56)) / 100);
+ waterlevels_goal = MAKEY(BOX_SIZE) - ((bm.mem_percent * MAKEY(BOX_SIZE)) / 100);
/* Guard against boundary errors */
waterlevels_goal -= (1 << (POWER2 - 1));
bm.waterlevels[0] = waterlevels_goal;
- bm.waterlevels[55] = waterlevels_goal;
+ bm.waterlevels[BOX_SIZE-1] = waterlevels_goal;
- for (x = 1; x < 55; x++) {
+ for (x = 1; x < BOX_SIZE-1; x++) {
/* Accelerate the current waterlevel towards its correct value */
bm.waterlevels_dy[x] +=
(((bm.waterlevels[x - 1] + bm.waterlevels[x + 1] -
- 2 * bm.waterlevels[x]) * bm.volatility_int) >> (POWER2 +
- 1));
+ 2 * bm.waterlevels[x]) * bm.volatility_int) >> (POWER2 + 1));
bm.waterlevels_dy[x] *= bm.viscosity_int;
bm.waterlevels_dy[x] >>= POWER2;
@@ -709,13 +610,13 @@ static void bubblemon_update(int proximity)
bm.waterlevels_dy[x] = -bm.speed_limit_int;
}
- for (x = 1; x < 55; x++) {
+ for (x = 1; x < BOX_SIZE-1; x++) {
/* Move the current water level */
bm.waterlevels[x] = bm.waterlevels[x] + bm.waterlevels_dy[x];
- if (bm.waterlevels[x] > MAKEY(56)) {
+ if (bm.waterlevels[x] > MAKEY(BOX_SIZE)) {
/* Stop the wave if it hits the floor... */
- bm.waterlevels[x] = MAKEY(56);
+ bm.waterlevels[x] = MAKEY(BOX_SIZE);
bm.waterlevels_dy[x] = 0;
} else if (bm.waterlevels[x] < 0) {
/* ... or the ceiling. */
@@ -736,16 +637,6 @@ static void bubblemon_update(int proximity)
action_min = real_waterlevel_min;
/*
- Vary the colors of air and water with how many
- percent of the available swap space that is in use.
- 32 = (99_numcolors / 3) - 1
- */
-
- watercolor = ((32 * bm.swap_percent) / 100) * 3;
- aliascolor = watercolor + 1;
- aircolor = watercolor + 2;
-
- /*
Draw the air-and-water background
The waterlevel_max is the HIGHEST VALUE for the water level, which is
@@ -760,35 +651,30 @@ static void bubblemon_update(int proximity)
*/
/* Air only */
- memset(buf, aircolor, real_waterlevel_min * 56);
+ memset(bm.bubblebuf, aircolor, real_waterlevel_min * BOX_SIZE);
/* Air and water */
- for (x = 0; x < 56; x++) {
+ for (x = 0; x < BOX_SIZE; x++) {
/* Air... */
for (y = real_waterlevel_min;
- (signed) y < REALY(bm.waterlevels[x]); y++)
- buf[y * 56 + x] = aircolor;
-
+ (signed) y < REALY(bm.waterlevels[x]); y++) /* why the (signed) ? */
+ bm.bubblebuf[y * BOX_SIZE + x] = aircolor;
+
/* ... and water */
for (; y < real_waterlevel_max; y++)
- buf[y * 56 + x] = watercolor;
+ bm.bubblebuf[y * BOX_SIZE + x] = watercolor;
}
/* Water only */
- memset(buf + real_waterlevel_max * 56, watercolor,
- (56 - real_waterlevel_max) * 56);
-
- /*
- Here comes the bubble magic. Pixels are drawn by setting values in
- buf to 0-NUM_COLORS.
- */
+ memset(bm.bubblebuf + real_waterlevel_max * BOX_SIZE, watercolor,
+ (BOX_SIZE - real_waterlevel_max) * BOX_SIZE);
/* Create a new bubble if the planets are correctly aligned... */
if ((bm.n_bubbles < bm.maxbubbles)
&& ((rand() % 101) <= loadPercentage)) {
/* We don't allow bubbles on the edges 'cause we'd have to clip them */
- bubbles[bm.n_bubbles].x = (rand() % 54) + 1;
- bubbles[bm.n_bubbles].y = MAKEY(56) - 256;
+ bubbles[bm.n_bubbles].x = (rand() % (BOX_SIZE-2)) + 1;
+ bubbles[bm.n_bubbles].y = MAKEY(BOX_SIZE) - 256;
bubbles[bm.n_bubbles].dy = 0;
#ifdef DEBUG_DUCK
fprintf (stderr, "new bubble: bubbles[bm.n_bubbles].x = %i\n",
@@ -803,7 +689,7 @@ static void bubblemon_update(int proximity)
bm.waterlevels[bubbles[bm.n_bubbles].x - 1] -= bm.ripples_int;
bm.waterlevels[bubbles[bm.n_bubbles].x] -= bm.ripples_int;
bm.waterlevels[bubbles[bm.n_bubbles].x + 1] -= bm.ripples_int;
- if (bubbles[bm.n_bubbles].x < 53)
+ if (bubbles[bm.n_bubbles].x < (BOX_SIZE-3))
bm.waterlevels[bubbles[bm.n_bubbles].x + 2] -=
bm.ripples_int;
}
@@ -821,8 +707,8 @@ static void bubblemon_update(int proximity)
bubbles[i].y += bubbles[i].dy;
/* is the bubble grossly out of bounds? */
- if (bubbles[i].x < 1 || bubbles[i].x > 54 ||
- bubbles[i].y > MAKEY(56)) {
+ if (bubbles[i].x < 1 || bubbles[i].x > (BOX_SIZE-2) ||
+ bubbles[i].y > MAKEY(BOX_SIZE)) {
#ifdef DEBUG_DUCK
fprintf (stderr, "bubble out of bounds "
"bubbles[%i].x=%i, bubbles[%i].y=%i\n",
@@ -872,71 +758,98 @@ static void bubblemon_update(int proximity)
y = bubbles[i].y;
/*
- Clipping is not necessary for x, but it *is* for y.
- To prevent ugliness, we draw aliascolor only on top of
- watercolor, and aircolor on top of aliascolor.
- */
+ Clipping is not necessary for x, but it *is* for y.
+ To prevent ugliness, we draw antialiascolor only on top of
+ watercolor, and aircolor on top of antialiascolor.
+ */
/* Top row */
- buf_ptr = &(buf[(((REALY(y) - 1) * 56) + 56) + x - 1]);
- if (y > bm.waterlevels[x]) {
- if (*buf_ptr != aircolor) {
- (*buf_ptr)++;
- }
- buf_ptr++;
-
- *buf_ptr = aircolor;
- buf_ptr++;
-
- if (*buf_ptr != aircolor) {
- (*buf_ptr)++;
- }
- buf_ptr += 54;
+ bubblebuf_ptr = &(bm.bubblebuf[(((REALY(y) - 1) * BOX_SIZE) + BOX_SIZE) + x - 1]);
+ if (y >= bm.waterlevels[x]) {
+ if (*bubblebuf_ptr < aircolor)
+ (*bubblebuf_ptr)++; /* water becomes antialias; antialias becomes air for outside corners */
+ bubblebuf_ptr++;
+
+ *bubblebuf_ptr = aircolor;
+ bubblebuf_ptr++;
+
+ if (*bubblebuf_ptr < aircolor)
+ (*bubblebuf_ptr)++;
+ bubblebuf_ptr += BOX_SIZE-2;
} else {
- buf_ptr += 56;
+ bubblebuf_ptr += BOX_SIZE;
}
-
- /* Middle row - no clipping necessary */
- *buf_ptr = aircolor;
- buf_ptr++;
- *buf_ptr = aircolor;
- buf_ptr++;
- *buf_ptr = aircolor;
- buf_ptr += 54;
+
+ /* Middle row - no color clipping necessary */
+ *bubblebuf_ptr = aircolor;
+ bubblebuf_ptr++;
+ *bubblebuf_ptr = aircolor;
+ bubblebuf_ptr++;
+ *bubblebuf_ptr = aircolor;
+ bubblebuf_ptr += BOX_SIZE-2;
/* Bottom row */
- if (y < (MAKEY(56) - 256)) {
- if (*buf_ptr != aircolor) {
- (*buf_ptr)++;
+ if (y < (MAKEY(BOX_SIZE) - 256)) {
+ if (*bubblebuf_ptr < aircolor) {
+ (*bubblebuf_ptr)++;
}
- buf_ptr++;
-
- *buf_ptr = aircolor;
- buf_ptr++;
-
- if (*buf_ptr != aircolor) {
- (*buf_ptr)++;
+ bubblebuf_ptr++;
+
+ *bubblebuf_ptr = aircolor;
+ bubblebuf_ptr++;
+
+ if (*bubblebuf_ptr < aircolor) {
+ (*bubblebuf_ptr)++;
}
}
}
- /* Drawing magic resides below this point */
- ptr = bm.rgb_buf;
- buf_ptr = buf;
- i = 56 * 56;
-
- while (i--) {
- unsigned char *rgb = (unsigned char *) &col[*buf_ptr++];
-#if (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && (__BYTE_ORDER == __LITTLE_ENDIAN)) || defined(_LITTLE_ENDIAN) || (BYTE_ORDER == LITTLE_ENDIAN)
- *ptr++ = rgb[2];
- *ptr++ = rgb[1];
- *ptr++ = rgb[0];
-#else /* big-endian. */
- *ptr++ = rgb[1];
- *ptr++ = rgb[2];
- *ptr++ = rgb[3];
-#endif
- }
+ /*
+ Vary the colors of air and water with how many percent of the available
+ swap space that is in use.
+ */
+#define GET_RED(x) (((x)>>16)&255)
+#define GET_GRN(x) (((x)>> 8)&255)
+#define GET_BLU(x) (((x) )&255)
+
+ reds[watercolor] =
+ (GET_RED(bm.liquid_maxswap) * bm.swap_percent +
+ GET_RED(bm.liquid_noswap) * (100 - bm.swap_percent)) / 100;
+ reds[aircolor] =
+ (GET_RED(bm.air_maxswap) * bm.swap_percent +
+ GET_RED(bm.air_noswap) * (100 - bm.swap_percent)) / 100;
+ reds[antialiascolor] = ((int)reds[watercolor] + reds[aircolor])/2;
+
+ grns[watercolor] =
+ (GET_GRN(bm.liquid_maxswap) * bm.swap_percent +
+ GET_GRN(bm.liquid_noswap) * (100 - bm.swap_percent)) / 100;
+ grns[aircolor] =
+ (GET_GRN(bm.air_maxswap) * bm.swap_percent +
+ GET_GRN(bm.air_noswap) * (100 - bm.swap_percent)) / 100;
+ grns[antialiascolor] = ((int)grns[watercolor] + grns[aircolor])/2;
+
+ blus[watercolor] =
+ (GET_BLU(bm.liquid_maxswap) * bm.swap_percent +
+ GET_BLU(bm.liquid_noswap) * (100 - bm.swap_percent)) / 100;
+ blus[aircolor] =
+ (GET_BLU(bm.air_maxswap) * bm.swap_percent +
+ GET_BLU(bm.air_noswap) * (100 - bm.swap_percent)) / 100;
+ blus[antialiascolor] = ((int)blus[watercolor] + blus[aircolor])/2;
+
+#undef GET_RED
+#undef GET_GRN
+#undef GET_BLU
+
+ ptr = bm.rgb_buf;
+ bubblebuf_ptr = bm.bubblebuf;
+ i = BOX_SIZE * BOX_SIZE;
+
+ while (i--) {
+ *ptr++ = reds[*bubblebuf_ptr];
+ *ptr++ = grns[*bubblebuf_ptr];
+ *ptr++ = blus[*bubblebuf_ptr];
+ bubblebuf_ptr++;
+ }
#ifdef ENABLE_DUCK
if (duck_enabled) {
duck_swimmer((last_action_min <
@@ -945,20 +858,18 @@ static void bubblemon_update(int proximity)
}
#endif
- /* damn, thats ugly. Of course, the first solution that comes to mind
- * about this isn't the right one :) */
+#if defined(ENABLE_CPU) || defined(ENABLE_MEMSCREEN)
+ if (
+#ifdef ENABLE_CPU
+ cpu_enabled
+#endif
#if defined(ENABLE_CPU) && defined(ENABLE_MEMSCREEN)
- if (cpu_enabled || memscreen_enabled) {
- realtime_alpha_blend_of_cpu_usage(loadPercentage, proximity);
- }
+ ||
#endif
-#if defined(ENABLE_CPU) && !defined(ENABLE_MEMSCREEN)
- if (cpu_enabled) {
- realtime_alpha_blend_of_cpu_usage(loadPercentage, proximity);
- }
+#ifdef ENABLE_MEMSCREEN
+ memscreen_enabled
#endif
-#if !defined(ENABLE_CPU) && defined(ENABLE_MEMSCREEN)
- if (memscreen_enabled) {
+ ) {
realtime_alpha_blend_of_cpu_usage(loadPercentage, proximity);
}
#endif
@@ -969,45 +880,53 @@ static void bubblemon_update(int proximity)
#ifdef ENABLE_MEMSCREEN
/* draws 4x8 digits for the memory/swap panel */
-static void draw_digit(int srcx, int srcy, int destx, int desty)
+static void draw_digit(int num, unsigned char * whither, unsigned char red, unsigned char grn, unsigned char blu)
{
- int i, j;
- char *from, *to;
-
- for (j = 0; j < 8; j++) {
- from = mem_screen + 56 * 3 * (srcy + j) + srcx * 3;
- to = bm.mem_buf + 56 * 3 * (desty + j) + destx * 3;
- i = 12;
- while (i--)
- *to++ = *from++;
- }
+ int xx, yy;
+ char *from;
+ unsigned char *to;
+
+ num *= 4;
+
+ for (yy = 0; yy < 8; yy++) {
+ to = whither + BOX_SIZE*3*yy;
+ from = &numbers_xpm[3+yy][num];
+ for (xx = 0; xx < 4; xx++, from++, to+=3 ) {
+ if (*from==' ') {
+ to[0] = red; to[1] = grn; to[2] = blu;
+ }
+ }
+ }
}
/* draws a string using previous function. non-digits and non-K/M = space */
static void draw_string(char *string, int x, int y, int color)
{
- unsigned char c;
-
- while ((c = *string++)) {
- if (c == 'K') {
- draw_digit(40, (color) ? 69 : 60, x, y);
- } else if (c == 'M') {
- draw_digit(44, (color) ? 69 : 60, x, y);
- } else if (c == ' ') {
- draw_digit(50, 60, x, y); /* blank space */
- } else {
- c -= '0';
- draw_digit(c * 4, (color) ? 69 : 60, x, y);
+ unsigned char c;
+ const unsigned char reds[4]={ 48,237,158, 0};
+ const unsigned char grns[4]={140, 23,196,255};
+ const unsigned char blus[4]={240, 23,237,233};
+
+ if (pale) color += 2;
+
+ /* bluish rgb:48,140,240 pale rgb:158,196,237
+ reddish rgb:237,23,23 pale(cyan) rgb:0,255,233 */
+
+ while ((c = *string++)) {
+ if (c == 'K') c = 10;
+ else if (c == 'M') c = 11;
+ else if (c >= '0' && c <= '9') c -= '0';
+
+ if (c <= 11)
+ draw_digit(c, &bm.mem_buf[3*(y*BOX_SIZE+x)], reds[color], grns[color], blus[color]);
+ x += 4;
}
- x += 4;
- }
}
-static void draw_pixel(unsigned int x, unsigned int y, unsigned char *buf,
- unsigned char *c)
+static void draw_pixel(unsigned int x, unsigned int y, unsigned char *buf, char *c)
{
unsigned char *ptr;
- ptr = buf + y * 56 * 3 + x * 3 + 6; /* +6 = x + 2 */
+ ptr = buf + y * BOX_SIZE * 3 + x * 3 + 6; /* +6 = x + 2 */
*ptr++ = *c++;
*ptr++ = *c++;
*ptr++ = *c++;
@@ -1015,41 +934,34 @@ static void draw_pixel(unsigned int x, unsigned int y, unsigned char *buf,
/* draw graph num x size, data taken from history, into rgb buffer buf.
* this is called not very often: only 1 time out of 250 */
-static void draw_history(int num, int size, unsigned int *history,
- unsigned char *buf)
+static void draw_history(int num, int size, unsigned int *history, unsigned char *buf)
{
int pixels_per_byte;
int j, k;
- int *p;
int d;
pixels_per_byte = 100;
- p = history;
for (j = 0; j < num; j++) {
- if (p[0] > pixels_per_byte)
+ while (history[j] > pixels_per_byte) /* autoscaling */
pixels_per_byte += 100;
- p++;
- }
-
- p = history;
+ }
for (k = 0; k < num; k++) {
- d = (1.0 * p[0] / pixels_per_byte) * size;
+ d = size * history[k] / pixels_per_byte;
for (j = 0; j < size; j++) {
if (j < d - 2)
- draw_pixel(k, size - j - 1, buf, "\x00\x7d\x71");
+ draw_pixel(k, size - j - 1, buf, "\x00\x7d\x71"); /* dark cyan for lower part of bar graph */
else if (j < d)
- draw_pixel(k, size - j - 1, buf, "\x20\xb6\xae");
+ draw_pixel(k, size - j - 1, buf, "\x20\xb6\xae"); /* seagreen for top two pixels */
}
- p++;
}
- for (j = pixels_per_byte - 100; j > 0; j -= 100) {
+ for (j = pixels_per_byte - 100; j > 0; j -= 100) { /* draw lines for each 100s */
for (k = 0; k < num; k++) {
- d = ((float) size / pixels_per_byte) * j;
- draw_pixel(k, size - d - 1, buf, "\x71\xe3\x71");
+ d = size * j / pixels_per_byte;
+ draw_pixel(k, size - d - 1, buf, "\x71\xe3\x71"); /* spring green */
}
}
}
@@ -1067,18 +979,18 @@ static void render_secondary(void)
* digits: 0, 60 and 0, 69 */
/* make a clean buffer with blank spaces. */
- memcpy(bm.mem_buf, bm.screen_type ? load_screen : mem_screen,
- 56 * 56 * 3);
+ memcpy(bm.mem_buf, bm.screen_type ? load_screen.pixel_data : mem_screen.pixel_data,
+ BOX_SIZE * BOX_SIZE * 3);
if (bm.screen_type) {
for (i = 0; i < 3; i++) {
sprintf(number, "%2d", bm.loadavg[i].i);
- draw_string(number, 19 * i, 8, 0);
+ draw_string(number, 1+(4*4+2+1)*i, 9, 0);
sprintf(number, "%02d", bm.loadavg[i].f);
- draw_string(number, 19 * i + 10, 8, 0);
+ draw_string(number, 1+(4*4+2+1)*i + 4*2 + 2, 9, 0);
}
/* copy history graph from previous rollover */
- memcpy(bm.mem_buf + 19 * 56 * 3, bm.his_bufb, 56 * 33 * 3);
+ memcpy(bm.mem_buf + 19 * BOX_SIZE * 3, bm.his_bufb, BOX_SIZE * 33 * 3);
} else {
/* draw memory */
if (memscreen_megabytes)
@@ -1086,8 +998,8 @@ static void render_secondary(void)
else
snprintf(number, 8, "%6lluK", bm.mem_used >> 10);
snprintf(percent, 4, "%03d", bm.mem_percent);
- draw_string(number, 2, 1, (bm.mem_percent > 90) ? 1 : 0);
- draw_string(percent, 38, 1, (bm.mem_percent > 90) ? 1 : 0);
+ draw_string(number, 3, 2, (bm.mem_percent > 90) ? 1 : 0);
+ draw_string(percent, 39, 2, (bm.mem_percent > 90) ? 1 : 0);
/* draw swap */
if (memscreen_megabytes)
@@ -1095,16 +1007,15 @@ static void render_secondary(void)
else
snprintf(number, 8, "%6lluK", bm.swap_used >> 10);
snprintf(percent, 4, "%03d", bm.swap_percent);
- draw_string(number, 2, 10, (bm.swap_percent > 90) ? 1 : 0);
- draw_string(percent, 38, 10, (bm.swap_percent > 90) ? 1 : 0);
+ draw_string(number, 3, 11, (bm.swap_percent > 90) ? 1 : 0);
+ draw_string(percent, 39, 11, (bm.swap_percent > 90) ? 1 : 0);
/* copy history graph from previous rollover */
- memcpy(bm.mem_buf + 21 * 56 * 3, bm.his_bufa, 56 * 31 * 3);
+ memcpy(bm.mem_buf + 21 * BOX_SIZE * 3, bm.his_bufa, BOX_SIZE * 31 * 3);
}
}
-static void roll_membuffer(void)
-{
+static void roll_membuffer(void) {
static int delay;
if (++delay < 30)
@@ -1114,69 +1025,62 @@ static void roll_membuffer(void)
render_secondary();
}
-static void roll_history(void)
-{
- unsigned int yep, j;
+static void roll_history(void) {
static int update, doit;
- if (doit-- <= 0) {
- doit = ROLLVALUE;
- if (update-- <= 0) {
+ if (--doit <= 0) {
+ doit = ROLLVALUE; /* how many redraws before we sample new data */
+ if (--update <= 0) {
+ /* reset counter; 5 = the number of samples to average into one point on
+ the bar graph. Probably should be configurable. */
+
/* roll history buffers, averaging last 5 samples */
- if (bm.history[52])
- bm.history[52] /= bm.hisadd;
+ if (bm.hisadd)
+ bm.history[BOX_SIZE-4] /= bm.hisadd;
+ if (bm.memadd)
+ bm.memhist[BOX_SIZE-4] /= bm.memadd;
- if (bm.memhist[52])
- bm.memhist[52] /= bm.memadd;
+ memmove(&bm.history[0], &bm.history[1], sizeof(bm.history));
+ memmove(&bm.memhist[0], &bm.memhist[1], sizeof(bm.memhist));
- for (j = 1; j < 53; j++) {
- bm.history[j - 1] = bm.history[j];
- bm.memhist[j - 1] = bm.memhist[j];
- }
- bm.history[52] = 0;
+ bm.history[BOX_SIZE-4] = 0;
bm.hisadd = 0;
- bm.memhist[52] = 0;
+ bm.memhist[BOX_SIZE-4] = 0;
bm.memadd = 0;
/* refresh backgrounds */
- memcpy(bm.his_bufa, mem_screen + 21 * 56 * 3, 31 * 56 * 3);
- memcpy(bm.his_bufb, load_screen + 19 * 56 * 3, 33 * 56 * 3);
+ memcpy(bm.his_bufa, mem_screen.pixel_data + 21 * BOX_SIZE * 3, 31 * BOX_SIZE * 3);
+ memcpy(bm.his_bufb, load_screen.pixel_data + 19 * BOX_SIZE * 3, 33 * BOX_SIZE * 3);
/* render memory graph */
- draw_history(52, 31, bm.memhist, bm.his_bufa);
+ draw_history(BOX_SIZE-4, 31, bm.memhist, bm.his_bufa);
/* render load average graph */
- draw_history(52, 33, bm.history, bm.his_bufb);
+ draw_history(BOX_SIZE-4, 33, bm.history, bm.his_bufb);
/* reset counter */
update = 5;
}
/* do load average history update */
- yep = bm.loadavg[0].f + (bm.loadavg[0].i * 100);
- bm.history[52] += yep;
+ bm.history[BOX_SIZE-4] += bm.loadavg[0].f + (bm.loadavg[0].i * 100);
bm.hisadd++;
/* do memory history update */
- yep = bm.mem_percent;
- bm.memhist[52] += yep;
+ bm.memhist[BOX_SIZE-4] += bm.mem_percent;
bm.memadd++;
}
}
#endif /* ENABLE_MEMSCREEN */
#ifdef ENABLE_CPU
-/* draws digits for the CPU meter. This function is very specific
- * to the meter. Arguments it takes are not what they seem initially */
-static void draw_cpudigit(const int what, const int where,
- unsigned char *kit)
-{
+static void draw_cpudigit(int what, unsigned char *whither) {
unsigned int len, y;
unsigned char *to, *from;
- for (y = 0; y < 9; y++) {
- len = 21;
- to = kit + y * 75 + where;
- from = digits + y * 285 + what;
+ for (y = 0; y < 9; y++) { /* magic numbers suck. */
+ len = 7*3;
+ to = whither + y * 3*25;
+ from = digits + y * 3*95 + what*3*6;
while (len--)
*to++ = *from++;
}
@@ -1190,25 +1094,25 @@ static void draw_dtchr(const char letter, unsigned char * rgbbuf) {
for (y=0;y<7;y++)
for (x=0;x<5;x++)
if (clockdigit[x+(y*10+(letter-'0'))*6]=='M') {
- rgbbuf[(x+y*56)*3 ]>>=1;
- rgbbuf[(x+y*56)*3+1]>>=1;
- rgbbuf[(x+y*56)*3+2]>>=1;
+ rgbbuf[(x+y*BOX_SIZE)*3 ]>>=1;
+ rgbbuf[(x+y*BOX_SIZE)*3+1]>>=1;
+ rgbbuf[(x+y*BOX_SIZE)*3+2]>>=1;
}
} else if (letter>='@' && letter<='~') {
for (y=0;y<7;y++)
for (x=0;x<4;x++)
if (clockalpha[x+(y*63+(letter-'@'))*5]=='M') {
- rgbbuf[(x+y*56)*3 ]>>=1;
- rgbbuf[(x+y*56)*3+1]>>=1;
- rgbbuf[(x+y*56)*3+2]>>=1;
+ rgbbuf[(x+y*BOX_SIZE)*3 ]>>=1;
+ rgbbuf[(x+y*BOX_SIZE)*3+1]>>=1;
+ rgbbuf[(x+y*BOX_SIZE)*3+2]>>=1;
}
} else if (letter==':') {
- rgbbuf[3*56*3 ]>>=1;
- rgbbuf[3*56*3+1]>>=1;
- rgbbuf[3*56*3+2]>>=1;
- rgbbuf[5*56*3 ]>>=1;
- rgbbuf[5*56*3+1]>>=1;
- rgbbuf[5*56*3+2]>>=1;
+ rgbbuf[3*BOX_SIZE*3 ]>>=1;
+ rgbbuf[3*BOX_SIZE*3+1]>>=1;
+ rgbbuf[3*BOX_SIZE*3+2]>>=1;
+ rgbbuf[5*BOX_SIZE*3 ]>>=1;
+ rgbbuf[5*BOX_SIZE*3+1]>>=1;
+ rgbbuf[5*BOX_SIZE*3+2]>>=1;
}
}
@@ -1220,10 +1124,10 @@ static void draw_largedigit(char number, unsigned char * rgbbuf) {
if (number>=0 && number<=9) {
for (y=0;y<32;y++)
for (x=0;x<13;x++) {
- v=bigdigits[number*13+x+y*130]>>2;
- t=rgbbuf[(x+y*56)*3 ]+v; if (t>255) t=255; rgbbuf[(x+y*56)*3 ]=t;
- t=rgbbuf[(x+y*56)*3+1]+v; if (t>255) t=255; rgbbuf[(x+y*56)*3+1]=t;
- t=rgbbuf[(x+y*56)*3+2]+v; if (t>255) t=255; rgbbuf[(x+y*56)*3+2]=t;
+ v=bigdigits[number*13+x+y*130]>>2;
+ t=rgbbuf[(x+y*BOX_SIZE)*3 ]+v; if (t>255) t=255; rgbbuf[(x+y*BOX_SIZE)*3 ]=t;
+ t=rgbbuf[(x+y*BOX_SIZE)*3+1]+v; if (t>255) t=255; rgbbuf[(x+y*BOX_SIZE)*3+1]=t;
+ t=rgbbuf[(x+y*BOX_SIZE)*3+2]+v; if (t>255) t=255; rgbbuf[(x+y*BOX_SIZE)*3+2]=t;
}
}
}
@@ -1250,9 +1154,9 @@ static void draw_datetime(unsigned char * rgbbuf) {
/* Sat Jan 04 */
-#define DOWx 6
-#define MONx 22
-#define DOMx 38
+#define DOWx 9
+#define MONx 25
+#define DOMx 41
/* draw day-of-week (14 px)*/
draw_dtchr(days[mytime->tm_wday][0],rgbbuf+(DOWx )*3+56*3);
draw_dtchr(days[mytime->tm_wday][1],rgbbuf+(DOWx+ 5)*3+56*3);
@@ -1265,18 +1169,18 @@ static void draw_datetime(unsigned char * rgbbuf) {
draw_dtchr((mytime->tm_mday)/10+'0',rgbbuf+(DOMx )*3+56*3);
draw_dtchr((mytime->tm_mday)%10+'0',rgbbuf+(DOMx+ 6)*3+56*3);
- draw_largedigit(mytime->tm_hour/10,rgbbuf+1*3+56*3*13);
- draw_largedigit(mytime->tm_hour%10,rgbbuf+14*3+56*3*13);
- draw_largedigit(mytime->tm_min/10,rgbbuf+27*3+56*3*13);
- draw_largedigit(mytime->tm_min%10,rgbbuf+40*3+56*3*13);
+ draw_largedigit(mytime->tm_hour/10,rgbbuf+3*(3+BOX_SIZE*13));
+ draw_largedigit(mytime->tm_hour%10,rgbbuf+3*(16+BOX_SIZE*13));
+ draw_largedigit(mytime->tm_min/10,rgbbuf+3*(30+BOX_SIZE*13));
+ draw_largedigit(mytime->tm_min%10,rgbbuf+3*(43+BOX_SIZE*13));
}
#if defined(ENABLE_CPU) || defined(ENABLE_MEMSCREEN)
static void realtime_alpha_blend_of_cpu_usage(int cpu, int proximity)
{
/* where is the text going to be (now, bottom-center) */
-#define POSX 16
-#define POSY 46
+#define POSX (BOX_SIZE/2-12)
+#define POSY (BOX_SIZE-10)
int bob;
/* memory window */
@@ -1291,31 +1195,33 @@ static void realtime_alpha_blend_of_cpu_usage(int cpu, int proximity)
int hibyte, y, pos;
/* CPU load buffer */
- static unsigned char kit[25 * 3 * 9 + 1];
+ static unsigned char kit[25 * 3 * 9 + 1]; /* 9 high, 25 wide, 3bpp */
unsigned char *kitptr;
/* the plan is simple. we don't want to redraw the digits every update
* because that doesn't look so good. so we average it, and draw only
- * once every 10 updates. We alpha blend the static buffer so we still
- * get cool transparency effects. */
+ * once every N updates.
+
+ * We alpha blend the static buffer so we still get cool transparency
+ * effects. */
avg += cpu;
- while (++yoh > 10) {
- cpu = avg / 10;
- avg ^= avg; /* zero. Haha, I guess these are not */
- yoh ^= yoh; /* register vars, optimizer just zeros them */
- hibyte = cpu / 10; /* but it's cool to know it understands xor a, a */
+ /* 2 here is adjusted to mean 100ms*2=5Hz. Originally it was 15ms*10 meaning 7Hz */
+ while (++yoh > 2) {
+ cpu = avg / 2;
+ avg = yoh = 0;
+ hibyte = cpu / 10;
if (hibyte == 10) {
- draw_cpudigit(18, 0, kit);
- draw_cpudigit(0, 18, kit);
- draw_cpudigit(0, 36, kit);
+ draw_cpudigit(1, kit);
+ draw_cpudigit(0, &kit[3*6]);
+ draw_cpudigit(0, &kit[3*12]);
} else {
- draw_cpudigit(216, 0, kit);
- draw_cpudigit(hibyte * 18, 18, kit);
- draw_cpudigit((cpu % 10) * 18, 36, kit);
+ draw_cpudigit(12, kit);
+ draw_cpudigit(hibyte, &kit[3*6]);
+ draw_cpudigit(cpu % 10, &kit[3*12]);
}
/* percent sign is always there */
- draw_cpudigit(180, 54, kit);
+ draw_cpudigit(10, &kit[3*18]);
}
#endif /* ENABLE_CPU */
@@ -1368,7 +1274,7 @@ static void realtime_alpha_blend_of_cpu_usage(int cpu, int proximity)
kitptr = kit;
for (y = 0; y < 9; y++) {
unsigned char src;
- pos = (y + POSY) * 56 * 3 + (POSX * 3);
+ pos = (y + POSY) * BOX_SIZE * 3 + (POSX * 3);
bob = 75; /* 25 * 3 */
while (bob--) {
src = bm.rgb_buf[pos];
@@ -1392,7 +1298,7 @@ static void realtime_alpha_blend_of_cpu_usage(int cpu, int proximity)
unsigned char *ptr, *ptr2, src;
ptr = bm.mem_buf;
ptr2 = bm.rgb_buf;
- bob = 9408; /* 56 * 56 * 3 */
+ bob = BOX_SIZE * BOX_SIZE * 3;
while (bob--) {
src = *ptr2;
*ptr2++ = (memblend * src + (256 - memblend) * *ptr++) >> 8;
@@ -1423,17 +1329,17 @@ static void duck_set(int x, int y, int nr, int rev, int upsidedown)
if (y < 0)
ds = -(y);
dh = 17;
- if ((y + 17) > 56)
- dh = 56 - y;
+ if ((y + 17) > BOX_SIZE)
+ dh = BOX_SIZE - y;
dw = 18;
- if (x > 38)
- dw = 18 - (x - 38);
+ if (x > BOX_SIZE-18)
+ dw = 18 - (x - (BOX_SIZE-18));
di = 0;
if (x < 0)
di = -(x);
for (h = ds; h < dh; h++) {
/* calculate this only once */
- int ypos = (h + y) * 56;
+ int ypos = (h + y) * BOX_SIZE;
#ifdef UPSIDE_DOWN_DUCK
rh = (upsidedown && upside_down_duck_enabled) ? 16 - h : h;
#endif
@@ -1483,14 +1389,12 @@ static int animate_correctly(void)
instead of 0,1,2,0,1,2 <- this way the duck looks really ugly
instead of keeping 2 counters we just made it longer */
- static int outp[48] =
- { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0,
- 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2,
- 2, 2, 1, 1, 1, 1
- };
+ const int outp[16] =
+ { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1
+ };
static int totalcounter = -1;
- if (++totalcounter > 47)
+ if (++totalcounter > 15)
totalcounter = 0;
return outp[totalcounter];
@@ -1527,8 +1431,8 @@ static void duck_swimmer(int posy)
rev = 1;
}
} else {
- if (tx++ > 57) {
- tx = 57;
+ if (tx++ > BOX_SIZE+1) {
+ tx = BOX_SIZE+1;
rev = 0;
}
}
@@ -1560,83 +1464,6 @@ static void bubblemon_setup_samples(void)
}
}
-static void bubblemon_setup_colors(void)
-{
-#define NUM_COLORS 99
- int i, j, *col;
- int r_air_noswap, g_air_noswap, b_air_noswap;
- int r_liquid_noswap, g_liquid_noswap, b_liquid_noswap;
- int r_air_maxswap, g_air_maxswap, b_air_maxswap;
- int r_liquid_maxswap, g_liquid_maxswap, b_liquid_maxswap;
- int actual_colors = NUM_COLORS / 3;
-
- if (!bm.colors)
- bm.colors = malloc(NUM_COLORS * sizeof(int));
-
- col = bm.colors;
-
- r_air_noswap = (bm.air_noswap >> 16) & 0xff;
- g_air_noswap = (bm.air_noswap >> 8) & 0xff;
- b_air_noswap = (bm.air_noswap) & 0xff;
-
- r_liquid_noswap = (bm.liquid_noswap >> 16) & 0xff;
- g_liquid_noswap = (bm.liquid_noswap >> 8) & 0xff;
- b_liquid_noswap = (bm.liquid_noswap) & 0xff;
-
- r_air_maxswap = (bm.air_maxswap >> 16) & 0xff;
- g_air_maxswap = (bm.air_maxswap >> 8) & 0xff;
- b_air_maxswap = (bm.air_maxswap) & 0xff;
-
- r_liquid_maxswap = (bm.liquid_maxswap >> 16) & 0xff;
- g_liquid_maxswap = (bm.liquid_maxswap >> 8) & 0xff;
- b_liquid_maxswap = (bm.liquid_maxswap) & 0xff;
-
- for (i = 0; i < actual_colors; i++) {
- int r, g, b;
- int r_composite, g_composite, b_composite;
-
- j = i >> 1;
-
- /* Liquid */
- r = (r_liquid_maxswap * j +
- r_liquid_noswap * ((actual_colors - 1) -
- j)) / (actual_colors - 1);
- g = (g_liquid_maxswap * j +
- g_liquid_noswap * ((actual_colors - 1) -
- j)) / (actual_colors - 1);
- b = (b_liquid_maxswap * j +
- b_liquid_noswap * ((actual_colors - 1) -
- j)) / (actual_colors - 1);
-
- r_composite = r;
- g_composite = g;
- b_composite = b;
- col[(i * 3)] = (r << 16) | (g << 8) | b;
-
- /* Air */
- r = (r_air_maxswap * j +
- r_air_noswap * ((actual_colors - 1) - j)) / (actual_colors -
- 1);
- g = (g_air_maxswap * j +
- g_air_noswap * ((actual_colors - 1) - j)) / (actual_colors -
- 1);
- b = (b_air_maxswap * j +
- b_air_noswap * ((actual_colors - 1) - j)) / (actual_colors -
- 1);
- r_composite += r;
- g_composite += g;
- b_composite += b;
- col[(i * 3) + 2] = (r << 16) | (g << 8) | b;
-
- /* Anti-alias */
- r = r_composite >> 1;
- g = g_composite >> 1;
- b = b_composite >> 1;
- col[(i * 3) + 1] = (r << 16) | (g << 8) | b;
- }
-#undef NUM_COLORS
-}
-
static void bubblemon_allocate_buffers(void)
{
int i;
@@ -1648,22 +1475,22 @@ static void bubblemon_allocate_buffers(void)
if (bm.bubblebuf)
free(bm.bubblebuf);
- bm.bubblebuf = calloc(56 * 60, sizeof(char));
+ bm.bubblebuf = calloc(BOX_SIZE * (BOX_SIZE+4), sizeof(char));
/* Allocate water level memory */
if (bm.waterlevels)
free(bm.waterlevels);
- bm.waterlevels = malloc(56 * sizeof(int));
- for (i = 0; i < 56; i++) {
- bm.waterlevels[i] = MAKEY(56);
- }
+ bm.waterlevels = malloc(BOX_SIZE * sizeof(int));
+ for (i = 0; i < BOX_SIZE; i++) {
+ bm.waterlevels[i] = MAKEY(BOX_SIZE);
+ }
/* Allocate water level velocity memory */
if (bm.waterlevels_dy)
free(bm.waterlevels_dy);
- bm.waterlevels_dy = calloc(56, sizeof(int));
+ bm.waterlevels_dy = calloc(BOX_SIZE, sizeof(int));
}
static void get_memory_load_percentage(void)
diff --git a/clockfont.txt b/clockfont.txt
new file mode 100644
index 0000000..0641b31
--- /dev/null
+++ b/clockfont.txt
@@ -0,0 +1,36 @@
+0123456789
+
+5x7
+
+-###----#----###---###-----##-#####--###--#####--###---###-
+#---#--##---#---#-#---#---#-#-#-----#---#-----#-#---#-#---#
+#---#---#-------#-----#--#--#-####--#---------#-#---#-#---#
+#---#---#------#----##--#####-#---#-####-----#---###---####
+#---#---#-----#-------#-----#-----#-#---#---#---#---#-----#
+#---#---#----#----#---#-----#-#---#-#---#---#---#---#-#---#
+-###---###--#####--###------#--###---###----#----###---###-
+
+ABCDEFGJLMNOPRSTUY
+Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
+ADFJMNO
+abceglnoruy
+
+4#7
+
+-##---##--###---##--###--####-####--##--#--#-###--####-#--#-#----#--#-#--#--##--###---##--###---##--###--#--#-#--#-#--#-#--#-#--#-####--###-#----###---##--------#--------#------------#--------#-------#--------------#-----#---------------------------------------#------------------------------------#--#---#-----#-#
+#--#-#--#-#--#-#--#-#--#-#----#----#--#-#--#--#------#-#--#-#----####-##-#-#--#-#--#-#--#-#--#-#--#--#---#--#-#--#-#--#-#--#-#--#----#--#---#------#--#--#--------#-------#------------#-------#-#------#-----#--------#-----#---------------------------------------#-----------------------------------#---#----#---#-#
+#-##-#--#-#--#-#----#--#-#----#----#----#--#--#------#-#-#--#----#--#-##-#-#--#-#--#-#--#-#--#-#-----#---#--#-#--#-#--#--##--#-#----#---#----#-----#------------------##--###---##---###--##---#----###-###------------#--#--#--------###---##--###---###-###---sss-####-#--#-#--#-#--#-#--#-#--#-####---#---#----#
+#-##-####-###--#----#--#-###--###--#-##-####--#------#-##---#----#--#-#-##-#--#-###--#--#-###---##---#---#--#-#--#-#--#--##---#----#----#-----#----#--------------------#-#--#-#--#-#--#-#--#-####-#--#-#--#--#--------#-#---#--------#--#-#--#-#--#-#--#-#--#-s-----#---#--#-#--#-#--#-#--#-#--#----#--#----#-----#
+#-##-#--#-#--#-#----#--#-#----#----#--#-#--#--#------#-#-#--#----#--#-#-##-#--#-#----#--#-#--#----#--#---#--#-#--#-#--#-#--#--#---#-----#-----#----#------------------###-#--#-#----#--#-####--#----###-#--#--#--------##----#--------#--#-#--#-#--#-#--#-#-----ss---#---#--#-#--#-#--#--##---###--##----#---#----#
+#----#--#-#--#-#--#-#--#-#----#----#--#-#--#--#---#--#-#--#-#----#--#-#--#-#--#-#----#-##-#--#-#--#--#---#--#--#-#-####-#--#--#---#-----#------#---#-----------------#--#-#--#-#--#-#--#-#-----#------#-#--#--#--------#-#---#--------#--#-#--#-###---###-#-------s--#-#-#--#--#-#-####-#--#----#-#------#---#----#
+-###-#--#-###---##--###--####-#-----##--#--#-###---##--#--#-####-#--#-#--#--##--#-----###-#--#--##---#----##----#--#--#-#--#--#---####--###----#-###-------####-------###-###---##---###--###--#---###--#--#--#---jjjj-#--#--##--mmmm-#--#--##--#-------#-#----sss----#---###---#--#--#-#--#-###--####----#--#---#
+
+
+
+
+
+
+
+
+
+
diff --git a/debian/README.Debian b/debian/README.Debian
new file mode 100644
index 0000000..81e223f
--- /dev/null
+++ b/debian/README.Debian
@@ -0,0 +1,7 @@
+wmbubble for Debian
+----------------------
+
+Changed the name from bubblemon to wmbubble.
+There is a GNOME app called bubblemon, but this one is better.
+
+ -- John H. Robinson, IV <jaqque at debian.org>, Thu, 1 Feb 2001 22:06:04 -0800
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..5bbe178
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,125 @@
+wmbubble (1.46-2.1) unstable; urgency=low
+
+ * debian/control
+ - (Build-Depends): Add libx11-dev due to KDE_DOCKAPP.
+ - (Standards-Version): Update to 3.9.1.
+ * debian/patches
+ - (Number 04): Refresh. Enable KDE_DOCKAPP to make duck appear
+ on WindowMaker (grave; Closes: #549014).
+ - (Number 12): Refresh. Update to Gtk 2.x by using --cflags. Add
+ -lX11 due to KDE_DOCKAPP.
+ * debian/rules
+ - (clean): Delete binary manually. Fixes repetitive builds.
+
+ -- Jari Aalto <jari.aalto at cante.net> Thu, 21 Oct 2010 08:59:31 +0300
+
+wmbubble (1.46-2) unstable; urgency=low
+
+ * Updated debhelper to compatibility level 7
+ * Updated Standards Version
+
+ -- John H. Robinson, IV <jaqque at debian.org> Tue, 8 Jul 2008 13:49:13 -0700
+
+wmbubble (1.46-1.1) unstable; urgency=low
+
+ * Non-maintainer upload.
+ * Updated to debhelper compatibility level 5.
+ * Cleaned up and updated debian/rules:
+ + Added sane CFLAGS as mandated by policy
+ + Changed to using dh_install instead of cp
+ + Changed to using $(CURDIR) instead of `pwd`
+ + Removed unused rules.
+ * Added dpatch support.
+ * Splitted the .diff.gz into seven small patches.
+ * Added three extra patches:
+ + 08-makefile-cflags: modify Makefile so that it accepts external CFLAGS
+ correctly
+ + 09-upsidedown-offlimits.dpatch: fix an off-by-one mistake when
+ displaying the upsidedown duck that could trigger a SIGSEGV in certain
+ cases. (Closes: #437157)
+ + 10-gtk2-migration: migrate wmbubble to GTK2. Thanks to Julien BLACHE
+ for the patch. (Closes: #437425)
+ * Added build-dependency on libgtk-2.0-dev, for the GTK2 migration.
+ * Removed the upsidedown comment from the README.Debian, since it wasn't
+ true.
+ * Updated menu file to the new menu structure.
+ * Updated to Standards-Version 3.7.2. No changes needed
+
+ -- Margarita Manterola <marga at debian.org> Sat, 01 Sep 2007 19:25:15 -0300
+
+wmbubble (1.46-1) unstable; urgency=low
+
+ * New upstream release (Closes: #261281)
+ * Fixed attribution in man page
+ * Updated menu to actually launch useful(?) programs
+ * Fixed clumsy wording in the package description
+ * Many thanks to Romain Francoise for his NMU's
+
+ -- John H. Robinson, IV <jaqque at debian.org> Mon, 16 Aug 2004 20:56:46 -0700
+
+wmbubble (1.41-0.2) unstable; urgency=low
+
+ * NMU
+ * Change logic of the runtime kernel detection patch: default to Linux
+ 2.4 format if the version doesn't match anything we know; needed for
+ people who still run 2.2 and earlier (closes: #250228).
+
+ -- Romain Francoise <rfrancoise at debian.org> Sat, 14 Aug 2004 22:05:44 +0200
+
+wmbubble (1.41-0.1) unstable; urgency=low
+
+ * NMU
+ * New upstream release (closes: #220643):
+ - Upstream support for Linux 2.6 (closes: #207377)
+ - Apply patch from Romain Francoise <rfrancoise at debian.org> to add
+ runtime detection of the running kernel (upstream added support
+ as a compile-time option which doesn't suit Debian at all).
+ * Apply patch from Romain Francoise <rfrancoise at debian.org> to require a
+ second mouse click to unfreeze the load display (closes: #217455).
+
+ -- Romain Francoise <rfrancoise at debian.org> Sun, 28 Mar 2004 12:30:00 +0200
+
+wmbubble (1.4-1) unstable; urgency=low
+
+ * New upstream release
+
+ -- John H. Robinson, IV <jaqque at debian.org> Wed, 3 Oct 2001 17:16:26 -0700
+
+wmbubble (1.3-1.1) unstable; urgency=low
+ * Non-maintainer upload.
+ * Fix printf-is-a-macro issue (gcc 3.0). Closes: #103159
+
+ -- LaMont Jones <lamont at debian.org> Mon, 9 Jul 2001 21:39:34 -0600
+
+wmbubble (1.3-1) unstable; urgency=low
+
+ * New upstream release
+ * Initial upload. (closes: Bug#84441)
+
+ -- John H. Robinson, IV <jaqque at debian.org> Fri, 16 Mar 2001 09:04:53 -0800
+
+wmbubble (1.2.2-1) unstable; urgency=low
+
+ * New upstream release
+ * Fixed a bug that caused a segfault under high load/high memory usage
+ * Restored -u to original meaning
+
+ -- John H. Robinson, IV <jaqque at debian.org> Thu, 15 Mar 2001 21:00:15 -0800
+
+wmbubble (1.1-2) unstable; urgency=low
+
+ * Fixed a bug that caused a segfault when you ran out of physical RAM
+
+ -- John H. Robinson, IV <jaqque at ucsd.edu> Fri, 2 Feb 2001 13:38:50 -0800
+
+wmbubble (1.1-1) unstable; urgency=low
+
+ * Initial Release.
+ * Modified Makefile to comply with Debian
+ * Changed meaning of -u flag
+
+ -- John H. Robinson, IV <jaqque at ucsd.edu> Thu, 1 Feb 2001 22:06:04 -0800
+
+Local variables:
+mode: debian-changelog
+End:
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..7f8f011
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+7
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..89e66ad
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,19 @@
+Source: wmbubble
+Section: x11
+Priority: optional
+Maintainer: John H. Robinson, IV <jaqque at debian.org>
+Build-Depends: debhelper (>= 5.0), dpatch, libx11-dev
+Standards-Version: 3.8.0.1
+
+Package: wmbubble
+Architecture: any
+Depends: ${shlibs:Depends}
+Suggests: sox, x-terminal-emulator
+Description: A system-load meter for Window Maker that features a duck
+ A Window Maker dockapp (though it does not specifically require the Window
+ Maker window manager) that indicates the system load.
+ .
+ The more profuse the bubbles, the higher the CPU usage. The higher the water,
+ the more memory being used.
+ .
+ Up to two user-specified programs may be launched from this dockapp.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..ba989d7
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,15 @@
+This is Debian GNU/Linux's prepackaged version of timecop's bubblemon.
+
+This package was debianized by John H. Robinson, IV <jaqque at debian.org>. The
+name was changed to wmbubble to prevent confusion between this package, and the
+GNOME applet of the name bubblemon.
+
+It was downloaded from http://www.ne.jp/asahi/linux/timecop/
+
+Upstream Author: timecop at japan.co.jp
+
+Copyright (C) 2001 Tim Copperfield <timecop at japan.co.jp>
+
+You are free to distribute this software under the terms of the GNU General
+Public License. On Debian systems, the complete text of the GNU General Public
+License can be found in /usr/share/common-licenses/GPL file.
diff --git a/debian/dirs b/debian/dirs
new file mode 100644
index 0000000..d7aeca6
--- /dev/null
+++ b/debian/dirs
@@ -0,0 +1,2 @@
+usr/bin
+usr/share/wmbubble
diff --git a/debian/docs b/debian/docs
new file mode 100644
index 0000000..e43d3cb
--- /dev/null
+++ b/debian/docs
@@ -0,0 +1,2 @@
+README
+doc/Xdefaults.sample
diff --git a/debian/menu b/debian/menu
new file mode 100644
index 0000000..ed4656d
--- /dev/null
+++ b/debian/menu
@@ -0,0 +1,2 @@
+?package(wmbubble):needs="x11" section="Applications/System/Monitoring"\
+ title="wmbubble" command="wmbubble 'x-terminal-emulator -e top' '/usr/share/wmbubble/wakwak.sh'"
diff --git a/debian/rules b/debian/rules
new file mode 100644
index 0000000..a2c55c3
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,64 @@
+#!/usr/bin/make -f
+# Sample debian/rules that uses debhelper.
+# GNU copyright 1997 to 1999 by Joey Hess.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# This package uses dpatch
+include /usr/share/dpatch/dpatch.make
+
+CFLAGS = -Wall -g
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+ CFLAGS += -O0
+else
+ CFLAGS += -O2
+endif
+
+build: build-stamp
+build-stamp: patch-stamp
+ dh_testdir
+ $(MAKE) BINARY="wmbubble" USER_CFLAGS="$(CFLAGS)"
+ touch build-stamp
+
+clean: unpatch
+ dh_testdir
+ dh_testroot
+ rm -f build-stamp
+ $(MAKE) clean
+ rm -f wmbubble
+ dh_clean
+
+install: build
+ dh_testdir
+ dh_testroot
+ dh_clean -k
+ dh_installdirs
+
+ $(MAKE) install PREFIX=$(CURDIR)/debian/wmbubble/usr BINARY=wmbubble
+ dh_install misc/wak.wav misc/wakwak.sh usr/share/wmbubble/
+ chmod +x $(CURDIR)/debian/wmbubble/usr/share/wmbubble/wakwak.sh
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+ dh_testdir
+ dh_testroot
+ dh_installdocs
+ dh_installmenu
+ dh_installman debian/wmbubble.1x
+ dh_installchangelogs ChangeLog
+ dh_strip
+ dh_compress
+ dh_fixperms
+ dh_installdeb
+ dh_shlibdeps
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install patch-stamp unpatch
diff --git a/debian/wmbubble.1x b/debian/wmbubble.1x
new file mode 100644
index 0000000..da97fc4
--- /dev/null
+++ b/debian/wmbubble.1x
@@ -0,0 +1,77 @@
+.TH WMBUBBLE 1x "March 28, 2004"
+.\" Please adjust this date whenever revising the manpage.
+.\"
+.\" Some roff macros, for reference:
+.\" .nh disable hyphenation
+.\" .hy enable hyphenation
+.\" .ad l left justify
+.\" .ad b justify to both left and right margins
+.\" .nf disable filling
+.\" .fi enable filling
+.\" .br insert line break
+.\" .sp <n> insert n+1 empty lines
+.\" for manpage-specific macros, see man(7)
+.SH NAME
+wmbubble \- system load monitor
+.SH SYNOPSIS
+.B wmbubble
+.RI [ options ] " " [ program1 ] " " [ program2 ]
+.br
+.SH DESCRIPTION
+This manual page documents briefly the
+.B wmbubble
+command.
+This manual page was written for the Debian GNU/Linux distribution
+because the original program does not have a manual page.
+.PP
+.\" TeX users may be more comfortable with the \fB<whatever>\fP and
+.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
+.\" respectively.
+.B wmbubble
+is a dockapp-style CPU, memory, swap and load average monitor. Based on the
+GNOME BubbleMon applet, this program has been considerably improved.
+.PP
+The higher the water level, the more memory is in use. The more profuse the
+bubbles, the higher the CPU usage. There is also a real-time CPU percentage
+display.
+.PP
+When the mouse is moved into the window, the display will change to show
+the load history, or, if the right shift is held, the current memory
+usage. If you press the right mouse button, the window will freeze in
+that state. You can unfreeze the display by pressing the right mouse
+button again.
+.PP
+.B program1
+and
+.B program2
+are the programs to spawn when either the left or middle mouse button
+is pressed, respectively.
+.\"
+.SH OPTIONS
+.TP
+.B \-d
+disable swimming duck
+.TP
+.B \-u
+disable upside-down duck
+.TP
+.B \-c
+disable CPU meter
+.TP
+.B \-m
+disable memory screen
+.TP
+.B \-p
+use alternative color scheme in memory info screen
+.TP
+.B \-k
+display memory and swap statistics in megabytes
+.TP
+.B \-h
+display help
+.SH AUTHOR
+wmbubble was written by timecop <timecop at japan.co.jp>
+
+This manual page was written by John H. Robinson, IV <jaqque at debian.org>,
+for the Debian GNU/Linux system (but may be used by others).
+.\" vim:syn=nroff
diff --git a/include/bubblemon.h b/include/bubblemon.h
index 1c25016..2306ce6 100644
--- a/include/bubblemon.h
+++ b/include/bubblemon.h
@@ -19,14 +19,14 @@
#ifndef _BUBBLEMON_H_
#define _BUBBLEMON_H_
-#include <gdk/gdk.h>
-#include <gdk/gdkx.h>
+/* Terrible place for it, but must be the same as in other include file */
+#define BOX_SIZE 58
/* CPU load alpha-blending: smaller values = ligher text
* minblend = mouseout
* maxblend = mousein
* min = 0
- * max = 128 */
+ * max = 256 */
#if defined(ENABLE_CPU) || defined(ENABLE_MEMSCREEN)
# define MINBLEND 80
# define MAXBLEND 190
@@ -41,7 +41,9 @@
#define REALY(y) ((y) >> POWER2)
#define MAKEY(y) ((y) << POWER2)
#define MAKE_INTEGER(x) ((int)((x)*MULTIPLIER+0.5))
-#define ROLLVALUE 100 /* frequency of history rollover */
+#define ROLLVALUE 1 /* frequency of history rollover */
+
+#include <X11/Xlib.h>
#ifdef sun
#include <sys/types.h>
@@ -66,22 +68,18 @@ typedef struct {
typedef struct {
/* X11 stuff */
Display *display;
- GdkWindow *win; /* main window */
- GdkWindow *iconwin; /* icon window */
- GdkGC *gc; /* drawing GC */
- GdkPixmap *pixmap; /* main dockapp pixmap */
- GdkBitmap *mask; /* dockapp mask */
+ XImage * xim;
/* main image buffer */
- unsigned char rgb_buf[56 * 56 * 3 + 1];
+ unsigned char rgb_buf[BOX_SIZE * BOX_SIZE * 3 + 1];
#ifdef ENABLE_MEMSCREEN
/* memory / swap screen buffer */
- unsigned char mem_buf[56 * 56 * 3 + 1];
+ unsigned char mem_buf[BOX_SIZE * BOX_SIZE * 3 + 1];
/* memory screen graph buffer */
- unsigned char his_bufa[56 * 31 * 3 + 1];
+ unsigned char his_bufa[BOX_SIZE * 31 * 3 + 1];
/* loadavg screen graph buffer */
- unsigned char his_bufb[56 * 33 * 3 + 1];
+ unsigned char his_bufb[BOX_SIZE * 33 * 3 + 1];
int screen_type; /* 0 - memory, 1 - cpu */
int picture_lock; /* blend coeff not changed when this is not 0 */
@@ -90,7 +88,7 @@ typedef struct {
/* bubble stuff */
int samples;
unsigned char *bubblebuf;
- int *colors;
+
int *waterlevels;
int *waterlevels_dy;
Bubble *bubbles;
@@ -127,13 +125,13 @@ typedef struct {
unsigned int swap_percent; /* swap used, in percent */
unsigned int mem_percent; /* memory used, in percent */
/* history of memory use */
- unsigned int memhist[53];
+ unsigned int memhist[BOX_SIZE-3];
unsigned int memadd;
/* loadavg stuff */
LoadAvg loadavg[3];
/* history of loadavgs */
- unsigned int history[53];
+ unsigned int history[BOX_SIZE-3];
unsigned int hisadd;
} BubbleMonData;
#endif /* _BUBBLEMON_H_ */
diff --git a/include/clockfont.h b/include/clockfont.h
new file mode 100644
index 0000000..59946f3
--- /dev/null
+++ b/include/clockfont.h
@@ -0,0 +1,19 @@
+const char clockdigit[]={
+"-MMM----M----MMM---MMM-----MM-MMMMM--MMM--MMMMM--MMM---MMM--"
+"M---M--MM---M---M-M---M---M-M-M-----M---M-----M-M---M-M---M-"
+"M---M---M-------M-----M--M--M-MMMM--M---------M-M---M-M---M-"
+"M---M---M------M----MM--MMMMM-M---M-MMMM-----M---MMM---MMMM-"
+"M---M---M-----M-------M-----M-----M-M---M---M---M---M-----M-"
+"M---M---M----M----M---M-----M-M---M-M---M---M---M---M-M---M-"
+"-MMM---MMM--MMMMM--MMM------M--MMM---MMM----M----MMM---MMM--"
+};
+/* PLEASE NOTE: THIS FONT HAS NO LOWERCASE M */
+const char clockalpha[]={
+".MM...MM..MMM...MM..MMM..MMMM.MMMM..MM..M..M.MMM..MMMM.M..M.M....M..M.M..M..MM..MMM...MM..MMM...MM..MMM..M..M.M..M.M..M.M..M.M..M.MMMM..MMM.M....MMM...MM........M........M............M........M.......M..............M.....M.......................................M....................................M..M...M.....M.M."
+"M..M.M..M.M..M.M..M.M..M.M....M....M..M.M..M..M......M.M..M.M....MMMM.MM.M.M..M.M..M.M..M.M..M.M..M..M...M..M.M..M.M..M.M..M.M..M....M..M...M......M..M..M........M.......M............M.......M.M......M.....M......M.M.....M.......................................M...................................M...M....M...M.M.."
+"M.MM.M..M.M..M.M....M..M.M....M....M....M..M..M......M.M.M..M....M..M.MM.M.M..M.M..M.M..M.M..M.M.....M...M..M.M..M.M..M..MM..M.M....M...M....M.....M..................MM..MMM...MM...MMM..MM...M....MMM.MMM............M..M..M........MMM...MM..MMM...MMM.MMM...MMM.MMMM.M..M.M..M.M..M.M..M.M..M.MMMM...M...M....M........"
+"M.MM.MMMM.MMM..M....M..M.MMM..MMM..M.MM.MMMM..M......M.MM...M....M..M.M.MM.M..M.MMM..M..M.MMM...MM...M...M..M.M..M.M..M..MM...M....M....M.....M....M....................M.M..M.M..M.M..M.M..M.MMMM.M..M.M..M..M......M.M.M...M........M..M.M..M.M..M.M..M.M..M.M.....M...M..M.M..M.M..M.M..M.M..M....M..M....M.....M......."
+"M.MM.M..M.M..M.M....M..M.M....M....M..M.M..M..M......M.M.M..M....M..M.M.MM.M..M.M....M..M.M..M....M..M...M..M.M..M.M..M.M..M..M...M.....M.....M....M..................MMM.M..M.M....M..M.MMMM..M....MMM.M..M..M......M.MM....M........M..M.M..M.M..M.M..M.M.....MM...M...M..M.M..M.M..M..MM...MMM..MM....M...M....M........"
+"M....M..M.M..M.M..M.M..M.M....M....M..M.M..M..M...M..M.M..M.M....M..M.M..M.M..M.M....M.MM.M..M.M..M..M...M..M..M.M.MMMM.M..M..M...M.....M......M...M.................M..M.M..M.M..M.M..M.M.....M......M.M..M..M...M..M.M.M...M........M..M.M..M.MMM...MMM.M.......M..M.M.M..M..M.M.MMMM.M..M....M.M......M...M....M........"
+".MMM.M..M.MMM...MM..MMM..MMMM.M.....MM..M..M.MMM...MM..M..M.MMMM.M..M.M..M..MM..M.....MMM.M..M..MM...M....MM....M..M..M.M..M..M...MMMM..MMM....M.MMM.......MMMM.......MMM.MMM...MM...MMM..MMM..M...MMM..M..M..M....MM..M..M..MM..mmmm.M..M..MM..M.......M.M....MMM....M...MMM...M..M..M.M..M.MMM..MMMM....M..M...M........."
+};
diff --git a/include/frame.xbm b/include/frame.xbm
new file mode 100644
index 0000000..1848b9d
--- /dev/null
+++ b/include/frame.xbm
@@ -0,0 +1,42 @@
+#define master_width 58
+#define master_height 58
+static unsigned char master_bits[] = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
diff --git a/include/numbers-2.h b/include/numbers-2.h
new file mode 100644
index 0000000..49b9b86
--- /dev/null
+++ b/include/numbers-2.h
@@ -0,0 +1,3 @@
+unsigned char bigdigits[130*32]={
+0,0,0,2,85,155,156,87,2,0,0,0,0,0,0,0,0,50,169,169,169,5,0,0,0,0,0,6,89,173,228,252,241,185,70,0,0,0,0,0,0,5,68,130,162,161,119,29,0,0,0,0,0,0,0,0,0,0,122,169,169,169,14,0,0,0,21,83,83,83,83,83,83,83,83,64,0,0,0,0,0,0,31,160,233,250,214,134,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,172,236,252,226,150,24,0,0,0,0,0,0,10,104,160,156,91,4,0,0,0,0,0,0,6,174,255,255,255,255,177,7,0,0,0,0,0,0,23,224,255,255,255,7,0,0,0,0,0,216,255,255,255,255,255,255,253,117,0,0,0,0,102,227,254,255,255,255,255 [...]
+};
diff --git a/misc/digits.xpm b/misc/digits.xpm
new file mode 100644
index 0000000..d995095
--- /dev/null
+++ b/misc/digits.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char * digits_xpm[] = {
+"66 7 5 1",
+" c None",
+". c #000000",
+"+ c #004941",
+"@ c #007D71",
+"# c #20B0AC",
+"..###..... at ..@###@.@###@. at ...@.@###@.@###@.@###@.@###@.@###@......",
+".#...#....#......#.....#.#...#.#.....#.........#.#...#.#...#.#...#",
+".#...#....#......#.....#.#...#.#.....#.........#.#...#.#...#....#.",
+". at ...@.... at ..@###@..###@.@###@.@###@.@###@..... at .+###+.@###@...#..",
+".#...#....#..#.........#.....#.....#.#...#.....#.#...#.....#..#...",
+".#...#....#..#.........#.....#.....#.#...#.....#.#...#.....#.#...#",
+"..###.....#..@###@.@###@..... at .@###@.@###@..... at .@###@.@###@......"};
diff --git a/misc/load_58.c b/misc/load_58.c
new file mode 100644
index 0000000..f7b0591
--- /dev/null
+++ b/misc/load_58.c
@@ -0,0 +1,370 @@
+/* GIMP RGB C-Source image dump (load_58.c) */
+
+static const struct {
+ unsigned int width;
+ unsigned int height;
+ unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */
+ unsigned char pixel_data[58 * 58 * 3 + 1];
+} load_screen = {
+ 58, 58, 3,
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301"
+ "\304\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\0\0\0\301\304\0"
+ "\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\301\304\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\301\304\0"
+ "\0\0\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\301\304\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301"
+ "\304\0\0\0\0\301\304\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\301\304\0\0\0\0\0\0\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\301\304\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\301\304\0\0\0\0\301\304\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236"
+ "\304\355\0\0\0\0\0\0\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236"
+ "\304\355\236\304\355\236\304\355\0\0\0\0\0\0\236\304\355\236\304\355\236"
+ "\304\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\0\0\0\0\0\0\236"
+ "\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355"
+ "\0\0\0\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304"
+ "\355\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\236\304\355\236\304\355\0"
+ "\0\0\236\304\355\236\304\355\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0"
+ "\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236"
+ "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0"
+ "\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0"
+ "\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236"
+ "\304\355\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0"
+ "\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236"
+ "\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355"
+ "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0"
+ "\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355"
+ "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0"
+ "\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0"
+ "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+ "\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0"
+ "\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304"
+ "\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0"
+ "\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\236\304"
+ "\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0"
+ "\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304"
+ "\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0"
+ "\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0"
+ "\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236"
+ "\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+ "\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304"
+ "\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0"
+ "\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\236\304"
+ "\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0"
+ "\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236"
+ "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0"
+ "\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+ "\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304"
+ "\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0"
+ "\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304"
+ "\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0"
+ "\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236"
+ "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236"
+ "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0"
+ "\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0"
+ "\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0"
+ "\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+ "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+ "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\236\304"
+ "\355\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304"
+ "\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304"
+ "\355\236\304\355\0\0\0\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236"
+ "\304\355\236\304\355\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\236"
+ "\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\0\0"
+ "\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236"
+ "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0"
+ "\0\236\304\355\236\304\355\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\236\304\355"
+ "\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355"
+ "\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355"
+ "\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355"
+ "\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355"
+ "\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355"
+ "\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355"
+ "\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355"
+ "\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355"
+ "\236\304\355\236\304\355\236\304\355\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+ "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\6*\0\6*\0\6"
+ "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+ "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+ "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+ "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*"
+ "\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+ "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+ "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+ "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+ "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+ "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+ "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\0\0\0\0\0\0\0\0\0\0\0\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+ "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+ "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+ "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+ "*\0\6*\0\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+ "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+ "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+ "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+ "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+ "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+ "\6*\0\6*\0\6*\0\6*\0\6*\0\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+ "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304"
+ "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304"
+ "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304"
+ "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304"
+ "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304"
+ "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304"
+ "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304"
+ "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304"
+ "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304"
+ "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",
+};
+
diff --git a/misc/load_58.xcf b/misc/load_58.xcf
new file mode 100644
index 0000000..71d2624
Binary files /dev/null and b/misc/load_58.xcf differ
diff --git a/misc/load_58.xpm b/misc/load_58.xpm
new file mode 100644
index 0000000..0cbafcf
--- /dev/null
+++ b/misc/load_58.xpm
@@ -0,0 +1,66 @@
+/* XPM */
+static char * load_58_xpm[] = {
+"58 58 5 1",
+" c #000000",
+". c #062A00",
+"+ c #202020",
+"@ c #308CF0",
+"# c #C1C400",
+" ",
+" ",
+" # ## # ## ",
+" ## # ## # ",
+" # ## # ## ",
+" # # # # ",
+" # ## # ## ",
+" ",
+" ",
+" @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ ",
+" @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ",
+" @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ",
+" @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ",
+" @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ",
+" @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ",
+" @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ",
+" @@@ @@@ @ @@@ @@@ @@@ @@@ @ @@@ @@@ @@@ @@@ @ @@@ @@@ ",
+" ",
+" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ",
+" ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" ...................................................... ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" ...................................................... ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" ...................................................... ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" ...................................................... ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" ",
+" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ",
+" ",
+" "};
diff --git a/misc/mem_58.c b/misc/mem_58.c
new file mode 100644
index 0000000..f4962ec
--- /dev/null
+++ b/misc/mem_58.c
@@ -0,0 +1,371 @@
+/* GIMP RGB C-Source image dump (mem_58.c) */
+
+static const struct {
+ unsigned int width;
+ unsigned int height;
+ unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */
+ unsigned char pixel_data[58 * 58 * 3 + 1];
+} mem_screen = {
+ 58, 58, 3,
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304"
+ "\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355\0"
+ "\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236"
+ "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236"
+ "\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355"
+ "\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+ "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+ "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+ "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0"
+ "\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0"
+ "\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0"
+ "\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0"
+ "\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0"
+ "\0\0\0\301\304\0\301\304\0\301\304\0\301\304\0\0\0\0\0\0\0\0\0\0\236\304"
+ "\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0"
+ "\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0"
+ "\0\0\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\0\0\0\0\0\0\236\304"
+ "\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304"
+ "\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\301\304\0\0\0\0\301"
+ "\304\0\0\0\0\301\304\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0"
+ "\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0"
+ "\0\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0"
+ "\0\0\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304"
+ "\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\236"
+ "\304\355\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+ "\236\304\355\0\0\0\0\0\0\0\0\0\301\304\0\0\0\0\301\304\0\0\0\0\301\304\0"
+ "\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355"
+ "\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\236\304\355\236\304"
+ "\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0"
+ "\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236"
+ "\304\355\236\304\355\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0"
+ "\0\0\0\0\301\304\0\0\0\0\301\304\0\0\0\0\301\304\0\0\0\0\0\0\0\236\304\355"
+ "\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0"
+ "\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+ "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0"
+ "\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304"
+ "\355\0\0\0\236\304\355\0\0\0\0\0\0\301\304\0\0\0\0\301\304\0\0\0\0\301\304"
+ "\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355"
+ "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\236\304"
+ "\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236"
+ "\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355"
+ "\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355"
+ "\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\0\0\0\236\304"
+ "\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\236"
+ "\304\355\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\236"
+ "\304\355\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355"
+ "\236\304\355\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\236\304\355\236\304"
+ "\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304"
+ "\355\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236"
+ "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355"
+ "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+ "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0"
+ "\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\301\304"
+ "\0\301\304\0\301\304\0\301\304\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355"
+ "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+ "\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304"
+ "\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\301\304\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+ "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0"
+ "\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304"
+ "\355\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\301\304\0\301\304\0\0"
+ "\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236"
+ "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0"
+ "\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\0\0\0\0\0\0"
+ "\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0"
+ "\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+ "\0\0\0\0\0\0\301\304\0\301\304\0\301\304\0\301\304\0\0\0\0\0\0\0\0\0\0\236"
+ "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236"
+ "\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\0\0\0\236"
+ "\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355"
+ "\236\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0"
+ "\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304"
+ "\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+ "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+ "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+ "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+ "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+ "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*"
+ "\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+ "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+ "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+ "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+ "\6*\0\6*\0\6*\0\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+ "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\6*\0\6*\0\6*\0\6*"
+ "\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+ "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+ "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+ "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+ "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+ "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+ "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+ "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+ "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+ "\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+ "\304\355\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0",
+};
+
diff --git a/misc/mem_58.xcf b/misc/mem_58.xcf
new file mode 100644
index 0000000..a8be8ea
Binary files /dev/null and b/misc/mem_58.xcf differ
diff --git a/misc/mem_58.xpm b/misc/mem_58.xpm
new file mode 100644
index 0000000..2dbad8e
--- /dev/null
+++ b/misc/mem_58.xpm
@@ -0,0 +1,66 @@
+/* XPM */
+static char * mem_58_xpm[] = {
+"58 58 5 1",
+" c #000000",
+". c #062A00",
+"+ c #202020",
+"@ c #308CF0",
+"# c #C1C400",
+" ",
+" ",
+" @ @@@ @@@ @@@ @@@ @@@ @ @ @@@ @@@ @@@ @ @ ",
+" @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ",
+" @ @ @ @ @ @ @ @ @ @ @ #### @ @ @ @ @ @ ",
+" @ @ @ @@@ @ @ @ @ @ @ @ # # # @ @ @ @ @ @ ",
+" @ @ @@@ @ @ @ @@@ @ @ @@ # # # @ @ @ @@@ @ ",
+" @@@ @ @ @ @ @ @ @@@ @ @ # # # @ @ @ @ @ @ ",
+" @ @ @ @ @ @ @ @ @ @ @ # # # @ @ @ @ @ @ @ ",
+" @ @@@ @@@ @ @@@ @@@ @ @ @@@ @ @@@ @ @ ",
+" ",
+" @@@ @ @ @@@ @@@ @@@ @ @ ",
+" @ @ @ @ @ @ @ @ @ @ @ @ ",
+" @ @ @ @ #### @ @ @ @ @ @ @ ",
+" @ @ @ @ # @ @ @ @ @ @ @ ",
+" @ @ @@ ### @ @ @ @ @ @ @ ",
+" @ @ @ @ # @ @ @ @ @ @ @ ",
+" @ @ @ @ #### @ @ @ @ @ @ @ @ ",
+" @@@ @ @ @@@ @@@ @@@ @ @ ",
+" ",
+" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ",
+" ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" ...................................................... ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" ...................................................... ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" ...................................................... ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" ...................................................... ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++ ",
+" ",
+" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ",
+" ",
+" "};
diff --git a/misc/numbers.xcf b/misc/numbers.xcf
new file mode 100644
index 0000000..402338c
Binary files /dev/null and b/misc/numbers.xcf differ
diff --git a/misc/numbers.xpm b/misc/numbers.xpm
new file mode 100644
index 0000000..2ba11d9
--- /dev/null
+++ b/misc/numbers.xpm
@@ -0,0 +1,14 @@
+/* XPM */
+static char * numbers_xpm[] = {
+"48 9 2 1",
+" g #FFFFFF",
+". g #000000",
+" ... . . ... . . . . . . . . . .",
+" . ... . . . . . . . . . . . . . . . . . . . .",
+" . ... ... ... . . . ... ..... . . . . . . . .",
+" . ... ... ... . . . ... ... . . . . . . . . .",
+" . ... . .. . . . . . ... . . . . .. . .",
+" . ... . ..... . ... . . ... . . . . . . . .",
+" . ... . . . . ... . . . . ... . . ... . . . . .",
+" ... . . ... . . ... . . . . . . .",
+"................................................"};
diff --git a/wmx11pixmap.c b/wmx11pixmap.c
new file mode 100644
index 0000000..c2bed3a
--- /dev/null
+++ b/wmx11pixmap.c
@@ -0,0 +1,139 @@
+/*
+ * wmX11pixmap derived from wmtunlo, from wmgeneral, from wmppp
+ *
+ * Authors:
+ * Martijn Pieterse (pieterse at xs4all.nl) (wmgeneral)
+ * Tomasz Maka <pasp at ll.pl> (wmtunlo)
+ * Mike Henderson <mghenderson at lanl.gov> (wmMand)
+ * Robert Jacobs (rnjacobs at mit.edu)
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "wmx11pixmap.h"
+
+/* Private variables */
+GC NormalGC;
+Pixmap wmgen;
+
+/* flush_expose
+ removes all expose events off the event stack */
+static int flush_expose(Window w) {
+ XEvent dummy;
+ int i=0;
+
+ while (XCheckTypedWindowEvent(wmxp_display, w, Expose, &dummy))
+ i++;
+
+ return i;
+}
+
+/* RedrawWindow
+ redraws both windows from the contents of the passed Ximage */
+void RedrawWindow(XImage * xim) {
+ XPutImage(wmxp_display, wmgen, NormalGC, xim, 0, 0, 0, 0, BOX_SIZE, BOX_SIZE);
+ flush_expose(wmxp_iconwin);
+ XCopyArea(wmxp_display, wmgen, wmxp_iconwin, NormalGC, 0,0, BOX_SIZE, BOX_SIZE, 0,0);
+ flush_expose(wmxp_win);
+ XCopyArea(wmxp_display, wmgen, wmxp_win, NormalGC, 0,0, BOX_SIZE, BOX_SIZE, 0,0);
+}
+
+/* initX11pixmap */
+
+XImage * initwmX11pixmap(char * cwname, int argc, char *argv[]) {
+ unsigned long gcm;
+ XTextProperty name;
+ XClassHint classHint;
+ XGCValues gcv;
+ XWMHints mywmhints;
+ Window Root;
+ Visual * visual;
+ long InterestingEvents = NoEventMask;
+ int screen;
+ unsigned int depth;
+ XImage * xim;
+
+ if (!(wmxp_display = XOpenDisplay(NULL))) {
+ fprintf(stderr, "%s: can't open display %s\n", cwname, XDisplayName(NULL));
+ exit(1);
+ }
+ screen = DefaultScreen(wmxp_display);
+ Root = RootWindow(wmxp_display, screen);
+ /*x_fd = XConnectionNumber(wmxp_display);*/
+ visual = DefaultVisual(wmxp_display, screen);
+ depth = DefaultDepth(wmxp_display, screen);
+
+ if (visual->red_mask == 0 ||
+ visual->green_mask == 0 ||
+ visual->blue_mask == 0 ||
+ (visual->class != TrueColor && visual->class != DirectColor)) {
+ fprintf(stderr, "We require a true- or direct- color display, and yours isn't.\n");
+ exit(2);
+ }
+
+ wmgen = XCreatePixmap(wmxp_display,Root,BOX_SIZE,BOX_SIZE,depth);
+ /* Create an XImage without data. Then allocate space for same. */
+ xim = XCreateImage(wmxp_display, visual, depth, ZPixmap, 0, NULL, BOX_SIZE, BOX_SIZE, 32, 0);
+ xim->data = (char *)malloc(xim->bytes_per_line * BOX_SIZE );
+
+ /* Create a window to hold the stuff */
+ wmxp_win = XCreateSimpleWindow
+ (wmxp_display, Root, 0,0, BOX_SIZE, BOX_SIZE, 0,
+ BlackPixel(wmxp_display,screen), WhitePixel(wmxp_display,screen));
+ wmxp_iconwin = XCreateSimpleWindow
+ (wmxp_display, wmxp_win, 0,0, BOX_SIZE, BOX_SIZE, 0,
+ BlackPixel(wmxp_display,screen), WhitePixel(wmxp_display,screen));
+
+ XStoreName(wmxp_display, wmxp_win, cwname);
+ XStoreName(wmxp_display, wmxp_iconwin, cwname);
+
+ /* Activate hints */
+ classHint.res_name = cwname;
+ classHint.res_class = cwname;
+ XSetClassHint(wmxp_display, wmxp_win, &classHint);
+
+ /* Select acceptable input events */
+ InterestingEvents |= KeyPressMask | KeyReleaseMask |
+ ButtonPressMask | ButtonReleaseMask |
+ EnterWindowMask | LeaveWindowMask | ExposureMask;
+
+ XSelectInput(wmxp_display, wmxp_win, InterestingEvents);
+ XSelectInput(wmxp_display, wmxp_iconwin, InterestingEvents);
+
+ if (XStringListToTextProperty(&cwname, 1, &name) == 0) {
+ fprintf(stderr, "%s: can't allocate window name\n", cwname);
+ exit(3);
+ }
+
+ /* Create GC for drawing */
+ gcm = GCGraphicsExposures;
+ gcv.graphics_exposures = 0;
+ NormalGC = XCreateGC(wmxp_display, Root, gcm, &gcv);
+
+ /* Act like a dockapp */
+ mywmhints.input = True;
+ mywmhints.initial_state = WithdrawnState;
+ mywmhints.icon_window = wmxp_iconwin;
+ mywmhints.icon_x = 0;
+ mywmhints.icon_y = 0;
+ mywmhints.window_group = wmxp_win;
+ mywmhints.flags = InputHint | StateHint | IconWindowHint | IconPositionHint | WindowGroupHint;
+ XSetWMHints(wmxp_display, wmxp_win, &mywmhints);
+
+ XSetCommand(wmxp_display, wmxp_win, argv, argc);
+
+ XMapWindow(wmxp_display, wmxp_win);
+
+
+ return xim;
+}
+
+void wmPutPixel(XImage * xim, int x, int y, unsigned char r, unsigned char g, unsigned char b) {
+ unsigned long pxl;
+
+ pxl = ((r*xim->red_mask/255)&xim->red_mask) |
+ ((g*xim->green_mask/255)&xim->green_mask) |
+ ((b*xim->blue_mask/255)&xim->blue_mask);
+
+ XPutPixel(xim, x, y, pxl);
+};
diff --git a/wmx11pixmap.h b/wmx11pixmap.h
new file mode 100644
index 0000000..6ee50b6
--- /dev/null
+++ b/wmx11pixmap.h
@@ -0,0 +1,20 @@
+#ifndef WMX11PIXMAP_H_INCLUDED
+#define WMX11PIXMAP_H_INCLUDED
+
+#include <X11/Xutil.h>
+
+/* Defines */
+
+#define BOX_SIZE 58
+
+/* Function Prototypes */
+
+XImage * initwmX11pixmap(char * cwname, int argc, char *argv[]);
+void RedrawWindow(XImage * xim);
+void wmPutPixel(XImage *, int x, int y, unsigned char r, unsigned char g, unsigned char b);
+
+/* Global variables necessary for the event handlers */
+Display *wmxp_display;
+Window wmxp_iconwin, wmxp_win;
+
+#endif
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-wmaker/wmbubble.git
More information about the Pkg-wmaker-commits
mailing list