[Pkg-wmaker-commits] [wmbubble] 53/207: 1- deprecate pregenerated graph screens, generate them programmatically at startup. Allows runtime recoloring and opens the way for start-time configuration of size of dockapp. 2- try to do palettization conversion at start-time instead of runtime so that faster copies are used during runtime. (draw_digit) 3- shorten some command-line options / xresource names because we weren't consistent about calling colors "-foocolor" anyway. 4- Remove some comments that were lies. 5- draw_largedigit: try using walking pointers here for performance.
Doug Torrance
dtorrance-guest at moszumanska.debian.org
Mon Aug 24 04:18:01 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 5f2eb1729088fd1432940cf8e5be200ab2885a6d
Author: Robert Jacobs <rnjacobs at mit.edu>
Date: Mon Aug 1 00:51:20 2011 -0700
1- deprecate pregenerated graph screens, generate them
programmatically at startup. Allows runtime recoloring and opens the
way for start-time configuration of size of dockapp.
2- try to do palettization conversion at start-time instead of runtime
so that faster copies are used during runtime. (draw_digit)
3- shorten some command-line options / xresource names because we
weren't consistent about calling colors "-foocolor" anyway.
4- Remove some comments that were lies.
5- draw_largedigit: try using walking pointers here for performance.
---
bubblemon.c | 272 +++++++++++++++++++++++++++++++++++++++++++------------
misc/numbers.xpm | 2 +-
misc/ofmspct.xpm | 13 +++
3 files changed, 226 insertions(+), 61 deletions(-)
diff --git a/bubblemon.c b/bubblemon.c
index 9fbd2c7..95de185 100644
--- a/bubblemon.c
+++ b/bubblemon.c
@@ -68,9 +68,8 @@
#include "include/ducks.h"
#include "include/digits.h"
-#include "misc/load_58.c"
-#include "misc/mem_58.c"
#include "misc/numbers.xpm"
+#include "misc/ofmspct.xpm"
/* #define DEBUG_DUCK 1 */
@@ -90,16 +89,20 @@ void bubblemon_setup_samples(void);
void bubblemon_allocate_buffers(void);
void bubblemon_update(int cpu);
void bubblebuf_colorspace(void);
+void build_graphs(void);
void make_new_bubblemon_dockapp(void);
void get_memory_load_percentage(void);
void bubblemon_session_defaults(XrmDatabase x_resource_database);
int get_screen_selection(void);
/* draw functions for load average / memory screens */
+void draw_from_xpm(char **xpm, unsigned char *whither, unsigned int targetw,
+ unsigned int xpmx, unsigned int xpmy, unsigned int xpmw,
+ unsigned int xpmh, unsigned int color);
void draw_pixel(unsigned int x, unsigned int y, unsigned char *buf, char *c);
void draw_history(int num, int size, unsigned int *history,
unsigned char *buf);
-void draw_digit(int num, unsigned char * whither, unsigned char red, unsigned char grn, unsigned char blu);
+void draw_digit(unsigned char * from, unsigned char * whither);
void draw_string(char *string, int x, int y, int color);
void draw_cpudigit(int what, unsigned char *whither);
@@ -141,6 +144,13 @@ int delay_time = 100000;
/* duck_colors[0] is always transparent */
int duck_colors[4] = {0,0xF8FC00,0xF8B040,0};
+/* 1, 5, 15 on load average graph; m, s on memory utilization graph */
+int graph_labels = 0xC1C400;
+int graph_field = 0x202020;
+int graph_grid = 0x062A00;
+
+unsigned char * empty_loadgraph, * empty_memgraph;
+unsigned char * graph_numbers_n_rgb, * graph_numbers_b_rgb;
XrmOptionDescRec x_resource_options[] = {
{"-maxbubbles", "*maxbubbles", XrmoptionSepArg, (XPointer) NULL},
@@ -164,8 +174,11 @@ XrmOptionDescRec x_resource_options[] = {
{"-u", "*upsidedown", XrmoptionNoArg, (XPointer) "no"}, /* disable upside-down-ifying */
{"-cpumeter", "*cpumeter", XrmoptionSepArg, (XPointer) NULL},
{"-c", "*cpumeter", XrmoptionNoArg, (XPointer) "no"}, /* disable numeric cpu gauge */
- {"-graphdigitcolor","*graphdigitcolor",XrmoptionSepArg,(XPointer) NULL},
- {"-graphwarncolor","*graphwarncolor", XrmoptionSepArg, (XPointer) NULL},
+ {"-graphdigit", "*graphdigit", XrmoptionSepArg, (XPointer) NULL},
+ {"-graphwarn", "*graphwarn", XrmoptionSepArg, (XPointer) NULL},
+ {"-graphlabel", "*graphlabel", XrmoptionSepArg, (XPointer) NULL},
+ {"-graphfield", "*graphfield", XrmoptionSepArg, (XPointer) NULL},
+ {"-graphgrid", "*graphgrid", XrmoptionSepArg, (XPointer) NULL},
{"-p", ".graphdigitpale", XrmoptionNoArg, (XPointer) "1"},
{"-graphs", "*graphs", XrmoptionSepArg, (XPointer) NULL}, /* disable graphs */
{"-m", "*graphs", XrmoptionIsArg, (XPointer) "no"},
@@ -201,8 +214,11 @@ const struct XrmExtras {
{"-u", Is_Bool, &upside_down_duck_enabled, "The duck can never flip" },
{"-cpumeter", Is_Bool, &cpu_enabled, "Show the current load at the bottom"},
{"-c", Is_Bool, &cpu_enabled, "Don't show the current load"},
- {"-graphdigitcolor",Is_Color, &graph_digit_colors[0], "The color for the digits on the graphs"},
- {"-graphwarncolor", Is_Color, &graph_digit_colors[1], "The color for the digits on the memory graph when above 90%" },
+ {"-graphdigit", Is_Color, &graph_digit_colors[0], "The color for the digits on the graphs"},
+ {"-graphwarn", Is_Color, &graph_digit_colors[1], "The color for the digits on the memory graph when above 90%" },
+ {"-graphlabel", Is_Color, &graph_labels, "The color for the 1 5 and 15 on load graph and m and s on mem graph" },
+ {"-graphfield", Is_Color, &graph_field, "The background color of the graphs" },
+ {"-graphgrid", Is_Color, &graph_grid, "The color of the grid lines in the graphs" },
{"-p", Is_Bool, &pale, "Adjust the digit colors to pale blue and cyan"},
{"-graphs", Is_Bool, &memscreen_enabled, "Does hovering show the graphs" },
{"-m", Is_Bool, &memscreen_enabled, "Graphs are never shown"},
@@ -336,13 +352,6 @@ int main(int argc, char **argv) {
frames_count = last_time = 0;
#endif
- 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, "compilation time error: 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);
- abort();
- }
-
/* VERY first thing: zero data structure */
memset(&bm, 0, sizeof(bm));
@@ -369,8 +378,6 @@ int main(int argc, char **argv) {
exit(-1);
#endif
-
- /* create dockapp window. creates windows, allocates memory, etc */
make_new_bubblemon_dockapp();
#ifdef PRO
@@ -504,7 +511,6 @@ int get_screen_selection(void) {
}
}
-/* This is the function that actually creates the display widgets */
void make_new_bubblemon_dockapp(void) {
/* We begin with zero bubbles */
bm.n_bubbles = 0;
@@ -512,7 +518,7 @@ void make_new_bubblemon_dockapp(void) {
/* Allocate memory for calculations */
bubblemon_allocate_buffers();
- bubblemon_setup_samples();
+ build_graphs();
} /* make_new_bubblemon_dockapp */
/*
@@ -801,29 +807,55 @@ void bubblebuf_colorspace(void) {
}
} /* bubblebuf_colorspace */
-/* draws 4x8 digits for the memory/swap panel */
-void draw_digit(int num, unsigned char * whither,
- unsigned char red, unsigned char grn, unsigned char blu) {
+void draw_from_xpm(char **xpm, unsigned char *whither, unsigned int targetw,
+ unsigned int xpmx, unsigned int xpmy, unsigned int xpmw,
+ unsigned int xpmh, unsigned int color) {
+ unsigned char r=GET_RED(color),g=GET_GRN(color),b=GET_BLU(color);
+ int yy,xx,ncolors,cpp;
+ unsigned char * to;
+ char * from;
+ char transparent=0;
+
+ sscanf(xpm[0],"%u %u %u %u",&xx,&yy,&ncolors,&cpp);
+ if (cpp != 1) abort(); /* fuck that */
+ if (xpmx+xpmw > xx || xpmy+xpmh > yy) return;
+
+ for (yy=1;yy<=ncolors;yy++) {
+ if (strcasestr(xpm[yy],"none")) {
+ transparent = xpm[yy][0];
+ yy=255;
+ }
+ }
+
+ for (yy=0;yy<xpmh;yy++) {
+ to = whither + targetw*3*yy;
+ from = &xpm[1+ncolors+xpmy+yy][xpmx];
+ for (xx=0;xx<xpmw;xx++,from++,to+=3) {
+ if (*from != transparent) {
+ to[0]=r; to[1]=g; to[2]=b;
+ }
+ }
+ }
+}
+
+/* draws 3x8 digits for the memory/swap panel */
+void draw_digit(unsigned char * from, unsigned char * whither) {
int xx, yy;
- char *from;
unsigned char *to;
-
- num *= 4;
-
+ /* assumes layout of from is 3x9x3bpp */
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;
- }
- }
+ for (xx = 0; xx < 9; xx++)
+ *to++ = *from++;
}
}
/* draws a string using previous function. non-digits and non-K/M = space */
void draw_string(char *string, int x, int y, int color) {
unsigned char c;
+ unsigned char * graph_numbers = graph_numbers_n_rgb;
+
+ if (color) graph_numbers = graph_numbers_b_rgb;
/* bluish rgb:48,140,240 pale rgb:158,196,237
reddish rgb:237,23,23 pale(cyan) rgb:0,255,233 */
@@ -834,10 +866,8 @@ void draw_string(char *string, int x, int y, int color) {
else if (c >= '0' && c <= '9') c -= '0';
if (c <= 11)
- draw_digit(c, &bm.mem_buf[3*(y*BOX_SIZE+x)],
- GET_RED(graph_digit_colors[color]),
- GET_GRN(graph_digit_colors[color]),
- GET_BLU(graph_digit_colors[color]));
+ draw_digit(&graph_numbers[3*3*9*c],
+ &bm.mem_buf[3*(y*BOX_SIZE+x)]);
x += 4;
}
}
@@ -890,7 +920,7 @@ void render_secondary(void) {
int i;
/* make a clean buffer with blank spaces. */
- memcpy(bm.mem_buf, bm.screen_type ? load_screen.pixel_data : mem_screen.pixel_data,
+ memcpy(bm.mem_buf, bm.screen_type ? empty_loadgraph : empty_memgraph,
BOX_SIZE * BOX_SIZE * 3);
if (bm.screen_type) {
@@ -979,23 +1009,24 @@ void draw_cpudigit(int what, unsigned char *whither) {
void draw_dtchr(const char letter, unsigned char * rgbbuf) {
int x,y;
+ unsigned char * attenuator;
if (letter>='0' && letter<='9') {
for (y=0;y<7;y++)
- for (x=0;x<5;x++)
+ for (x=0,attenuator=&rgbbuf[y*BOX_SIZE*3];x<5;x++)
if (clockdigit[x+(y*10+(letter-'0'))*6]=='M') {
- rgbbuf[(x+y*BOX_SIZE)*3 ]>>=1;
- rgbbuf[(x+y*BOX_SIZE)*3+1]>>=1;
- rgbbuf[(x+y*BOX_SIZE)*3+2]>>=1;
+ *(attenuator++)>>=1; *(attenuator++)>>=1; *(attenuator++)>>=1;
+ } else {
+ attenuator += 3;
}
} else if (letter>='@' && letter<='~') {
for (y=0;y<7;y++)
- for (x=0;x<4;x++)
+ for (x=0,attenuator=&rgbbuf[y*BOX_SIZE*3];x<4;x++)
if (clockalpha[x+(y*63+(letter-'@'))*5]=='M') {
- rgbbuf[(x+y*BOX_SIZE)*3 ]>>=1;
- rgbbuf[(x+y*BOX_SIZE)*3+1]>>=1;
- rgbbuf[(x+y*BOX_SIZE)*3+2]>>=1;
- }
+ *(attenuator++)>>=1; *(attenuator++)>>=1; *(attenuator++)>>=1;
+ } else {
+ attenuator += 3;
+ }
} else if (letter==':') {
rgbbuf[3*BOX_SIZE*3 ]>>=1;
rgbbuf[3*BOX_SIZE*3+1]>>=1;
@@ -1009,15 +1040,16 @@ void draw_dtchr(const char letter, unsigned char * rgbbuf) {
void draw_largedigit(char number, unsigned char * rgbbuf) {
int x,y;
int t,v;
+ unsigned char * from, * to;
if (number>='0' && number<='9') number-='0';
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*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;
+ for (y=0;y<32;y++)
+ for (x=0,from=&bigdigits[number*13+y*130],to=&rgbbuf[y*BOX_SIZE*3];x<13;x++) {
+ v=*from++>>2;
+ t=*to+v; *(to++)=(t>255)?255:t;
+ t=*to+v; *(to++)=(t>255)?255:t;
+ t=*to+v; *(to++)=(t>255)?255:t;
}
}
}
@@ -1293,14 +1325,8 @@ void duck_swimmer() {
draw_duck(tx, posy, animate_correctly(), rev, upsidedown);
}
-void bubblemon_setup_samples(void) {
- bm.loadIndex = 0;
- bm.load = calloc(bm.samples, sizeof(u_int64_t));
- bm.total = calloc(bm.samples, sizeof(u_int64_t));
-}
-
void bubblemon_allocate_buffers(void) {
- int i;
+ int ii;
/* storage for bubbles */
bm.bubbles = (Bubble *) malloc(sizeof(Bubble) * bm.maxbubbles);
@@ -1310,12 +1336,138 @@ void bubblemon_allocate_buffers(void) {
/* Allocate water level memory */
bm.waterlevels = malloc(BOX_SIZE * sizeof(int));
- for (i = 0; i < BOX_SIZE; i++) {
- bm.waterlevels[i] = MAKEY(BOX_SIZE);
+ for (ii = 0; ii < BOX_SIZE; ii++) {
+ bm.waterlevels[ii] = MAKEY(BOX_SIZE);
}
/* Allocate water level velocity memory */
bm.waterlevels_dy = calloc(BOX_SIZE, sizeof(int));
+
+ empty_loadgraph = calloc(BOX_SIZE * BOX_SIZE,3);
+ empty_memgraph = calloc(BOX_SIZE * BOX_SIZE,3);
+ graph_numbers_n_rgb = calloc(3*3*9*12,1);
+ graph_numbers_b_rgb = calloc(3*3*9*12,1);
+
+ for (ii = 0; ii < 12; ii++) {
+ draw_from_xpm(numbers_xpm,&graph_numbers_n_rgb[ii*3*3*9],3,
+ 4*ii,0,3,9,graph_digit_colors[0]);
+ draw_from_xpm(numbers_xpm,&graph_numbers_b_rgb[ii*3*3*9],3,
+ 4*ii,0,3,9,graph_digit_colors[1]);
+ }
+
+ bm.loadIndex = 0;
+ bm.load = calloc(bm.samples, sizeof(u_int64_t));
+ bm.total = calloc(bm.samples, sizeof(u_int64_t));
+}
+
+void build_graphs(void) {
+ int xx, yy;
+ unsigned char r,g,b;
+ /* Dynamically generate empty graphs for status overlays. This allows us
+ to easily support changing colors at no computational cost and also to
+ later support runtime sizing of the dockapp. (Why would you want it
+ something significantly different than 58x58? dunno) */
+
+ /* For the memory graph, we need to draw the following:
+ - memory line: m and %
+ - swap line: s and %
+ - two hlines
+ - a field of solid color for the graph
+ - gridlines in the graph */
+
+ /* memory */
+ draw_from_xpm(ofmspct_xpm,&empty_memgraph[3*(32+4*BOX_SIZE)],BOX_SIZE,
+ 6,0,5,5,graph_labels); /* m */
+ draw_from_xpm(ofmspct_xpm,&empty_memgraph[3*(51+2*BOX_SIZE)],BOX_SIZE,
+ 18,0,4,8,graph_digit_colors[0]); /* mem% */
+ draw_from_xpm(ofmspct_xpm,&empty_memgraph[3*(32+13*BOX_SIZE)],BOX_SIZE,
+ 12,0,5,5,graph_labels); /* s */
+ draw_from_xpm(ofmspct_xpm,&empty_memgraph[3*(51+11*BOX_SIZE)],BOX_SIZE,
+ 18,0,4,8,graph_digit_colors[0]); /* swap% */
+
+ /* load average */
+ draw_from_xpm(ofmspct_xpm,&empty_loadgraph[3*(8+2*BOX_SIZE)],BOX_SIZE,
+ 0,0,2,5,graph_labels); /* 1 */
+ draw_from_xpm(ofmspct_xpm,&empty_loadgraph[3*(27+2*BOX_SIZE)],BOX_SIZE,
+ 3,0,2,5,graph_labels); /* 5 */
+ draw_from_xpm(ofmspct_xpm,&empty_loadgraph[3*(45+2*BOX_SIZE)],BOX_SIZE,
+ 0,0,2,5,graph_labels); /* 1 */
+ draw_from_xpm(ofmspct_xpm,&empty_loadgraph[3*(48+2*BOX_SIZE)],BOX_SIZE,
+ 3,0,2,5,graph_labels); /* 5 */
+ draw_from_xpm(ofmspct_xpm,&empty_loadgraph[3*(9+15*BOX_SIZE)],BOX_SIZE,
+ 18,0,1,2,graph_digit_colors[0]); /* . */
+ draw_from_xpm(ofmspct_xpm,&empty_loadgraph[3*(28+15*BOX_SIZE)],BOX_SIZE,
+ 18,0,1,2,graph_digit_colors[0]); /* . */
+ draw_from_xpm(ofmspct_xpm,&empty_loadgraph[3*(47+15*BOX_SIZE)],BOX_SIZE,
+ 18,0,1,2,graph_digit_colors[0]); /* . */
+
+ r = GET_RED(graph_digit_colors[0]);
+ g = GET_GRN(graph_digit_colors[0]);
+ b = GET_BLU(graph_digit_colors[0]);
+
+ /* the lines above and below the graphs */
+ for (xx = 2; xx < BOX_SIZE - 2; xx++) {
+ empty_memgraph[3*(xx + 20 * BOX_SIZE) ] = r;
+ empty_memgraph[3*(xx + 20 * BOX_SIZE)+1] = g;
+ empty_memgraph[3*(xx + 20 * BOX_SIZE)+2] = b;
+ empty_memgraph[3*(xx + (BOX_SIZE-3) * BOX_SIZE) ] = r;
+ empty_memgraph[3*(xx + (BOX_SIZE-3) * BOX_SIZE)+1] = g;
+ empty_memgraph[3*(xx + (BOX_SIZE-3) * BOX_SIZE)+2] = b;
+ empty_loadgraph[3*(xx + 18 * BOX_SIZE) ] = r;
+ empty_loadgraph[3*(xx + 18 * BOX_SIZE)+1] = g;
+ empty_loadgraph[3*(xx + 18 * BOX_SIZE)+2] = b;
+ empty_loadgraph[3*(xx + (BOX_SIZE-3) * BOX_SIZE) ] = r;
+ empty_loadgraph[3*(xx + (BOX_SIZE-3) * BOX_SIZE)+1] = g;
+ empty_loadgraph[3*(xx + (BOX_SIZE-3) * BOX_SIZE)+2] = b;
+ }
+
+ r = GET_RED(graph_field);
+ g = GET_GRN(graph_field);
+ b = GET_BLU(graph_field);
+
+ /* the main field of the graph */
+ for (yy = 22; yy < BOX_SIZE - 4; yy++)
+ for (xx = 2; xx < BOX_SIZE - 2; xx++) {
+ empty_memgraph[3*(xx+yy*BOX_SIZE) ] = r;
+ empty_memgraph[3*(xx+yy*BOX_SIZE)+1] = g;
+ empty_memgraph[3*(xx+yy*BOX_SIZE)+2] = b;
+ }
+
+ for (yy = 20; yy < BOX_SIZE - 4; yy++)
+ for (xx = 2; xx < BOX_SIZE - 2; xx++) {
+ empty_loadgraph[3*(xx+yy*BOX_SIZE) ] = r;
+ empty_loadgraph[3*(xx+yy*BOX_SIZE)+1] = g;
+ empty_loadgraph[3*(xx+yy*BOX_SIZE)+2] = b;
+ }
+
+ r = GET_RED(graph_grid);
+ g = GET_GRN(graph_grid);
+ b = GET_BLU(graph_grid);
+
+ /* the horizontal lines in the graph */
+ for (yy = 1; yy < 4; yy++)
+ for (xx = 2; xx < BOX_SIZE - 2; xx++) {
+ empty_memgraph[3*(xx+(22+yy*(BOX_SIZE-4-22)/4)*BOX_SIZE) ] = r;
+ empty_memgraph[3*(xx+(22+yy*(BOX_SIZE-4-22)/4)*BOX_SIZE)+1] = g;
+ empty_memgraph[3*(xx+(22+yy*(BOX_SIZE-4-22)/4)*BOX_SIZE)+2] = b;
+ empty_loadgraph[3*(xx+(20+yy*(BOX_SIZE-4-20)/4)*BOX_SIZE) ] = r;
+ empty_loadgraph[3*(xx+(20+yy*(BOX_SIZE-4-20)/4)*BOX_SIZE)+1] = g;
+ empty_loadgraph[3*(xx+(20+yy*(BOX_SIZE-4-20)/4)*BOX_SIZE)+2] = b;
+ }
+
+ /* the vertical lines in the graph */
+ for (xx = BOX_SIZE - 3 - 7; xx > 2; xx -= 8)
+ for (yy = 22; yy < BOX_SIZE - 4; yy++) {
+ empty_memgraph[3*(xx+yy*BOX_SIZE) ] = r;
+ empty_memgraph[3*(xx+yy*BOX_SIZE)+1] = g;
+ empty_memgraph[3*(xx+yy*BOX_SIZE)+2] = b;
+ }
+ for (xx = BOX_SIZE - 3 - 7; xx > 2; xx -= 8)
+ for (yy = 20; yy < BOX_SIZE - 4; yy++) {
+ empty_loadgraph[3*(xx+yy*BOX_SIZE) ] = r;
+ empty_loadgraph[3*(xx+yy*BOX_SIZE)+1] = g;
+ empty_loadgraph[3*(xx+yy*BOX_SIZE)+2] = b;
+ }
}
void get_memory_load_percentage(void) {
diff --git a/misc/numbers.xpm b/misc/numbers.xpm
index 9d084de..ad6d481 100644
--- a/misc/numbers.xpm
+++ b/misc/numbers.xpm
@@ -2,7 +2,7 @@
static char * numbers_xpm[] = {
"48 9 2 1",
". c #FFFFFF",
-"+ c #000000",
+"+ c None",
"...++.++...+...+++.+...+...+...+...+...+.+.+.+.+",
".+.++.++.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...+",
".+.++.++++.+++.+.+.+.+++.+++++.+.+.+.+.+.+.+...+",
diff --git a/misc/ofmspct.xpm b/misc/ofmspct.xpm
new file mode 100644
index 0000000..d1e570f
--- /dev/null
+++ b/misc/ofmspct.xpm
@@ -0,0 +1,13 @@
+/* XPM */
+static char * ofmspct_xpm[] = {
+"22 8 2 1",
+" c None",
+". c #F0F0F0",
+" . .. .... .... . .",
+".. . . . . . . .",
+" . .. . . . ... . ",
+" . . . . . . . ",
+" . .. . . . .... . ",
+" . ",
+" . .",
+" . ."};
--
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