1
0
mirror of https://github.com/gryf/wmaker.git synced 2026-01-01 19:42:32 +01:00
This thing is completely broken! There are functions that take a
completely different set of arguments than the ones currently used to call
them. There are even functions that are not defined anywhere but
called from wtext.c

Please fix it before re-enabling it in Makefile.am
This commit is contained in:
dan
2000-07-06 01:28:13 +00:00
parent fcab535c38
commit 4cb5649545
4 changed files with 430 additions and 411 deletions

View File

@@ -13,7 +13,7 @@ include_HEADERS = WINGs.h WUtil.h WINGsP.h
bin_SCRIPTS = get-wings-flags get-wutil-flags bin_SCRIPTS = get-wings-flags get-wutil-flags
noinst_PROGRAMS = wtest wmquery wmfile fontl testmywidget testcolorpanel\ noinst_PROGRAMS = wtest wmquery wmfile fontl testmywidget testcolorpanel\
connect puzzle testtext connect puzzle #testtext
lib_LIBRARIES = libWINGs.a libWUtil.a lib_LIBRARIES = libWINGs.a libWUtil.a
@@ -65,13 +65,11 @@ libWINGs_a_SOURCES = \
wpixmap.c \ wpixmap.c \
wpopupbutton.c \ wpopupbutton.c \
wprogressindicator.c \ wprogressindicator.c \
wruler.c \
wscroller.c \ wscroller.c \
wscrollview.c \ wscrollview.c \
wslider.c \ wslider.c \
wsplitview.c \ wsplitview.c \
wtabview.c \ wtabview.c \
wtext.c \
wtextfield.c \ wtextfield.c \
wwindow.c \ wwindow.c \
wview.c \ wview.c \

View File

@@ -10,13 +10,14 @@
void void
wAbort() wAbort()
{ {
exit(0); exit(0);
} }
void Close(WMWidget *self, void *client) void
Close(WMWidget *self, void *client)
{ {
exit(0); exit(0);
} }
@@ -24,7 +25,7 @@ void Close(WMWidget *self, void *client)
/* =============== a rudimentary HTML parser ======================= */ /* =============== a rudimentary HTML parser ======================= */
/* due to the WMSetTextParser stuff, it should not /* due to the WMSetTextParser stuff, it should not
be too hard to add parsers. like dis :-] */ be too hard to add parsers. like dis :-] */
/* /*
@@ -34,61 +35,61 @@ be too hard to add parsers. like dis :-] */
*/ */
unsigned char map_table[256] = unsigned char map_table[256] =
{ {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 91, 92, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 91, 92,
93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
248, 249, 250, 251, 252, 253, 254, 255}; 248, 249, 250, 251, 252, 253, 254, 255};
#define TOLOWER(x) (map_table[(int)x]) #define TOLOWER(x) (map_table[(int)x])
static int static int
mystrcasecmp(const unsigned char *s1, const unsigned char *s2) mystrcasecmp(const unsigned char *s1, const unsigned char *s2)
{ {
if (!*s1 || !*s2) return 0; if (!*s1 || !*s2) return 0;
while (*s2 != '\0') { while (*s2 != '\0') {
if (TOLOWER (*s1) != TOLOWER (*s2)) /* true if *s1 == 0 ! */ if (TOLOWER (*s1) != TOLOWER (*s2)) /* true if *s1 == 0 ! */
return 0; return 0;
s1++; s1++;
s2++; s2++;
} }
return (*s1=='\0' ||!isalnum(*s1))?1:0; return (*s1=='\0' ||!isalnum(*s1))?1:0;
} }
typedef struct _currentFormat { typedef struct _currentFormat {
void *para; void *para;
WMBag *fonts; WMBag *fonts;
WMBag *colors; WMBag *colors;
WMColor *ccolor; WMColor *ccolor;
WMFont *cfont; WMFont *cfont;
WMParserActions actions; WMParserActions actions;
//WMBag *aligns; // for tables... //WMBag *aligns; // for tables...
/* the following are "nested" /* the following are "nested"
i.e.: <b><b><i></b><b></i> i.e.: <b><b><i></b><b></i>
1 2 1 1 2 0 get it? */ 1 2 1 1 2 0 get it? */
short i; short i;
short b; short b;
short u; short u;
short fmargin; short fmargin;
short bmargin; short bmargin;
WMAlignment align:2; WMAlignment align:2;
short type:1; short type:1;
short ul:3; /* how "nested"... up to 8 levels deep */ short ul:3; /* how "nested"... up to 8 levels deep */
short comment:1; /* ignore text till --> */ short comment:1; /* ignore text till --> */
short RESERVED:10; short RESERVED:10;
} CFMT; } CFMT;
CFMT cfmt; CFMT cfmt;
@@ -97,345 +98,348 @@ CFMT cfmt;
#if 0 #if 0
getArg(char *t, short type, void *arg) getArg(char *t, short type, void *arg)
{ {
short d=0; short d=0;
while(*(++t) && !d) { while(*(++t) && !d) {
if(type==0) { if(type==0) {
if(*t>='0' && *t<='9') { if(*t>='0' && *t<='9') {
sscanf(t, "%d", arg); sscanf(t, "%d", arg);
while(*t&& (*t<'0' || *t>'9')) while(*t&& (*t<'0' || *t>'9'))
t++; t++;
d=1; d=1;
} }
} }
} }
} }
#endif #endif
void parseToken(WMText *tPtr, char *token, short tk) void
parseToken(WMText *tPtr, char *token, short tk)
{ {
short mode=0; /* 0 starts, 1 closes */ short mode=0; /* 0 starts, 1 closes */
WMScreen *scr = (W_VIEW(tPtr))->screen; WMScreen *scr = (W_VIEW(tPtr))->screen;
while(*token && isspace(*(token))) token++; while(*token && isspace(*(token))) token++;
if(*token == '/') { if(*token == '/') {
token++; token++;
mode = 1; mode = 1;
while(isspace(*(token))) token++; while(isspace(*(token))) token++;
} }
if(strlen(token)==1) { if(strlen(token)==1) {
/* nice and fast for small tokens... no need for too much brain /* nice and fast for small tokens... no need for too much brain
power here */ power here */
switch(TOLOWER(*token)) { switch(TOLOWER(*token)) {
case 'i': case 'i':
if(!mode) { if(!mode) {
cfmt.cfont = WMGetFontItalic(scr, cfmt.cfont); cfmt.cfont = WMGetFontItalic(scr, cfmt.cfont);
WMPutInBag(cfmt.fonts, (void *)cfmt.cfont); WMPutInBag(cfmt.fonts, (void *)cfmt.cfont);
} else { /*dun wanna remove the baseFont eh? */ } else { /*dun wanna remove the baseFont eh? */
int count = WMGetBagItemCount(cfmt.fonts); int count = WMGetBagItemCount(cfmt.fonts);
if(count>1) if(count>1)
WMDeleteFromBag(cfmt.fonts, count-1); WMDeleteFromBag(cfmt.fonts, count-1);
cfmt.cfont = (WMFont *)WMGetFromBag(cfmt.fonts, cfmt.cfont = (WMFont *)WMGetFromBag(cfmt.fonts,
WMGetBagItemCount(cfmt.fonts)-1); WMGetBagItemCount(cfmt.fonts)-1);
} break; } break;
case 'b': case 'b':
if(!mode) { if(!mode) {
cfmt.cfont = WMGetFontBold(scr, cfmt.cfont); cfmt.cfont = WMGetFontBold(scr, cfmt.cfont);
WMPutInBag(cfmt.fonts, (void *)cfmt.cfont); WMPutInBag(cfmt.fonts, (void *)cfmt.cfont);
} else { /*dun wanna remove the baseFont eh? */ } else { /*dun wanna remove the baseFont eh? */
int count = WMGetBagItemCount(cfmt.fonts); int count = WMGetBagItemCount(cfmt.fonts);
if(count>1) if(count>1)
WMDeleteFromBag(cfmt.fonts, count-1); WMDeleteFromBag(cfmt.fonts, count-1);
cfmt.cfont = (WMFont *)WMGetFromBag(cfmt.fonts, cfmt.cfont = (WMFont *)WMGetFromBag(cfmt.fonts,
WMGetBagItemCount(cfmt.fonts)-1); WMGetBagItemCount(cfmt.fonts)-1);
} break; } break;
case 'p': case 'p':
cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin,
WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align);
(cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type);
cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin,
WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align);
(cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type);
break; break;
case 'u': cfmt.u = !mode; break; case 'u': cfmt.u = !mode; break;
} }
} else { /* the <HTML> tag is, as far as I'm concerned, useless */ } else { /* the <HTML> tag is, as far as I'm concerned, useless */
if(mystrcasecmp(token, "br")) { if(mystrcasecmp(token, "br")) {
cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin,
WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align);
(cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type);
} }
else if(mystrcasecmp(token, "ul")) { else if(mystrcasecmp(token, "ul")) {
if(mode) { if(mode) {
if(cfmt.ul>1) cfmt.ul--; if(cfmt.ul>1) cfmt.ul--;
} else cfmt.ul++; } else cfmt.ul++;
if(cfmt.ul) { if(cfmt.ul) {
cfmt.bmargin = cfmt.ul*30; cfmt.bmargin = cfmt.ul*30;
cfmt.fmargin = cfmt.bmargin-10; cfmt.fmargin = cfmt.bmargin-10;
} else cfmt.fmargin = cfmt.bmargin = 0; } else cfmt.fmargin = cfmt.bmargin = 0;
} else if(mystrcasecmp(token, "li")) { } else if(mystrcasecmp(token, "li")) {
cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin,
WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align);
(cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type);
} else if(mystrcasecmp(token, "align")) } else if(mystrcasecmp(token, "align"))
;//printf("align"); ;//printf("align");
else if(mystrcasecmp(token, "img")) { else if(mystrcasecmp(token, "img")) {
if(!mode) { if(!mode) {
char *mark=NULL; char *mark=NULL;
WMPixmap *pixmap; WMPixmap *pixmap;
void *chunk; void *chunk;
token+=3; token+=3;
while(isspace(*(token))) token++; while(isspace(*(token))) token++;
do { do {
switch(TOLOWER(*token)) { switch(TOLOWER(*token)) {
case 's': case 's':
if(TOLOWER(*(1+token)) == 'r' && TOLOWER(*(2+token)) == 'c') { if(TOLOWER(*(1+token)) == 'r' && TOLOWER(*(2+token)) == 'c') {
mark = strchr(token, '='); mark = strchr(token, '=');
if(mark) { if(mark) {
char img[256], *iptr; char img[256], *iptr;
token = mark+1; token = mark+1;
if(!token) return; if(!token) return;
sscanf(token, "%s", img); sscanf(token, "%s", img);
iptr = img; iptr = img;
if(*img == '\"') { img[strlen(img)-1] = 0; iptr++;} if(*img == '\"') { img[strlen(img)-1] = 0; iptr++;}
pixmap = WMCreatePixmapFromFile(scr, iptr); pixmap = WMCreatePixmapFromFile(scr, iptr);
chunk = (cfmt.actions.createPChunk)(pixmap, 0, False); chunk = (cfmt.actions.createPChunk)(pixmap, 0, False);
(cfmt.actions.insertChunk) (tPtr, chunk, False); (cfmt.actions.insertChunk) (tPtr, chunk, False);
printf("[%s]\n", iptr); printf("[%s]\n", iptr);
} } break; } } while(*(token++)); } } break; } } while(*(token++));
} }
} else if(mystrcasecmp(token, "font")) { } else if(mystrcasecmp(token, "font")) {
#if 0 #if 0
if(mode) { if(mode) {
cfmt.cfont = (WMFont *)WMGetFromBag(cfmt.fonts, cfmt.cfont = (WMFont *)WMGetFromBag(cfmt.fonts,
WMGetBagItemCount(cfmt.fonts)-1); WMGetBagItemCount(cfmt.fonts)-1);
} else } else
(WMColor *)WMGetFromBag(cfmt.colors, (WMColor *)WMGetFromBag(cfmt.colors,
WMGetBagItemCount(cfmt.colors)-1), WMGetBagItemCount(cfmt.colors)-1),
#endif
}
else if(mystrcasecmp(token, "center")) {
printf("center\n");
if(mode) cfmt.align = WALeft;
else cfmt.align = WACenter;
cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin,
WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align);
(cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type);
}
}
//printf("parse token (%s)[%s]\n", mode?"close":"open", token);
#if 0
i=0;
//while(*token && !isspace(*(token))) token++;
//printf("A:%d a:%d z%d Z%d\n", '1', 'a', 'Z', 'z');
do {
if(!mm) {
if(c>=65 && c<=122) { major[i++] = c;
} else if(c==' ' || c=='='){ major[i] = 0; i=0; mm=1;
printf("\nmajor: [%s]", major);}
} else {
if(c!=' ') {
minor[i++] = c;
} else { minor[i] = 0; i=0; printf(" minor: [%s] ", minor);}
}
}while((c = *(++token)));
#endif #endif
}
else if(mystrcasecmp(token, "center")) {
//printf("parse token (%s)[%s]\n", mode?"close":"open", token); printf("center\n");
if(mode) cfmt.align = WALeft;
else cfmt.align = WACenter;
cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin,
WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align);
(cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type);
}
}
//printf("parse token (%s)[%s]\n", mode?"close":"open", token);
#if 0
i=0;
//while(*token && !isspace(*(token))) token++;
//printf("A:%d a:%d z%d Z%d\n", '1', 'a', 'Z', 'z');
do {
if(!mm) {
if(c>=65 && c<=122) { major[i++] = c;
} else if(c==' ' || c=='='){ major[i] = 0; i=0; mm=1;
printf("\nmajor: [%s]", major);}
} else {
if(c!=' ') {
minor[i++] = c;
} else { minor[i] = 0; i=0; printf(" minor: [%s] ", minor);}
}
}while((c = *(++token)));
#endif
//printf("parse token (%s)[%s]\n", mode?"close":"open", token);
} }
void HTMLParser(WMWidget *w, void *clientData, short type) void
HTMLParser(WMWidget *w, void *clientData, short type)
{ {
static short init=1; /* have we been here at least once before? */ static short init=1; /* have we been here at least once before? */
char *stream = (char *) clientData; char *stream = (char *) clientData;
WMText *tPtr = (WMText *)w; WMText *tPtr = (WMText *)w;
WMScreen *scr; WMScreen *scr;
void *chunk; void *chunk;
char c; char c;
#define MAX_TOKEN_SIZE 255 #define MAX_TOKEN_SIZE 255
char token[MAX_TOKEN_SIZE+1]; char token[MAX_TOKEN_SIZE+1];
#define MAX_TEXT_SIZE 1023 #define MAX_TEXT_SIZE 1023
char text[MAX_TEXT_SIZE+1]; char text[MAX_TEXT_SIZE+1];
short mode=0; short mode=0;
short tk=0, txt=0; short tk=0, txt=0;
short wasspace=0; short wasspace=0;
if(!tPtr || !stream) if(!tPtr || !stream)
return; return;
scr = (W_VIEW(tPtr))->screen; scr = (W_VIEW(tPtr))->screen;
cfmt.type = type; cfmt.type = type;
if(init) { if(init) {
cfmt.actions = WMGetTextParserActions(tPtr); cfmt.actions = WMGetTextParserActions(tPtr);
cfmt.fonts = WMCreateBag(4); /* there sould always be at least 1 font... */ cfmt.fonts = WMCreateBag(4); /* there sould always be at least 1 font... */
cfmt.cfont = WMSystemFontOfSize(scr, 12); cfmt.cfont = WMSystemFontOfSize(scr, 12);
WMPutInBag(cfmt.fonts, (void *)cfmt.cfont); WMPutInBag(cfmt.fonts, (void *)cfmt.cfont);
cfmt.colors = WMCreateBag(4); cfmt.colors = WMCreateBag(4);
cfmt.ccolor = WMBlackColor(scr); cfmt.ccolor = WMBlackColor(scr);
WMPutInBag(cfmt.colors, (void *)cfmt.ccolor); WMPutInBag(cfmt.colors, (void *)cfmt.ccolor);
cfmt.i = cfmt.b = cfmt.u = cfmt.ul = 0; cfmt.i = cfmt.b = cfmt.u = cfmt.ul = 0;
cfmt.align = WALeft; cfmt.align = WALeft;
cfmt.fmargin = cfmt.bmargin = 0; cfmt.fmargin = cfmt.bmargin = 0;
cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin,
WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align);
(cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type);
init = 0; init = 0;
} }
#if 1 #if 1
if(strlen(stream) == 1 && stream[0] == '\n') { if(strlen(stream) == 1 && stream[0] == '\n') {
/* sometimes if the text entered is a single char AND is a newline, /* sometimes if the text entered is a single char AND is a newline,
the user prolly typed it */ the user prolly typed it */
cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin,
WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align);
(cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type);
return; return;
} }
#endif #endif
/* /*
*/ */
while( (c=*(stream++))) { while( (c=*(stream++))) {
//printf("%c", c); //printf("%c", c);
if(c == '\n' || c =='\t') if(c == '\n' || c =='\t')
//c = ' '; //continue; //c = ' '; //continue;
continue; continue;
if(c == ' ') { if(c == ' ') {
if(wasspace) if(wasspace)
continue; continue;
wasspace = 1; wasspace = 1;
}else wasspace = 0; }else wasspace = 0;
if(c == '<' && !mode) { if(c == '<' && !mode) {
mode=1; mode=1;
if(txt>0) { if(txt>0) {
text[txt] = 0; text[txt] = 0;
chunk = (cfmt.actions.createTChunk)(text, txt, cfmt.cfont, chunk = (cfmt.actions.createTChunk)(text, txt, cfmt.cfont,
cfmt.ccolor, 0, (cfmt.u?1:0)); cfmt.ccolor, 0, (cfmt.u?1:0));
(cfmt.actions.insertChunk) (tPtr, chunk, cfmt.type); (cfmt.actions.insertChunk) (tPtr, chunk, cfmt.type);
//printf("%s\n", text); //printf("%s\n", text);
} }
txt = 0; txt = 0;
} else if(c == '>' && mode) { } else if(c == '>' && mode) {
token[tk] = 0; token[tk] = 0;
if(tk>0) parseToken(tPtr, token, tk); if(tk>0) parseToken(tPtr, token, tk);
mode=0; mode=0;
tk=0; tk=0;
} else { } else {
if(mode) { if(mode) {
if(tk < MAX_TOKEN_SIZE) token[tk++] = c; if(tk < MAX_TOKEN_SIZE) token[tk++] = c;
} else if(txt < MAX_TEXT_SIZE) text[txt++] = c; } else if(txt < MAX_TEXT_SIZE) text[txt++] = c;
} }
} }
if(tk>0) { token[tk] = 0; parseToken(tPtr, token, tk);}
if(txt>0) {
text[txt] = 0;
//printf("%s\n", text);
chunk = (cfmt.actions.createTChunk)(text, txt,
(WMFont *)WMGetFromBag(cfmt.fonts,
WMGetBagItemCount(cfmt.fonts)-1),
(WMColor *)WMGetFromBag(cfmt.colors,
WMGetBagItemCount(cfmt.colors)-1),
0, (cfmt.u?1:0));
(cfmt.actions.insertChunk) (tPtr, chunk, cfmt.type);
}
if(tk>0) { token[tk] = 0; parseToken(tPtr, token, tk);}
if(txt>0) {
text[txt] = 0;
//printf("%s\n", text);
chunk = (cfmt.actions.createTChunk)(text, txt,
(WMFont *)WMGetFromBag(cfmt.fonts,
WMGetBagItemCount(cfmt.fonts)-1),
(WMColor *)WMGetFromBag(cfmt.colors,
WMGetBagItemCount(cfmt.colors)-1),
0, (cfmt.u?1:0));
(cfmt.actions.insertChunk) (tPtr, chunk, cfmt.type);
}
} }
/* ================= the driver ================== */ /* ================= the driver ================== */
WMWidget *win; WMWidget *win;
WMText *text; WMText *text;
void NotificationObserver(void *self, WMNotification *notif) void
NotificationObserver(void *self, WMNotification *notif)
{ {
void *object = WMGetNotificationObject(notif); void *object = WMGetNotificationObject(notif);
unsigned short w = WMWidgetWidth(win); unsigned short w = WMWidgetWidth(win);
unsigned short h = WMWidgetHeight(win); unsigned short h = WMWidgetHeight(win);
if (WMGetNotificationName(notif) == WMViewSizeDidChangeNotification) { if (WMGetNotificationName(notif) == WMViewSizeDidChangeNotification) {
if (object == WMWidgetView(win)) { if (object == WMWidgetView(win)) {
WMResizeWidget(text, w-20, h-20); WMResizeWidget(text, w-20, h-20);
} }
} }
{static int i=0; {static int i=0;
switch(i++) { switch(i++) {
case 0: WMSetTextHasHorizontalScroller(text, False); break; case 0: WMSetTextHasHorizontalScroller(text, False); break;
case 1: WMSetTextHasVerticalScroller(text, False); break; case 1: WMSetTextHasVerticalScroller(text, False); break;
case 2: WMSetTextHasVerticalScroller(text, True); break; case 2: WMSetTextHasVerticalScroller(text, True); break;
case 3: WMSetTextHasHorizontalScroller(text, True); break; case 3: WMSetTextHasHorizontalScroller(text, True); break;
default: i=0; default: i=0;
} }
} }
} }
int int
main(int argc, char **argv) main(int argc, char **argv)
{ {
Display *dpy; Display *dpy;
WMScreen *scr; WMScreen *scr;
WMInitializeApplication("WMText", &argc, argv); WMInitializeApplication("WMText", &argc, argv);
dpy = XOpenDisplay(NULL); dpy = XOpenDisplay(NULL);
if(!dpy) exit(1); if(!dpy) exit(1);
scr = WMCreateSimpleApplicationScreen(dpy); scr = WMCreateSimpleApplicationScreen(dpy);
win = WMCreateWindow(scr, "WMText Test"); win = WMCreateWindow(scr, "WMText Test");
WMRealizeWidget(win); WMRealizeWidget(win);
WMResizeWidget(win, 500, 300); WMResizeWidget(win, 500, 300);
//WMResizeWidget(win, 900, 600); //WMResizeWidget(win, 900, 600);
WMSetWindowTitle(win,"WMText Test"); WMSetWindowTitle(win,"WMText Test");
WMSetWindowCloseAction(win, Close, NULL); WMSetWindowCloseAction(win, Close, NULL);
text = WMCreateText(win); text = WMCreateText(win);
WMRealizeWidget(text); WMRealizeWidget(text);
WMResizeWidget(text, 480, 280); WMResizeWidget(text, 480, 280);
WMMoveWidget(text, 10, 10); WMMoveWidget(text, 10, 10);
WMSetTextUseFixedPitchFont(text, False); WMSetTextUseFixedPitchFont(text, False);
WMSetTextMonoFont(text, False); WMSetTextMonoFont(text, False);
WMSetTextParser(text, HTMLParser); WMSetTextParser(text, HTMLParser);
WMSetTextEditable(text, True); WMSetTextEditable(text, True);
WMFreezeText(text); WMFreezeText(text);
if(1){ if(1){
FILE *f = fopen("./wm.html", "r"); FILE *f = fopen("./wm.html", "r");
char data[1024]; char data[1024];
if(f) { if(f) {
while(fgets(data, 1022,f)) while(fgets(data, 1022,f))
WMAppendTextStream(text, data); WMAppendTextStream(text, data);
fclose(f); fclose(f);
} else { } else {
WMAppendTextStream(text, "<i>can't</i> open the <u>wm.html</u> file, but here's a <B>text <I>stream <img src=foo.bar></I><BR>that</B> <U>needs</U> parsing"); WMAppendTextStream(text, "<i>can't</i> open the <u>wm.html</u> file, but here's a <B>text <I>stream <img src=foo.bar></I><BR>that</B> <U>needs</U> parsing");
} }
} }
//WMPrependTextStream(text, "this is prepended\n");
//WMAppendTextStream(text, "blueplanet.rtf");
WMThawText(text); //WMPrependTextStream(text, "this is prepended\n");
WMRefreshText(text, 0, 0); //WMAppendTextStream(text, "blueplanet.rtf");
/*
WMAddNotificationObserver(NotificationObserver, win,
WMViewSizeDidChangeNotification, WMWidgetView(win));
*/
WMSetViewNotifySizeChanges(WMWidgetView(win), True);
WMMapSubwidgets(win);
WMMapWidget(win);
WMScreenMainLoop(scr); WMThawText(text);
WMRefreshText(text, 0, 0);
/*
WMAddNotificationObserver(NotificationObserver, win,
WMViewSizeDidChangeNotification, WMWidgetView(win));
*/
WMSetViewNotifySizeChanges(WMWidgetView(win), True);
WMMapSubwidgets(win);
WMMapWidget(win);
WMScreenMainLoop(scr);
} }

View File

@@ -40,7 +40,9 @@ typedef struct W_Ruler {
| \ | \
|__\ |__\
| |
| */ |
*/
static void static void
drawLeftMarker(Ruler *rPtr) drawLeftMarker(Ruler *rPtr)
{ {
@@ -62,14 +64,16 @@ drawLeftMarker(Ruler *rPtr)
rPtr->fg, points, 4, Convex, CoordModeOrigin); rPtr->fg, points, 4, Convex, CoordModeOrigin);
} }
/* Marker for right margin /* Marker for right margin
/| /|
/ | / |
/__| /__|
| |
| */ |
*/
static void static void
drawRightMarker(Ruler *rPtr) drawRightMarker(Ruler *rPtr)
{ {
@@ -95,7 +99,9 @@ drawRightMarker(Ruler *rPtr)
/* Marker for first line only /* Marker for first line only
_____ _____
|___| |___|
| */ |
*/
static void static void
drawFirstMarker(Ruler *rPtr) drawFirstMarker(Ruler *rPtr)
{ {
@@ -110,7 +116,8 @@ drawFirstMarker(Ruler *rPtr)
/* Marker for rest of body /* Marker for rest of body
_____ _____
\ / \ /
\./ */ \./
*/
static void static void
drawBodyMarker(Ruler *rPtr) drawBodyMarker(Ruler *rPtr)
{ {
@@ -127,6 +134,7 @@ drawBodyMarker(Ruler *rPtr)
rPtr->fg, points, 3, Convex, CoordModeOrigin); rPtr->fg, points, 3, Convex, CoordModeOrigin);
} }
static void static void
createDrawBuffer(Ruler *rPtr) createDrawBuffer(Ruler *rPtr)
{ {
@@ -139,6 +147,7 @@ createDrawBuffer(Ruler *rPtr)
rPtr->bg, 0, 0, rPtr->view->size.width, 40); rPtr->bg, 0, 0, rPtr->view->size.width, 40);
} }
static void static void
drawRulerOnPixmap(Ruler *rPtr) drawRulerOnPixmap(Ruler *rPtr)
{ {
@@ -146,52 +155,52 @@ drawRulerOnPixmap(Ruler *rPtr)
char c[3]; char c[3];
int marks[9] = {11, 3, 5, 3, 7, 3, 5, 3}; int marks[9] = {11, 3, 5, 3, 7, 3, 5, 3};
if(!rPtr->drawBuffer) if(!rPtr->drawBuffer)
createDrawBuffer(rPtr); createDrawBuffer(rPtr);
XFillRectangle(rPtr->view->screen->display, rPtr->drawBuffer, XFillRectangle(rPtr->view->screen->display, rPtr->drawBuffer,
rPtr->bg, 0, 0, rPtr->view->size.width, 40); rPtr->bg, 0, 0, rPtr->view->size.width, 40);
WMDrawString(rPtr->view->screen, rPtr->drawBuffer, rPtr->fg,
rPtr->font, rPtr->margins.left+2, 26, "0 inches", 10);
WMDrawString(rPtr->view->screen, rPtr->drawBuffer, /* marker ticks */
rPtr->fg, rPtr->font, rPtr->margins.left+2, 26, "0 inches", 10); i=j=m=0;
w = rPtr->view->size.width - rPtr->margins.left;
/* marker ticks */ while(m < w) {
i=j=m=0; XDrawLine(rPtr->view->screen->display, rPtr->drawBuffer,
w = rPtr->view->size.width - rPtr->margins.left; rPtr->fg, rPtr->margins.left+m, 23,
while(m < w) { rPtr->margins.left+m, marks[i%8]+23);
XDrawLine(rPtr->view->screen->display, rPtr->drawBuffer, if(i!=0 && i%8==0) {
rPtr->fg, rPtr->margins.left+m, 23, if(j<10)
rPtr->margins.left+m, marks[i%8]+23); snprintf(c,3,"%d",++j);
if(i!=0 && i%8==0) { else
if(j<10) snprintf(c,3,"%2d",++j);
snprintf(c,3,"%d",++j); WMDrawString(rPtr->view->screen, rPtr->drawBuffer, rPtr->fg,
else rPtr->font, rPtr->margins.left+2+m, 26, c, 2);
snprintf(c,3,"%2d",++j); }
WMDrawString(rPtr->view->screen, rPtr->drawBuffer, m = (++i)*10;
rPtr->fg, rPtr->font, rPtr->margins.left+2+m, 26, c, 2);
} }
m = (++i)*10;
rPtr->end = rPtr->margins.left+m-10;
if(rPtr->margins.right > rPtr->end)
rPtr->margins.right = rPtr->end;
/* base line */
XDrawLine(rPtr->view->screen->display, rPtr->drawBuffer, rPtr->fg,
rPtr->margins.left, 22, rPtr->margins.left+m-10, 22);
drawLeftMarker(rPtr);
drawRightMarker(rPtr);
drawFirstMarker(rPtr);
drawBodyMarker(rPtr);
} }
rPtr->end = rPtr->margins.left+m-10;
if(rPtr->margins.right > rPtr->end)
rPtr->margins.right = rPtr->end;
/* base line */
XDrawLine(rPtr->view->screen->display, rPtr->drawBuffer,
rPtr->fg, rPtr->margins.left, 22, rPtr->margins.left+m-10, 22);
drawLeftMarker(rPtr);
drawRightMarker(rPtr);
drawFirstMarker(rPtr);
drawBodyMarker(rPtr);
}
static void static void
paintRuler(Ruler *rPtr) paintRuler(Ruler *rPtr)
{ {
WMScreen *screen = rPtr->view->screen; WMScreen *screen = rPtr->view->screen;
if(1||!rPtr->drawBuffer) { //first exposure if(1||!rPtr->drawBuffer) {
drawRulerOnPixmap(rPtr); drawRulerOnPixmap(rPtr);
} }
@@ -200,6 +209,7 @@ paintRuler(Ruler *rPtr)
0, 0); 0, 0);
} }
static Bool static Bool
verifyMarkerMove(Ruler *rPtr, int x) verifyMarkerMove(Ruler *rPtr, int x)
{ {
@@ -208,40 +218,37 @@ verifyMarkerMove(Ruler *rPtr, int x)
switch(rPtr->flags.whichMarker) { switch(rPtr->flags.whichMarker) {
case 1: case 1:
if( x > rPtr->margins.right - 10 if(x > rPtr->margins.right - 10 || x < rPtr->offset ||
|| rPtr->margins.body + x > rPtr->margins.right-MIN_DOC_WIDTH rPtr->margins.body + x > rPtr->margins.right-MIN_DOC_WIDTH ||
|| rPtr->margins.first + x > rPtr->margins.right-MIN_DOC_WIDTH rPtr->margins.first + x > rPtr->margins.right-MIN_DOC_WIDTH)
|| x < rPtr->offset)
return False; return False;
break; break;
case 2: case 2:
if( x < rPtr->margins.first+MIN_DOC_WIDTH if(x < rPtr->margins.first+MIN_DOC_WIDTH ||
|| x < rPtr->margins.body+MIN_DOC_WIDTH x < rPtr->margins.body+MIN_DOC_WIDTH ||
|| x < rPtr->margins.left+MIN_DOC_WIDTH x < rPtr->margins.left+MIN_DOC_WIDTH ||
|| x > rPtr->end) //rPtr->view->size.width) x > rPtr->end) /*rPtr->view->size.width)*/
return False; return False;
break; break;
case 3: case 3:
if( x >= rPtr->margins.right-MIN_DOC_WIDTH if(x >= rPtr->margins.right-MIN_DOC_WIDTH || x < rPtr->margins.left)
|| x < rPtr->margins.left)
return False; return False;
break; break;
case 4: case 4:
if( x >= rPtr->margins.right-MIN_DOC_WIDTH if(x >= rPtr->margins.right-MIN_DOC_WIDTH || x < rPtr->margins.left)
|| x < rPtr->margins.left)
return False; return False;
break; break;
case 6: case 6:
if( x >= rPtr->margins.right-MIN_DOC_WIDTH if(x >= rPtr->margins.right-MIN_DOC_WIDTH || x < rPtr->margins.left)
|| x < rPtr->margins.left)
return False; return False;
break; break;
default: return False; default:
return False;
} }
rPtr->motion = x; rPtr->motion = x;
@@ -439,15 +446,17 @@ WMSetRulerMargins(WMRuler *rPtr, WMRulerMargins margins)
rPtr->margins.right = margins.right + rPtr->offset; rPtr->margins.right = margins.right + rPtr->offset;
rPtr->margins.first = margins.first + rPtr->offset; rPtr->margins.first = margins.first + rPtr->offset;
rPtr->margins.body = margins.body + rPtr->offset; rPtr->margins.body = margins.body + rPtr->offset;
rPtr->margins.tabs = margins.tabs; //for loop rPtr->margins.tabs = margins.tabs; /*for loop*/
paintRuler(rPtr); paintRuler(rPtr);
} }
WMRulerMargins WMRulerMargins
WMGetRulerMargins(WMRuler *rPtr) WMGetRulerMargins(WMRuler *rPtr)
{ {
WMRulerMargins margins; WMRulerMargins margins;
if(!rPtr) if(!rPtr)
return margins; return margins;
@@ -455,21 +464,23 @@ WMGetRulerMargins(WMRuler *rPtr)
margins.right = rPtr->margins.right - rPtr->offset; margins.right = rPtr->margins.right - rPtr->offset;
margins.first = rPtr->margins.first - rPtr->offset; margins.first = rPtr->margins.first - rPtr->offset;
margins.body = rPtr->margins.body - rPtr->offset; margins.body = rPtr->margins.body - rPtr->offset;
//for /*for*/
margins.tabs = rPtr->margins.tabs; margins.tabs = rPtr->margins.tabs;
return rPtr->margins; return rPtr->margins;
} }
void void
WMSetRulerOffset(WMRuler *rPtr, int pixels) WMSetRulerOffset(WMRuler *rPtr, int pixels)
{ {
if(!rPtr || pixels<0 || pixels+MIN_DOC_WIDTH>=rPtr->view->size.width) if(!rPtr || pixels<0 || pixels+MIN_DOC_WIDTH>=rPtr->view->size.width)
return; return;
rPtr->offset = pixels; rPtr->offset = pixels;
//rulerDidResize(rPtr, rPtr->view); /*rulerDidResize(rPtr, rPtr->view);*/
} }
int int
WMGetRulerOffset(WMRuler *rPtr) WMGetRulerOffset(WMRuler *rPtr)
{ {
@@ -478,6 +489,7 @@ WMGetRulerOffset(WMRuler *rPtr)
return rPtr->offset; return rPtr->offset;
} }
void void
WMSetRulerReleaseAction(WMRuler *rPtr, WMAction *action, void *clientData) WMSetRulerReleaseAction(WMRuler *rPtr, WMAction *action, void *clientData)
{ {
@@ -488,6 +500,7 @@ WMSetRulerReleaseAction(WMRuler *rPtr, WMAction *action, void *clientData)
rPtr->clientData = clientData; rPtr->clientData = clientData;
} }
void void
WMSetRulerMoveAction(WMRuler *rPtr, WMAction *action, void *clientData) WMSetRulerMoveAction(WMRuler *rPtr, WMAction *action, void *clientData)
{ {
@@ -498,6 +511,7 @@ WMSetRulerMoveAction(WMRuler *rPtr, WMAction *action, void *clientData)
rPtr->clientData = clientData; rPtr->clientData = clientData;
} }
/* _which_ one was released */ /* _which_ one was released */
int int
WMGetReleasedRulerMargin(WMRuler *rPtr) WMGetReleasedRulerMargin(WMRuler *rPtr)
@@ -507,6 +521,7 @@ WMGetReleasedRulerMargin(WMRuler *rPtr)
return rPtr->flags.whichMarker; return rPtr->flags.whichMarker;
} }
/* _which_ one is being grabbed */ /* _which_ one is being grabbed */
int int
WMGetGrabbedRulerMargin(WMRuler *rPtr) WMGetGrabbedRulerMargin(WMRuler *rPtr)
@@ -515,3 +530,5 @@ WMGetGrabbedRulerMargin(WMRuler *rPtr)
return 0; return 0;
return rPtr->flags.whichMarker; return rPtr->flags.whichMarker;
} }

View File

@@ -280,7 +280,7 @@ chunkSelectionRect(Text *tPtr, Paragraph *para, MyTextItems item,
if(type == 1 && item.chunk->type == ctText) { /* partial coverage */ if(type == 1 && item.chunk->type == ctText) { /* partial coverage */
lm = 2+WMGetRulerMargin(tPtr->ruler, WRulerDocLeft); lm = 2+WMGetRulerMargins(tPtr->ruler, WRulerDocLeft);
/* even I am still confused, so don't ask please */ /* even I am still confused, so don't ask please */
if( (item.x+j+lm >= tPtr->sRect.pos.x && if( (item.x+j+lm >= tPtr->sRect.pos.x &&
item.x+j+lm <= tPtr->sRect.pos.x+tPtr->sRect.size.width) item.x+j+lm <= tPtr->sRect.pos.x+tPtr->sRect.size.width)
@@ -571,8 +571,8 @@ putParagraphOnPixmap(Text *tPtr, Paragraph *para, Bool draw)
if(!tPtr->view->flags.realized || !para) return 0; if(!tPtr->view->flags.realized || !para) return 0;
where.x = 0, where.y =0, nitems = 0; where.x = 0, where.y =0, nitems = 0;
m.left = WMGetRulerMargin(tPtr->ruler, WRulerDocLeft); m.left = WMGetRulerMargins(tPtr->ruler, WRulerDocLeft);
m.right = WMGetRulerMargin(tPtr->ruler, WRulerRight) - m.left; m.right = WMGetRulerMargins(tPtr->ruler, WRulerRight) - m.left;
m.first = para->fmargin, m.body = para->bmargin; m.first = para->fmargin, m.body = para->bmargin;
if(draw) { if(draw) {
@@ -669,9 +669,9 @@ calcParaExtents(Text *tPtr, Paragraph *para)
para->bmargin = 0; para->bmargin = 0;
para->rmargin = tPtr->visibleW; para->rmargin = tPtr->visibleW;
} else { } else {
para->width = WMGetRulerMargin(tPtr->ruler, WRulerRight) - para->width = WMGetRulerMargins(tPtr->ruler, WRulerRight) -
WMIN(para->fmargin, para->bmargin) WMIN(para->fmargin, para->bmargin) -
- WMGetRulerOffset(tPtr->ruler); WMGetRulerOffset(tPtr->ruler);
} }
if(!para->chunks) if(!para->chunks)
@@ -728,8 +728,8 @@ calcDocExtents(Text *tPtr)
if(tPtr->monoFont) { if(tPtr->monoFont) {
tPtr->docWidth = tPtr->visibleW; tPtr->docWidth = tPtr->visibleW;
} else { } else {
tPtr->docWidth = WMGetRulerMargin(tPtr->ruler, WRulerRight) - tPtr->docWidth = WMGetRulerMargins(tPtr->ruler, WRulerRight) -
WMGetRulerMargin(tPtr->ruler, WRulerDocLeft); WMGetRulerMargins(tPtr->ruler, WRulerDocLeft);
} }
tPtr->docHeight = 0; tPtr->docHeight = 0;
para = tPtr->paragraphs; para = tPtr->paragraphs;
@@ -2382,7 +2382,7 @@ WMSetTextRulerMargin(WMText *tPtr, char which, short pixels)
{ {
if(!tPtr) return; if(!tPtr) return;
if(tPtr->monoFont) return; if(tPtr->monoFont) return;
WMSetRulerMargin(tPtr->ruler, which, pixels); WMSetRulerMargins(tPtr->ruler, which, pixels);
WMRefreshText(tPtr, tPtr->vpos, tPtr->hpos); WMRefreshText(tPtr, tPtr->vpos, tPtr->hpos);
} }
@@ -2392,7 +2392,7 @@ WMGetTextRulerMargin(WMText *tPtr, char which)
if(!tPtr) return 0; if(!tPtr) return 0;
if(tPtr->monoFont) if(tPtr->monoFont)
return 0; return 0;
return WMGetRulerMargin(tPtr->ruler, which); return WMGetRulerMargins(tPtr->ruler, which);
} }