From 787c7e6848bb64b0b8ccda84a1774165f479cbea Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 27 Dec 2016 11:09:29 -0500 Subject: [PATCH] wmdonkeymon: Add version 0.91 to repository. From https://web.archive.org/web/20080819184057/http://www.morgade.hpg.ig.com.br/wmdonkeymon/wmdonkeymon-0.91.tar.gz? --- wmdonkeymon/.xvpics/shot.gif | Bin 0 -> 3670 bytes wmdonkeymon/BUGS | 7 + wmdonkeymon/COPYING | 339 +++++++++++++++++ wmdonkeymon/INSTALL | 14 + wmdonkeymon/README | 39 ++ wmdonkeymon/TODO | 6 + wmdonkeymon/html/index.htm | 33 ++ wmdonkeymon/html/shot.gif | Bin 0 -> 1234 bytes wmdonkeymon/wmdonkeymon/Makefile | 25 ++ wmdonkeymon/wmdonkeymon/wmdonkeymon.c | 479 +++++++++++++++++++++++++ wmdonkeymon/wmdonkeymon/wmdonkeymon_mask.xbm | 38 ++ wmdonkeymon/wmdonkeymon/wmdonkeymon_master.xpm | 142 ++++++++ wmdonkeymon/wmgeneral/list.c | 169 +++++++++ wmdonkeymon/wmgeneral/list.h | 59 +++ wmdonkeymon/wmgeneral/misc.c | 164 +++++++++ wmdonkeymon/wmgeneral/misc.h | 9 + wmdonkeymon/wmgeneral/wmgeneral.c | 379 +++++++++++++++++++ wmdonkeymon/wmgeneral/wmgeneral.h | 51 +++ 18 files changed, 1953 insertions(+) create mode 100644 wmdonkeymon/.xvpics/shot.gif create mode 100644 wmdonkeymon/BUGS create mode 100644 wmdonkeymon/COPYING create mode 100644 wmdonkeymon/INSTALL create mode 100644 wmdonkeymon/README create mode 100644 wmdonkeymon/TODO create mode 100644 wmdonkeymon/html/index.htm create mode 100644 wmdonkeymon/html/shot.gif create mode 100644 wmdonkeymon/wmdonkeymon/Makefile create mode 100644 wmdonkeymon/wmdonkeymon/wmdonkeymon.c create mode 100644 wmdonkeymon/wmdonkeymon/wmdonkeymon_mask.xbm create mode 100644 wmdonkeymon/wmdonkeymon/wmdonkeymon_master.xpm create mode 100644 wmdonkeymon/wmgeneral/list.c create mode 100644 wmdonkeymon/wmgeneral/list.h create mode 100644 wmdonkeymon/wmgeneral/misc.c create mode 100644 wmdonkeymon/wmgeneral/misc.h create mode 100644 wmdonkeymon/wmgeneral/wmgeneral.c create mode 100644 wmdonkeymon/wmgeneral/wmgeneral.h diff --git a/wmdonkeymon/.xvpics/shot.gif b/wmdonkeymon/.xvpics/shot.gif new file mode 100644 index 0000000000000000000000000000000000000000..b79fe9423135f28956e9d79589ab9fb9ca9510f0 GIT binary patch literal 3670 zcwVJfPiq`E6kme|5|hFf_TZzIJb~U44Lf6J9okEwGwH~9CYf`5=8y(yVu#xJjsIJd&Q?KRvzQllK0;+}%yLZ`$%FTiw0) z-DL0OWKY@`j~>5#{7C8~-QAPF{PFwa-*Ee8US$vO-F^7uy|T=!pO3aDV@Yp%`}Q^{ zdUE##l_}TpZLTl+-1;W)cH}_pIvGTlr&dj-L@x48au&L*6eT)BV6Z$4Q;rp(bKpX2 z=xpfhnk=G+M{JbbDo7)BRj~z1TcZ$pfry|-8ezyD81jM0NL_Fr7B|#e6wWitV{B91 zq-6}IN>H_vEMkk(q(n?xG^I+gQ84QfF@A7#3m2B1@v;yb*_yb78Jf07I?z-ar}ElV zVnYKS#ikTwyTLlfMS;#PEn)}_LR#+wOii82xR#{Hs8*;}nx+TM#0q4OfMs=TmW5(r z9}!cDMvrRwz0^}6HziZ|%T%j2wZcx2w98qqj&&oWntisbXevz)#M02(_2^IuCS!>Z z(UO7ZMq0)&OW;6I*ybk@?G;O6f84(@?k8_=^xwbj_sjQZXK&BW&JrSziO%E0{-5u^ z9rte!i0#Js+7g3Zz@5R~&R{V3Fc_Sl?+osr`@iwd-e5pe&!~U6^WmI09NV42wWWoy z-dn`NZ0BDk>({GynDCW$L#m*s3`p+FWqrcB`~%J;=~9+PL#A`Ad9NHrDo^puoL4&R z(a>c$I9}lt5^vNg7JkahI>n3CdcBP2mBEhFFM^Dp8V09``ArU(GcD)c1_vRJ6bua@ zN(Pkzqx6tQ*m?AiCFm)}g3?tYm1!n0W1yS1B_ZIHrsSO_4VuOfJeoE^9|4jZV?vh$R?^~Ye;C?hZd&7g_GCI<;=1>ggRPNOOQB5tPxFI#6%`* z(8Ng=kv5)%DaApo%aYGW2`{Aq#el7qsFI4tW~O6kj6qBO3z8#9iq5VooGg}xfL56) zB-KQk)>Nj9jULihEB@Cp)gwz{rEuG;sOFHclWjyv@M{dr2*b2O196FoazPbc28eDq zDHG;aWx{&9Dc3owNCf>OimVk4gFOU>_Ic=Ah@@{99)bKF9UEes(0b@q6V^jD$QKXJ znV>^J&>@yx)u5*~L#i|>%<2@XN%LSt)yw6J@Coaa?jpJW&bn+?lo65C3PXasROMbT z%tJ4660XIoTdDbB@E zbiRwALPkNwPy`h+3M#t1Vw;p(o~}Z^eTfo2k1(7^J}geK7g`ESQ1pq2y~{Ai9&a*{Fi}G z)&QZFg~LAPIz-`<712{JhmP0FR~@V6$CFpoi%!!!ox2^jI$z9R%op^&I;D61dVczP zzIeW%cmA4&zb;-aPG1p^W8>lJJDbs&&+Apst?l08>ES`~qBwYVz`Z9`@wBL(*z$zm z6_Y*b?xJ0O;Sbj{?vOURh^XM{YC2q8ySY%C-Q8hro@yAnhQa86)a2k#x6J9$D-o}^ sGgS + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/wmdonkeymon/INSTALL b/wmdonkeymon/INSTALL new file mode 100644 index 0000000..40e128e --- /dev/null +++ b/wmdonkeymon/INSTALL @@ -0,0 +1,14 @@ +Installation instructions for wmdonkeymon. + +Requirements +-------------------------------------------------------------- +X11 + +Installation +-------------------------------------------------------------- +1) % tar -zxvf wmdonkeymon-0.9.tar.gz +2) % cd wmdonkeymon/wmdonkeymon +3) % make +4) become root. "su" +5) % make install +6) % wmdonkeymon -h (follow instructions) diff --git a/wmdonkeymon/README b/wmdonkeymon/README new file mode 100644 index 0000000..29bb2a0 --- /dev/null +++ b/wmdonkeymon/README @@ -0,0 +1,39 @@ +wmdonkeymon-0.9 +-------------------------------------------------------------- +Authors...: Marcelo Morgade (marcelomorgade@ig.com.br) + + +Description +-------------------------------------------------------------- +wmdonkeymon shows the status of edonkey's donloads in progress +based on '*.part.met' temporary files. +Click on a file name to show details. +Click again to return to list. +Plz, don't hack uploads ... + +wmisdnmon is being developped on a machine running +Conectiva Linux 7.0 (Brazilian RedHat like distro) + +Files +-------------------------------------------------------------- +README This file. +INSTALL Installation instructions. +BUGS Things you don't want to know ;-) +COPYING GNU General Public License Version 2. +TODO FFF (Features For the Future). + + +Bugs +-------------------------------------------------------------- +If you discover any bugs in this software, please send a +bugreport to marcelomorgade@ig.com.br and describe +the problem as detailed as you can. + + +Copyright +-------------------------------------------------------------- +wmdonkeymon is copyright (c) 2002 by Marcelo Morgade and +licensed through the GNU General Public License. +Read the COPYING file for the complete GNU license. + + diff --git a/wmdonkeymon/TODO b/wmdonkeymon/TODO new file mode 100644 index 0000000..b782405 --- /dev/null +++ b/wmdonkeymon/TODO @@ -0,0 +1,6 @@ +TODO list for wmdonkeymon. +-------------------------------------------------------------- + + * Scroll list to view more than 4 downloads + * Hack eDonkey GUI admin protocol to get more accurate status + * Maybe ... A complete GUI dock for ed2k :) diff --git a/wmdonkeymon/html/index.htm b/wmdonkeymon/html/index.htm new file mode 100644 index 0000000..0b96eea --- /dev/null +++ b/wmdonkeymon/html/index.htm @@ -0,0 +1,33 @@ + + +Marcelo Morgade HomePage - WMDONKEYMON + + + + +
+

WMDONKEYMON

+

 

+
+

 

+wmdonkeymon shows the status of edonkey's donloads in progress +based on '*.part.met' temporary files. +Click on a file name to show details. +Click again to return to list. +Plz, don't hack uploads ... + + +

wmedonkeymon is being developped on a machine running +Conectiva Linux 7.0 (Brazilian RedHat like distro)
+ +

Downloads

+wmdonkeymon-0.9
+--------------------------------------------------------------
+Author...: Marcelo Morgade (marcelomorgade@ig.com.br)
+wmdonkeymon-0.9.tar.gz : sources
+ +

 

+See my home page too ! +

Updated 26.08.2002

+ + diff --git a/wmdonkeymon/html/shot.gif b/wmdonkeymon/html/shot.gif new file mode 100644 index 0000000000000000000000000000000000000000..68ed7d8de901c6766eee520d52385db33f1b9ad5 GIT binary patch literal 1234 zcwUW<`BM{j7{0D$me zS}*tj04l~&Aqw*$M1kjbo7qDO+Q>!HW#pNU`gh8NwQ195vbW z_F>z>b5DjM7Io5mfZ%UHF8h7dAoZU8_x;-E&Vh{qo;VgmcrH9!?!{X2PW8NH^SP)H z#o?2*E~6nSsd#Q?V*E|H{1TKwQ7+Q}Vpp5gZ(Huf4rM)=29nA9LKw;HBI@bXGo`M% zDtF3!aN+q~?>vqw*4K#;VqwJ8Uy6c7l@fXwNw{^SaDi{3c7I?&e~KjZH$AreCT*ng zM=ArtJxB-oCpGi}A%;;3f!C?^VKgG1D#+&iR2dLW#53&Io3f39U@NF|3s=_A-}|w} z)Sz}{<_(pTDR$bW+%TU!t#tt-oqg!+k*gW%-2sxRpO3C;D3zD!&Zx-nsh9uI=|e?= z1h8V$bN#W_l(d#6ikhwQcqGi+(b!^Y-d5b0Ru@HMfw=f1zgnhSiW+>U<;$o@>n}#* z6Kgu1E^eqf@wn|uEu0*8;vMGzJMe0W zrPSArRI9dr^`hrq2*pSE_z*q7ar^jcMw>wG-*eu1$--$T7=Xrr2y5qD&9_y|Jod8w zX?U1SeHHYzP0M|=j!a#mT}uqo6WOm7p_m}q+-d3}?81q>H$$RlZTWZT*V<3;s1mL9 zmi~YyYC}@BD#M#ZIBo9K`>|4QvINL$sr`WFsI`02Mk&?9?qr#Mwbo2Eu@6l${G4jf z#c>bf)9gw-9Af|`A6mJScVps=*cJm=(N;;?G0MX~1MM3u +#include +#include +#include +#include +#include +#include +#include "../wmgeneral/wmgeneral.h" +#include "wmdonkeymon_master.xpm" +#include "wmdonkeymon_mask.xbm" + + +#define SLOT_SIZE 52 +#define REF_RATE 5 +#define VERSION "0.9" + + +int xpos[] = { 66, 71, 76, 81, 86, 91, /* A B C D E F */ + 66, 71, 76, 81, 86, 91, /* G H I J K L */ + 66, 71, 76, 81, 86, 91, /* M N O P Q R */ + 66, 71, 76, 81, 86, 91, /* S T U V W X */ + 66, 71, 76, 81, 86, 91, /* Y Z / _ - . */ + 96, 101, /* 0 1 */ + 96, 101, /* 2 3 */ + 96, 101, /* 4 5 */ + 96, 101, /* 6 7 */ + 96, 101 +}; /* 8 9 */ + +int ypos[] = { 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, + 14, 14, 14, 14, 14, 14, + 19, 19, 19, 19, 19, 19, + 24, 24, 24, 24, 24, 24, + 4, 4, + 9, 9, + 14, 14, + 19, 19, + 24, 24 +}; + + +int but_stat; +XEvent Event; + + +struct downlinfo { + char metname[30]; + char name[516]; + long int lastsize; + long int size; + char type[30]; + long int copied; + int gappos[50][2]; + int firstgap; + int t_miss; + unsigned char gapnum; + unsigned char status; +} files[4]; + +void usage(); +void printversion(); +void showString(char * buf, int row); +void pressEvent(XButtonEvent * xev); +void getStatus(int i,char * st); +void loadConfig(char * dir); +void splash(); + +int main(int argc, char *argv[]) +{ + int i=0,debug=0,r,j=0,x=0,selected=-1; + long int gi=0,gf=0; + int colord=66,colorg=71; + struct dirent **namelist; + int ls=0,metnum=0; + unsigned char buf[516] ; + char * tmpdir = NULL; + for (i=1; ii+1){ + if (!strcasecmp(argv[i+1],"red")) colord=71; + else if (!strcasecmp(argv[i+1],"blue")) colord=76; + else if (!strcasecmp(argv[i+1],"yellow")) colord=81; + else if (!strcasecmp(argv[i+1],"white")) colord=86; + else if (!strcasecmp(argv[i+1],"cyan")) colord=91; + else if (!strcasecmp(argv[i+1],"black")) colord=96; + else if (!strcasecmp(argv[i+1],"blank")) colord=101; + else printf("Invalid color %s\n",argv[i+1]); + }else {usage();exit(-1);} + break; + case 'g' : + if (argc>i+1){ + if (!strcasecmp(argv[i+1],"green")) colorg=66; + else if (!strcasecmp(argv[i+1],"blue")) colorg=76; + else if (!strcasecmp(argv[i+1],"yellow")) colorg=81; + else if (!strcasecmp(argv[i+1],"white")) colorg=86; + else if (!strcasecmp(argv[i+1],"cyan")) colorg=91; + else if (!strcasecmp(argv[i+1],"black")) colorg=96; + else if (!strcasecmp(argv[i+1],"blank")) colorg=101; + else printf("Invalid color %s\n",argv[i+1]); + }else {usage();exit(-1);} + break; + case 'v' : + printversion(); + exit(0); + break; + case 'd' : + debug=1; + printf("Debuggin mode: \n"); + break; + default: + usage(); + exit(0); + break; + } + } + } + if (!tmpdir) { usage(); exit(-1);} + + openXwindow(argc, argv, wmdonkeymon_master_xpm, wmdonkeymon_mask_bits, wmdonkeymon_mask_width, wmdonkeymon_mask_height); + copyXPMArea(5,60,52,54,5,3); + RedrawWindow(); + splash(); + + + r = 0; + while (1) { + if (!r) { + FILE * met; + unsigned char type; + short int len=0,vlen=0; + int gaps=0, firstgap = 0x7fffffff, miss=0, fsize=0,metcount=0; + long int fileSize=0, num =0; + char nvalue[516],value[516]; + j =0; + metnum=0; + // Search for files in temp directory + ls = scandir(tmpdir, &namelist, 0, alphasort); + if (ls < 0){ + printf("Can't find files in %s",tmpdir); + exit(-1); + } + else { + while(ls-- && (metcount<4)) { + char * pt; + pt = strstr(namelist[ls]->d_name,".part.met"); + if (pt && !strcmp(pt,".part.met")) { + if(debug)printf("File: %s\n",namelist[ls]->d_name); + strcpy(files[metcount].metname,namelist[ls]->d_name); + metcount++; + } + free(namelist[ls]); + } + free(namelist); + } + for (metnum=0; metnum < metcount; metnum++) { + i=0; + sprintf(buf,"%s%s",tmpdir,files[metnum].metname); + files[metnum].t_miss=0; + if(debug)printf("opening %s\n",buf); + if ( (met = fopen(buf,"rb")) != NULL) {} + else {printf("Nada\n");}; + + // Version + i += fread(buf,1,1,met); + if(debug){ printf("Version: %x\n",buf[0]); } + + // Date ?? + i += fread(buf,1,4,met); + if(debug) { printf("Date: %x %x %x %x \n",buf[0],buf[1],buf[2],buf[3]); } + + // Hash + i += fread(buf,1,16,met); + if(debug){ printf("Hash: "); for (j=0;j<16;j++) printf("%x ",buf[j]); printf("\n"); } + + + // Partial Hashes + i += fread(buf,1,2,met); + memcpy(&j,buf,2); + if(debug) printf("Num of Hashes: %d\n",j); + + // Hashes + for (i=0;i=gi){ + files[metnum].gappos[x][0] = gi; + files[metnum].gappos[x][1] = gf; + x++; + } + files[metnum].t_miss += miss; + if(debug)printf(" to %10d = %10d Size(%d) Gaprel: %d-%d\n",fsize,miss,9728000,files[metnum].gappos[x][0],files[metnum].gappos[x][1]); + } + } + + } + } + + files[metnum].gapnum = x; + files[metnum].firstgap = firstgap; + files[metnum].lastsize = files[metnum].copied; + files[metnum].size = fileSize; + + // sort gaps + /* don'n needed + * for (i=0; i= 0) { + if (selected>-1) selected=-1; + else selected=i; + } + break; + } + } + + for (j=0;j<15;j++) DelMouseRegion(j); + + if (metnum==0){ + splash(); + showString("NO FILES",8); + showString("FOUND IN",9); + showString("TEMP DIR",10); + }else if (selected>-1){ + char out[30]; + char unit[4] = " KMG"; + long int s,c; + int sk=0,ck=0; + copyXPMArea(5,60,52,54,5,3); + AddMouseRegion(0,5,5,54,54); + showString(files[selected].name,1); + + s=files[selected].size; + while (s>1024){s/=1024;sk++;} + c=files[selected].copied; + while (c>1024){c/=1024;ck++;} + + sprintf(out,"%ld%c/%ld%c",c,unit[ck],s,unit[sk]); + showString(out,4); + + sprintf(out,"%s",files[selected].type); + showString(out,5); + + // ************** + // Donwload Rate + // Don't work unless edonkey update met files more frequently + // + // s = (files[selected].copied) - (files[selected].lastsize); + // sprintf(out,"%ld B/S",(s/REF_RATE)); + // showString(out,8); + + //************************ + //STATUS + //status tag is always "Looking..." :( + // + //getStatus(files[selected].status,out); + //showString(out,9); + sprintf(out,"%.3f%%", (( 1.0 * files[selected].copied / files[selected].size))*100); + showString(out,8); + + copyXPMArea(66,colord,52,5,5,11); + for (i=0; i < files[selected].gapnum ; i++) { + copyXPMArea(66,colorg,files[selected].gappos[i][1]-files[selected].gappos[i][0],5,files[selected].gappos[i][0]+5 ,11); + } + }else{ + copyXPMArea(5,60,52,54,5,3); + for (j=0; j='a' && str[i]<='z') { str[i]-=32;} + i++; + } +} + +void showString(char * buf, int row){ + int i; + strcaseup(buf); + for (i=0; buf[i] && i<10;i++){ + if (buf[i]>='0' && buf[i]<='9') copyXPMArea(xpos[buf[i]-18],ypos[buf[i]-18],5,5,(i+1)*5,(row*5)); + else if((buf[i]>='A' && buf[i]<='Z')) copyXPMArea(xpos[buf[i]-65],ypos[buf[i]-65],5,5,(i+1)*5,(row*5)); + else if((buf[i]==' ')) copyXPMArea(66,44,5,5,(i+1)*5,(row*5)); + else if((buf[i]=='/')) copyXPMArea(76,24,5,5,(i+1)*5,(row*5)); + else if((buf[i]=='.')) copyXPMArea(91,24,5,5,(i+1)*5,(row*5)); + else if((buf[i]=='%')) copyXPMArea(106,24,5,5,(i+1)*5,(row*5)); + else copyXPMArea(xpos[28],ypos[28],5,5,(i+1)*5,(row*5)); + } +} + +void getStatus(int i,char * st){ + if (i==0) strcpy(st,"Looking..."); + else if(i==1) strcpy(st,"Paused"); + else strcpy(st," "); +} + +void splash(){ + // Splash + int i=0; + char * s= ".WMDONKEY."; + while (i<4){ + RedrawWindow(); + showString(s,1); + copyXPMArea(70,47,47,19,9,20); + RedrawWindow(); + sleep(1); + i++; + } + +} diff --git a/wmdonkeymon/wmdonkeymon/wmdonkeymon_mask.xbm b/wmdonkeymon/wmdonkeymon/wmdonkeymon_mask.xbm new file mode 100644 index 0000000..fdc2de3 --- /dev/null +++ b/wmdonkeymon/wmdonkeymon/wmdonkeymon_mask.xbm @@ -0,0 +1,38 @@ +#define wmdonkeymon_mask_width 64 +#define wmdonkeymon_mask_height 64 +static char wmdonkeymon_mask_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff, + 0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff, + 0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff, + 0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff, + 0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0, + 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f, + 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, + 0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff, + 0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff, + 0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff, + 0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff, + 0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff, + 0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0, + 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f, + 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, + 0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff, + 0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff, + 0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff, + 0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff, + 0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff, + 0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0, + 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f, + 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, + 0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff, + 0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff, + 0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff, + 0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff, + 0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff, + 0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0, + 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/wmdonkeymon/wmdonkeymon/wmdonkeymon_master.xpm b/wmdonkeymon/wmdonkeymon/wmdonkeymon_master.xpm new file mode 100644 index 0000000..a387628 --- /dev/null +++ b/wmdonkeymon/wmdonkeymon/wmdonkeymon_master.xpm @@ -0,0 +1,142 @@ +/* XPM */ +static char * wmdonkeymon_master_xpm[] = { +"134 128 11 1", +" c None", +". c #202020", +"+ c #000000", +"@ c #C5C2C5", +"# c #40BFBF", +"$ c #20B2AE", +"% c #0CBE00", +"& c #FF0000", +"* c #0000FF", +"= c #FFFF00", +"- c #FFFFFF", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +".....+++++++++++++++++++++++++++++++++++++++++++++++++++++@...........................................................................", +".....+....................................................@........##..###...###.###..####.####..##....#..............................", +".....+....................................................@.......#..#.#..#.#....#..#.#....#....#..#..##..............................", +".....+....................................................@.......####.###..#....#..#.###..###..#..#...#..............................", +".....+....................................................@.......#..#.#..#.#....#..#.#....#....#..#...#..............................", +".....+....................................................@.......#..#.###...###.###..####.#.....##...###.............................", +".....+....................................................@........###.#..#..###.####.#..#.#.....##..###..............................", +".....+....................................................@.......#....#..#...#.....#.#.#..#....#..#....#.............................", +".....+....................................................@.......#.##.####...#.....#.##...#......#...##..............................", +".....+....................................................@.......#..#.#..#...#..#..#.#.#..#.....#......#.............................", +".....+....................................................@........##..#..#..###..##..#..#.####.####.###..............................", +".....+....................................................@........###.#..#..##..###...##..###..#....####.............................", +".....+....................................................@.......#.#.###.#.#..#.#..#.#..#.#..#.#.#..#................................", +".....+....................................................@.......#.#.#####.#..#.###..#..#.###..####.###..............................", +".....+....................................................@.......#...##.##.#..#.#....#.##.#.#....#.....#.............................", +".....+....................................................@.......#...##..#..##..#.....###.#..#...#..###..............................", +".....+....................................................@........###..###.#..#.#..#.#...##..#..##...###.............................", +".....+....................................................@.......#......#..#..#.#..#.#...##..#.#.......#.............................", +".....+....................................................@........##....#..#..#..##..#.#.#+##..###.....#.............................", +".....+....................................................@..........#...#..#..#..##..#.#.##..#.#..#....#.............................", +".....+....................................................@.......###....#...##....#...#.#.#..#..##.....#.............................", +".....+....................................................@.......#..#.####.....#................##...##..$$..$.......................", +".....+....................................................@.......#..#....#....#................#..#.#..#.$..$........................", +".....+....................................................@........##....#....#.......####.......##...###...$.........................", +".....+....................................................@.........#...#....#..............##..#..#....#..$..$.......................", +".....+....................................................@.........#..####.#....#####......##...##...##..$..$$.......................", +".....+....................................................@.......%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.............", +".....+....................................................@.......%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.............", +".....+....................................................@.......%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.............", +".....+....................................................@.......%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.............", +".....+....................................................@.......%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.............", +".....+....................................................@...........................................................................", +".....+....................................................@.......&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.............", +".....+....................................................@.......&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.............", +".....+....................................................@.......&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.............", +".....+....................................................@.......&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.............", +".....+....................................................@.......&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.............", +".....+....................................................@...........................................................................", +".....+....................................................@...........................................................................", +".....+....................................................@...........................................................................", +".....+....................................................@...........................................................................", +".....+....................................................@...........................................................................", +".....+....................................................@...........................................................................", +".....+....................................................@...........................................................................", +".....+....................................................@...........############.......................############.................", +".....+....................................................@............#..........#.....................#..........#..................", +".....+....................................................@.............##.........#...#############...#.........##...................", +".....+....................................................@...............#.........#.##...........##.#.........#.....................", +".....+....................................................@................###########...............###########......................", +".....+....................................................@..........................#...............#................................", +".....+....................................................@..........................#...............#................................", +".....+....................................................@..........................#################................................", +".....+....................................................@..........................#...............#................................", +".....+....................................................@..........................#...............#................................", +".....+....................................................@..........................##.............##................................", +".....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................#.............#.................................", +"......................................................................................#.............#.................................", +"......................................................................................##...........##.................................", +".......................................................................................#..#.....#..#..................................", +"........................................................................................#.........#...................................", +"........................................................................................##.......##...................................", +".........................................................................................#.......#....................................", +"..........................................................................................#######.....................................", +"..................................................................%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%................", +"..................................................................%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%................", +"..................................................................%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%................", +"..................................................................%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%................", +"..................................................................%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%................", +"..................................................................&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&................", +"..................................................................&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&................", +"..................................................................&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&................", +"..................................................................&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&................", +"..................................................................&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&................", +"..................................................................****************************************************................", +"..................................................................****************************************************................", +"..................................................................****************************************************................", +"..................................................................****************************************************................", +"..................................................................****************************************************................", +"..................................................................====================================================................", +"..................................................................====================================================................", +"..................................................................====================================================................", +"..................................................................====================================================................", +"..................................................................====================================================................", +"..................................................................----------------------------------------------------................", +"..................................................................----------------------------------------------------................", +"..................................................................----------------------------------------------------................", +"..................................................................----------------------------------------------------................", +"..................................................................----------------------------------------------------................", +"..................................................................$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$................", +"..................................................................$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$................", +"..................................................................$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$................", +"..................................................................$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$................", +"..................................................................$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$................", +"..................................................................++++++++++++++++++++++++++++++++++++++++++++++++++++................", +"..................................................................++++++++++++++++++++++++++++++++++++++++++++++++++++................", +"..................................................................++++++++++++++++++++++++++++++++++++++++++++++++++++................", +"..................................................................++++++++++++++++++++++++++++++++++++++++++++++++++++................", +"..................................................................++++++++++++++++++++++++++++++++++++++++++++++++++++................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................", +"......................................................................................................................................"}; diff --git a/wmdonkeymon/wmgeneral/list.c b/wmdonkeymon/wmgeneral/list.c new file mode 100644 index 0000000..f804b2c --- /dev/null +++ b/wmdonkeymon/wmgeneral/list.c @@ -0,0 +1,169 @@ +/* Generic single linked list to keep various information + Copyright (C) 1993, 1994 Free Software Foundation, Inc. + + +Author: Kresten Krab Thorup + +Many modifications by Alfredo K. Kojima + + +This file is part of GNU CC. + +GNU CC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU CC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* As a special exception, if you link this library with files compiled with + GCC to produce an executable, this does not cause the resulting executable + to be covered by the GNU General Public License. This exception does not + however invalidate any other reasons why the executable file might be + covered by the GNU General Public License. */ + +#include "list.h" +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#include + +/* Return a cons cell produced from (head . tail) */ + +INLINE LinkedList* +list_cons(void* head, LinkedList* tail) +{ + LinkedList* cell; + + cell = (LinkedList*)malloc(sizeof(LinkedList)); + cell->head = head; + cell->tail = tail; + return cell; +} + +/* Return the length of a list, list_length(NULL) returns zero */ + +INLINE int +list_length(LinkedList* list) +{ + int i = 0; + while(list) + { + i += 1; + list = list->tail; + } + return i; +} + +/* Return the Nth element of LIST, where N count from zero. If N + larger than the list length, NULL is returned */ + +INLINE void* +list_nth(int index, LinkedList* list) +{ + while(index-- != 0) + { + if(list->tail) + list = list->tail; + else + return 0; + } + return list->head; +} + +/* Remove the element at the head by replacing it by its successor */ + +INLINE void +list_remove_head(LinkedList** list) +{ + if (!*list) return; + if ((*list)->tail) + { + LinkedList* tail = (*list)->tail; /* fetch next */ + *(*list) = *tail; /* copy next to list head */ + free(tail); /* free next */ + } + else /* only one element in list */ + { + free(*list); + (*list) = 0; + } +} + + +/* Remove the element with `car' set to ELEMENT */ +/* +INLINE void +list_remove_elem(LinkedList** list, void* elem) +{ + while (*list) + { + if ((*list)->head == elem) + list_remove_head(list); + *list = (*list ? (*list)->tail : NULL); + } +}*/ + +INLINE LinkedList * +list_remove_elem(LinkedList* list, void* elem) +{ + LinkedList *tmp; + + if (list) { + if (list->head == elem) { + tmp = list->tail; + free(list); + return tmp; + } + list->tail = list_remove_elem(list->tail, elem); + return list; + } + return NULL; +} + + +/* Return element that has ELEM as car */ + +INLINE LinkedList* +list_find(LinkedList* list, void* elem) +{ + while(list) + { + if (list->head == elem) + return list; + list = list->tail; + } + return NULL; +} + +/* Free list (backwards recursive) */ + +INLINE void +list_free(LinkedList* list) +{ + if(list) + { + list_free(list->tail); + free(list); + } +} + +/* Map FUNCTION over all elements in LIST */ + +INLINE void +list_mapcar(LinkedList* list, void(*function)(void*)) +{ + while(list) + { + (*function)(list->head); + list = list->tail; + } +} diff --git a/wmdonkeymon/wmgeneral/list.h b/wmdonkeymon/wmgeneral/list.h new file mode 100644 index 0000000..af0f22c --- /dev/null +++ b/wmdonkeymon/wmgeneral/list.h @@ -0,0 +1,59 @@ +/* Generic single linked list to keep various information + Copyright (C) 1993, 1994 Free Software Foundation, Inc. + +Author: Kresten Krab Thorup + +This file is part of GNU CC. + +GNU CC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU CC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* As a special exception, if you link this library with files compiled with + GCC to produce an executable, this does not cause the resulting executable + to be covered by the GNU General Public License. This exception does not + however invalidate any other reasons why the executable file might be + covered by the GNU General Public License. */ + +#ifndef __LIST_H_ +#define __LIST_H_ + +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) +# define INLINE inline +#else +# define INLINE +#endif + +typedef struct LinkedList { + void *head; + struct LinkedList *tail; +} LinkedList; + +INLINE LinkedList* list_cons(void* head, LinkedList* tail); + +INLINE int list_length(LinkedList* list); + +INLINE void* list_nth(int index, LinkedList* list); + +INLINE void list_remove_head(LinkedList** list); + +INLINE LinkedList *list_remove_elem(LinkedList* list, void* elem); + +INLINE void list_mapcar(LinkedList* list, void(*function)(void*)); + +INLINE LinkedList*list_find(LinkedList* list, void* elem); + +INLINE void list_free(LinkedList* list); + +#endif diff --git a/wmdonkeymon/wmgeneral/misc.c b/wmdonkeymon/wmgeneral/misc.c new file mode 100644 index 0000000..34281e2 --- /dev/null +++ b/wmdonkeymon/wmgeneral/misc.c @@ -0,0 +1,164 @@ +/* dock.c- built-in Dock module for WindowMaker + * + * WindowMaker window manager + * + * Copyright (c) 1997 Alfredo K. Kojima + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include "list.h" +#include "misc.h" + +/* + *---------------------------------------------------------------------- + * parse_command-- + * Divides a command line into a argv/argc pair. + *---------------------------------------------------------------------- + */ +#define PRC_ALPHA 0 +#define PRC_BLANK 1 +#define PRC_ESCAPE 2 +#define PRC_DQUOTE 3 +#define PRC_EOS 4 +#define PRC_SQUOTE 5 + +typedef struct { + short nstate; + short output; +} DFA; + + +static DFA mtable[9][6] = { + {{3,1},{0,0},{4,0},{1,0},{8,0},{6,0}}, + {{1,1},{1,1},{2,0},{3,0},{5,0},{1,1}}, + {{1,1},{1,1},{1,1},{1,1},{5,0},{1,1}}, + {{3,1},{5,0},{4,0},{1,0},{5,0},{6,0}}, + {{3,1},{3,1},{3,1},{3,1},{5,0},{3,1}}, + {{-1,-1},{0,0},{0,0},{0,0},{0,0},{0,0}}, /* final state */ + {{6,1},{6,1},{7,0},{6,1},{5,0},{3,0}}, + {{6,1},{6,1},{6,1},{6,1},{5,0},{6,1}}, + {{-1,-1},{0,0},{0,0},{0,0},{0,0},{0,0}}, /* final state */ +}; + +char* +next_token(char *word, char **next) +{ + char *ptr; + char *ret, *t; + int state, ctype; + + t = ret = malloc(strlen(word)+1); + ptr = word; + + state = 0; + *t = 0; + while (1) { + if (*ptr==0) + ctype = PRC_EOS; + else if (*ptr=='\\') + ctype = PRC_ESCAPE; + else if (*ptr=='"') + ctype = PRC_DQUOTE; + else if (*ptr=='\'') + ctype = PRC_SQUOTE; + else if (*ptr==' ' || *ptr=='\t') + ctype = PRC_BLANK; + else + ctype = PRC_ALPHA; + + if (mtable[state][ctype].output) { + *t = *ptr; t++; + *t = 0; + } + state = mtable[state][ctype].nstate; + ptr++; + if (mtable[state][0].output<0) { + break; + } + } + + if (*ret==0) + t = NULL; + else + t = strdup(ret); + + free(ret); + + if (ctype==PRC_EOS) + *next = NULL; + else + *next = ptr; + + return t; +} + + +extern void +parse_command(char *command, char ***argv, int *argc) +{ + LinkedList *list = NULL; + char *token, *line; + int count, i; + + line = command; + do { + token = next_token(line, &line); + if (token) { + list = list_cons(token, list); + } + } while (token!=NULL && line!=NULL); + + count = list_length(list); + *argv = malloc(sizeof(char*)*count); + i = count; + while (list!=NULL) { + (*argv)[--i] = list->head; + list_remove_head(&list); + } + *argc = count; +} + +extern pid_t +execCommand(char *command) +{ + pid_t pid; + char **argv; + int argc; + + parse_command(command, &argv, &argc); + + if (argv==NULL) { + return 0; + } + + if ((pid=fork())==0) { + char **args; + int i; + + args = malloc(sizeof(char*)*(argc+1)); + if (!args) + exit(10); + for (i=0; i + +extern void parse_command(char *, char ***, int *); + +extern pid_t execCommand(char *); +#endif /* __MISC_H */ diff --git a/wmdonkeymon/wmgeneral/wmgeneral.c b/wmdonkeymon/wmgeneral/wmgeneral.c new file mode 100644 index 0000000..8c21d53 --- /dev/null +++ b/wmdonkeymon/wmgeneral/wmgeneral.c @@ -0,0 +1,379 @@ +/* + Best viewed with vim5, using ts=4 + + wmgeneral was taken from wmppp. + + It has a lot of routines which most of the wm* programs use. + + ------------------------------------------------------------ + + Author: Martijn Pieterse (pieterse@xs4all.nl) + + --- + CHANGES: + --- + 02/05/1998 (Martijn Pieterse, pieterse@xs4all.nl) + * changed the read_rc_file to parse_rcfile, as suggester by Marcelo E. Magallon + * debugged the parse_rc file. + 30/04/1998 (Martijn Pieterse, pieterse@xs4all.nl) + * Ripped similar code from all the wm* programs, + and put them in a single file. + +*/ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "wmgeneral.h" + + /*****************/ + /* X11 Variables */ +/*****************/ + +Window Root; +int screen; +int x_fd; +int d_depth; +XSizeHints mysizehints; +XWMHints mywmhints; +Pixel back_pix, fore_pix; +char *Geometry = ""; +Window iconwin, win; +GC NormalGC; +XpmIcon wmgen; +Pixmap pixmask; + + /*****************/ + /* Mouse Regions */ +/*****************/ + +typedef struct { + int enable; + int top; + int bottom; + int left; + int right; +} MOUSE_REGION; + +#define MAX_MOUSE_REGION (8) +MOUSE_REGION mouse_region[MAX_MOUSE_REGION]; + + /***********************/ + /* Function Prototypes */ +/***********************/ + +static void GetXPM(XpmIcon *, char **); +static Pixel GetColor(char *); +void RedrawWindow(void); +void AddMouseRegion(int, int, int, int, int); +int CheckMouseRegion(int, int); + +/*******************************************************************************\ +|* read_rc_file *| +\*******************************************************************************/ + +void parse_rcfile(const char *filename, rckeys *keys) { + + char *p; + char temp[128]; + char *tokens = " :\t\n"; + FILE *fp; + int i,key; + + fp = fopen(filename, "r"); + if (fp) { + while (fgets(temp, 128, fp)) { + key = 0; + printf("read: %s\n",temp); + while (key >= 0 && keys[key].label) { + printf("key: %s\n",keys[key].label); + if ((p = strstr(temp, keys[key].label))) { + p += strlen(keys[key].label); + p += strspn(p, tokens); + if ((i = strcspn(p, "#\n"))) p[i] = 0; + free(*keys[key].var); + *keys[key].var = strdup(p); + key = -1; + } else key++; + } + } + fclose(fp); + } +} + + +/*******************************************************************************\ +|* GetXPM *| +\*******************************************************************************/ + +static void GetXPM(XpmIcon *wmgen, char *pixmap_bytes[]) { + + XWindowAttributes attributes; + int err; + + /* For the colormap */ + XGetWindowAttributes(display, Root, &attributes); + + wmgen->attributes.valuemask |= (XpmReturnPixels | XpmReturnExtensions); + + err = XpmCreatePixmapFromData(display, Root, pixmap_bytes, &(wmgen->pixmap), + &(wmgen->mask), &(wmgen->attributes)); + + if (err != XpmSuccess) { + fprintf(stderr, "Not enough free colorcells.\n"); + exit(1); + } +} + +/*******************************************************************************\ +|* GetColor *| +\*******************************************************************************/ + +static Pixel GetColor(char *name) { + + XColor color; + XWindowAttributes attributes; + + XGetWindowAttributes(display, Root, &attributes); + + color.pixel = 0; + if (!XParseColor(display, attributes.colormap, name, &color)) { + fprintf(stderr, "wm.app: can't parse %s.\n", name); + } else if (!XAllocColor(display, attributes.colormap, &color)) { + fprintf(stderr, "wm.app: can't allocate %s.\n", name); + } + return color.pixel; +} + +/*******************************************************************************\ +|* flush_expose *| +\*******************************************************************************/ + +static int flush_expose(Window w) { + + XEvent dummy; + int i=0; + + while (XCheckTypedWindowEvent(display, w, Expose, &dummy)) + i++; + + return i; +} + +/*******************************************************************************\ +|* RedrawWindow *| +\*******************************************************************************/ + +void RedrawWindow(void) { + + flush_expose(iconwin); + XCopyArea(display, wmgen.pixmap, iconwin, NormalGC, + 0,0, wmgen.attributes.width, wmgen.attributes.height, 0,0); + flush_expose(win); + XCopyArea(display, wmgen.pixmap, win, NormalGC, + 0,0, wmgen.attributes.width, wmgen.attributes.height, 0,0); +} + +/*******************************************************************************\ +|* RedrawWindowXY *| +\*******************************************************************************/ + +void RedrawWindowXY(int x, int y) { + + flush_expose(iconwin); + XCopyArea(display, wmgen.pixmap, iconwin, NormalGC, + x,y, wmgen.attributes.width, wmgen.attributes.height, 0,0); + flush_expose(win); + XCopyArea(display, wmgen.pixmap, win, NormalGC, + x,y, wmgen.attributes.width, wmgen.attributes.height, 0,0); +} + +/*******************************************************************************\ +|* AddMouseRegion *| +\*******************************************************************************/ + +void AddMouseRegion(int index, int left, int top, int right, int bottom) { + + if (index < MAX_MOUSE_REGION) { + mouse_region[index].enable = 1; + mouse_region[index].top = top; + mouse_region[index].left = left; + mouse_region[index].bottom = bottom; + mouse_region[index].right = right; + } +} + +/*******************************************************************************\ +|* DelMouseRegion added for wmdonkeymon *| +\*******************************************************************************/ + +void DelMouseRegion(int index) { + + if (index < MAX_MOUSE_REGION) { + mouse_region[index].enable = 0; + } +} + +/*******************************************************************************\ +|* CheckMouseRegion *| +\*******************************************************************************/ + +int CheckMouseRegion(int x, int y) { + + int i; + int found; + + found = 0; + + for (i=0; i= mouse_region[i].left && + y <= mouse_region[i].bottom && + y >= mouse_region[i].top) + found = 1; + } + if (!found) return -1; + return (i-1); +} + +/*******************************************************************************\ +|* copyXPMArea *| +\*******************************************************************************/ + +void copyXPMArea(int x, int y, int sx, int sy, int dx, int dy) { + + XCopyArea(display, wmgen.pixmap, wmgen.pixmap, NormalGC, x, y, sx, sy, dx, dy); + +} + +/*******************************************************************************\ +|* copyXBMArea *| +\*******************************************************************************/ + +void copyXBMArea(int x, int y, int sx, int sy, int dx, int dy) { + + XCopyArea(display, wmgen.mask, wmgen.pixmap, NormalGC, x, y, sx, sy, dx, dy); +} + + +/*******************************************************************************\ +|* setMaskXY *| +\*******************************************************************************/ + +void setMaskXY(int x, int y) { + + XShapeCombineMask(display, win, ShapeBounding, x, y, pixmask, ShapeSet); + XShapeCombineMask(display, iconwin, ShapeBounding, x, y, pixmask, ShapeSet); +} + +/*******************************************************************************\ +|* openXwindow *| +\*******************************************************************************/ +void openXwindow(int argc, char *argv[], char *pixmap_bytes[], char *pixmask_bits, int pixmask_width, int pixmask_height) { + + unsigned int borderwidth = 1; + XClassHint classHint; + char *display_name = NULL; + char *wname = argv[0]; + XTextProperty name; + + XGCValues gcv; + unsigned long gcm; + + + int dummy=0; + int i; + + for (i=1; argv[i]; i++) { + if (!strcmp(argv[i], "-display")) + display_name = argv[i+1]; + } + + if (!(display = XOpenDisplay(display_name))) { + fprintf(stderr, "%s: can't open display %s\n", + wname, XDisplayName(display_name)); + exit(1); + } + screen = DefaultScreen(display); + Root = RootWindow(display, screen); + d_depth = DefaultDepth(display, screen); + x_fd = XConnectionNumber(display); + + /* Convert XPM to XImage */ + GetXPM(&wmgen, pixmap_bytes); + + /* Create a window to hold the stuff */ + mysizehints.flags = USSize | USPosition; + mysizehints.x = 0; + mysizehints.y = 0; + + back_pix = GetColor("white"); + fore_pix = GetColor("black"); + + XWMGeometry(display, screen, Geometry, NULL, borderwidth, &mysizehints, + &mysizehints.x, &mysizehints.y,&mysizehints.width,&mysizehints.height, &dummy); + + mysizehints.width = 64; + mysizehints.height = 64; + + win = XCreateSimpleWindow(display, Root, mysizehints.x, mysizehints.y, + mysizehints.width, mysizehints.height, borderwidth, fore_pix, back_pix); + + iconwin = XCreateSimpleWindow(display, win, mysizehints.x, mysizehints.y, + mysizehints.width, mysizehints.height, borderwidth, fore_pix, back_pix); + + /* Activate hints */ + XSetWMNormalHints(display, win, &mysizehints); + classHint.res_name = wname; + classHint.res_class = wname; + XSetClassHint(display, win, &classHint); + + XSelectInput(display, win, ButtonPressMask | ExposureMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask); + XSelectInput(display, iconwin, ButtonPressMask | ExposureMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask); + + if (XStringListToTextProperty(&wname, 1, &name) == 0) { + fprintf(stderr, "%s: can't allocate window name\n", wname); + exit(1); + } + + XSetWMName(display, win, &name); + + /* Create GC for drawing */ + + gcm = GCForeground | GCBackground | GCGraphicsExposures; + gcv.foreground = fore_pix; + gcv.background = back_pix; + gcv.graphics_exposures = 0; + NormalGC = XCreateGC(display, Root, gcm, &gcv); + + /* ONLYSHAPE ON */ + + pixmask = XCreateBitmapFromData(display, win, pixmask_bits, pixmask_width, pixmask_height); + + XShapeCombineMask(display, win, ShapeBounding, 0, 0, pixmask, ShapeSet); + XShapeCombineMask(display, iconwin, ShapeBounding, 0, 0, pixmask, ShapeSet); + + /* ONLYSHAPE OFF */ + + mywmhints.initial_state = WithdrawnState; + mywmhints.icon_window = iconwin; + mywmhints.icon_x = mysizehints.x; + mywmhints.icon_y = mysizehints.y; + mywmhints.window_group = win; + mywmhints.flags = StateHint | IconWindowHint | IconPositionHint | WindowGroupHint; + + XSetWMHints(display, win, &mywmhints); + + XSetCommand(display, win, argv, argc); + XMapWindow(display, win); + +} diff --git a/wmdonkeymon/wmgeneral/wmgeneral.h b/wmdonkeymon/wmgeneral/wmgeneral.h new file mode 100644 index 0000000..c6457f4 --- /dev/null +++ b/wmdonkeymon/wmgeneral/wmgeneral.h @@ -0,0 +1,51 @@ +#ifndef WMGENERAL_H_INCLUDED +#define WMGENERAL_H_INCLUDED + + /***********/ + /* Defines */ +/***********/ + +#define MAX_MOUSE_REGION (8) + + /************/ + /* Typedefs */ +/************/ + +typedef struct _rckeys rckeys; + +struct _rckeys { + const char *label; + char **var; +}; + +typedef struct { + Pixmap pixmap; + Pixmap mask; + XpmAttributes attributes; +} XpmIcon; + + /*******************/ + /* Global variable */ +/*******************/ + +Display *display; + + /***********************/ + /* Function Prototypes */ +/***********************/ + +void AddMouseRegion(int index, int left, int top, int right, int bottom); +void DelMouseRegion(int index); +int CheckMouseRegion(int x, int y); + +void openXwindow(int argc, char *argv[], char **, char *, int, int); +void RedrawWindow(void); +void RedrawWindowXY(int x, int y); + +void copyXPMArea(int, int, int, int, int, int); +void copyXBMArea(int, int, int, int, int, int); +void setMaskXY(int, int); + +void parse_rcfile(const char *, rckeys *); + +#endif -- 2.11.4.GIT