void InitGraphics(int argc, char *argv[]) { Dimension width, height; XEvent event; static String fallback_resources[] = { "*xcheck*background: #e0e0e0", "*xcheck*fontList: -*-helvetica-bold-r-normal--14-*-*-*-*-*-*-*", "*xcheck*font: -*-helvetica-bold-r-normal--14-*-*-*-*-*-*-*", "*xcheck*XmText.background: #b0e0c0", NULL, }; XtSetLanguageProc(NULL,NULL,NULL); toplevel = XtVaAppInitialize( &app,"App-Class", NULL,0, &argc,argv, fallback_resources, NULL); mainWidget = XtVaCreateManagedWidget("mw", xmMainWindowWidgetClass, toplevel, NULL); dpy = XtDisplay(mainWidget); gc = XCreateGC(dpy,DefaultRootWindow(dpy),(int)NULL,NULL); XSetLineAttributes(dpy,gc,2,LineSolid,CapButt,JoinMiter); colormap = CreateColorMap(mainWidget); menubar = CreateMenuBar(mainWidget); workwin = CreateWorkWin(mainWidget); message = CreateMessage(mainWidget); XtVaSetValues(mainWidget, XmNcolormap,colormap, XmNmenuBar,menubar, XmNworkWindow,workwin, XmNmessageWindow,message, NULL); XtRealizeWidget(toplevel); do { XtAppNextEvent(app,&event); XtDispatchEvent(&event); } while(event.type != Expose); XtVaGetValues(toplevel,XmNheight,&height,XmNwidth,&width,NULL); XtVaSetValues(toplevel, XmNwidth, width, XmNheight, height, XmNmaxWidth, width, XmNmaxHeight, height, XmNminWidth, width, XmNminHeight, height, XmNallowShellResize, False, NULL); HandleEvents(); strcpy(xval[0],"human"); strcpy(xval[1],"computer"); strcpy(xval[2],"10.0"); }
TCHAR* DoRtfToTags( char* pszText, SESSION_INFO* si) { char *p1; int* pIndex; int i, iRemoveChars, cp = CP_ACP; char InsertThis[50]; BOOL bJustRemovedRTF = TRUE; BOOL bTextHasStarted = FALSE; int iUcMode = 0; if ( !pszText ) return FALSE; // create an index of colors in the module and map them to // corresponding colors in the RTF color table pIndex = mir_alloc(sizeof(int) * MM_FindModule(si->pszModule)->nColorCount); for(i = 0; i < MM_FindModule(si->pszModule)->nColorCount ; i++) pIndex[i] = -1; CreateColorMap( pszText, pIndex, si ); // scan the file for rtf commands and remove or parse them p1 = strstr( pszText, "\\pard" ); if ( p1 == NULL ) { mir_free(pIndex); return FALSE; } p1 += 5; memmove(pszText, p1, strlen(p1) + 1); p1 = pszText; // iterate through all characters, if rtf control character found then take action while ( *p1 != '\0' ) { InsertThis[0] = 0; iRemoveChars = 0; switch (*p1) { case '\\': if ( !memcmp(p1, "\\cf", 3 )) { // foreground color int iCol, iInd; iRemoveChars = 3 + ReadInteger(p1+3, &iCol); iInd = RTFColorToIndex(pIndex, iCol, si); bJustRemovedRTF = TRUE; if (bTextHasStarted || iInd >= 0) mir_snprintf( InsertThis, SIZEOF(InsertThis), ( iInd >= 0 ) ? "%%c%02u" : "%%C", iInd); } else if ( !memcmp(p1, "\\highlight", 10 )) { //background color int iCol, iInd; iRemoveChars = 10 + ReadInteger(p1+10, &iCol); iInd = RTFColorToIndex(pIndex, iCol, si); bJustRemovedRTF = TRUE; if (bTextHasStarted || iInd >= 0) mir_snprintf( InsertThis, SIZEOF(InsertThis), ( iInd >= 0 ) ? "%%f%02u" : "%%F", iInd); } else if ( !memcmp(p1, "\\lang", 5 )) { // language id bTextHasStarted = bJustRemovedRTF = TRUE; iRemoveChars = 5 + ReadInteger( p1+5, NULL ); } else if ( !memcmp(p1, "\\par", 4 )) { // newline bTextHasStarted = bJustRemovedRTF = TRUE; iRemoveChars = 4; strcpy(InsertThis, "\n" ); } else if ( !memcmp(p1, "\\line", 5 )) { // newline bTextHasStarted = bJustRemovedRTF = TRUE; iRemoveChars = 5; strcpy(InsertThis, "\n" ); } else if (!memcmp(p1, "\\bullet", 7)) { bTextHasStarted = TRUE; bJustRemovedRTF = TRUE; iRemoveChars = 7; #if defined(_UNICODE) strcpy(InsertThis, "\xE2\x80\xA2"); #else strcpy(InsertThis, "\x95"); #endif } else if ( !memcmp(p1, "\\b", 2 )) { //bold bTextHasStarted = bJustRemovedRTF = TRUE; iRemoveChars = (p1[2] != '0')?2:3; mir_snprintf(InsertThis, SIZEOF(InsertThis), (p1[2] != '0') ? "%%b": "%%B" ); } else if ( !memcmp(p1, "\\i", 2 )) { // italics bTextHasStarted = bJustRemovedRTF = TRUE; iRemoveChars = (p1[2] != '0')?2:3; mir_snprintf(InsertThis, SIZEOF(InsertThis), (p1[2] != '0') ? "%%i" : "%%I" ); } else if ( !memcmp(p1, "\\uc", 3 )) { // number of Unicode chars bTextHasStarted = bJustRemovedRTF = TRUE; iUcMode = p1[3] - '0'; iRemoveChars = 4; } else if ( !memcmp(p1, "\\ul", 3 )) { // underlined bTextHasStarted = bJustRemovedRTF = TRUE; if (p1[3] == 'n') iRemoveChars = 7; else if (p1[3] == '0') iRemoveChars = 4; else iRemoveChars = 3; mir_snprintf(InsertThis, SIZEOF(InsertThis), (p1[3] != '0' && p1[3] != 'n') ? "%%u" : "%%U" ); } else if ( p1[1] == 'f' && isdigit( p1[2] )) { // unicode char bTextHasStarted = bJustRemovedRTF = TRUE; iRemoveChars = 2 + ReadInteger( p1+2, NULL ); } else if ( !memcmp(p1, "\\tab", 4 )) { // tab bTextHasStarted = TRUE; bJustRemovedRTF = TRUE; iRemoveChars = 4; strcpy(InsertThis, " " ); } else if (!memcmp(p1, "\\endash", 7)) { bTextHasStarted = TRUE; bJustRemovedRTF = TRUE; iRemoveChars = 7; #if defined(_UNICODE) strcpy(InsertThis, "\xE2\x80\x93"); #else strcpy(InsertThis, "\x96"); #endif } else if (!memcmp(p1, "\\emdash", 7)) { bTextHasStarted = TRUE; bJustRemovedRTF = TRUE; iRemoveChars = 7; #if defined(_UNICODE) strcpy(InsertThis, "\xE2\x80\x94"); #else strcpy(InsertThis, "\x97"); #endif } else if (!memcmp(p1, "\\lquote",7)) { bTextHasStarted = TRUE; bJustRemovedRTF = TRUE; iRemoveChars = 7; #if defined(_UNICODE) strcpy(InsertThis, "\xE2\x80\x98"); #else strcpy(InsertThis, "\x91"); #endif } else if (!memcmp(p1, "\\rquote",7)) { bTextHasStarted = TRUE; bJustRemovedRTF = TRUE; iRemoveChars = 7; #if defined(_UNICODE) strcpy(InsertThis, "\xE2\x80\x99"); #else strcpy(InsertThis, "\x92"); #endif } else if (!memcmp(p1, "\\ldblquote",10)) { bTextHasStarted = TRUE; bJustRemovedRTF = TRUE; iRemoveChars = 10; #if defined(_UNICODE) strcpy(InsertThis, "\xe2\x80\x9c"); #else strcpy(InsertThis, "\""); #endif } else if (!memcmp(p1, "\\rdblquote",10)) { bTextHasStarted = TRUE; bJustRemovedRTF = TRUE; iRemoveChars = 10; #if defined(_UNICODE) strcpy(InsertThis, "\xe2\x80\x9d"); #else strcpy(InsertThis, "\""); #endif } else if ( p1[1] == '\\' || p1[1] == '{' || p1[1] == '}' ) { // escaped characters bTextHasStarted = TRUE; bJustRemovedRTF = FALSE; iRemoveChars = 2; mir_snprintf(InsertThis, SIZEOF(InsertThis), "%c", p1[1]); } else if ( p1[1] == '~' ) { // non-breaking space bTextHasStarted = TRUE; bJustRemovedRTF = FALSE; iRemoveChars = 2; #if defined(_UNICODE) strcpy(InsertThis, "\xC2\xA0"); #else strcpy(InsertThis, "\xA0"); #endif } else if ( p1[1] == '\'' ) { // special character char tmp[4], *p3 = tmp; bTextHasStarted = TRUE; bJustRemovedRTF = FALSE; if (p1[2] != ' ' && p1[2] != '\\') { *p3++ = p1[2]; iRemoveChars = 3; if ( p1[3] != ' ' && p1[3] != '\\') { *p3++ = p1[3]; iRemoveChars++; } *p3 = 0; sscanf( tmp, "%x", InsertThis ); InsertThis[1] = 0; } else iRemoveChars = 2; } else if ( bJustRemovedRTF ) { // remove unknown RTF command int j = 1; bJustRemovedRTF = TRUE; while(p1[j] != ' ' && p1[j] != '\\' && p1[j] != '\0') j++; iRemoveChars = j; } break; case '{': // other RTF control characters case '}': iRemoveChars = 1; break; case '\r': case '\n': bTextHasStarted = TRUE; bJustRemovedRTF = FALSE; iRemoveChars = 1; break; case '%': // escape chat -> protocol control character bTextHasStarted = TRUE; bJustRemovedRTF = FALSE; iRemoveChars = 1; strcpy(InsertThis, "%%"); break; case ' ': // remove spaces following a RTF command if (bJustRemovedRTF) iRemoveChars = 1; bJustRemovedRTF = FALSE; bTextHasStarted = TRUE; break; default: // other text that should not be touched bTextHasStarted = TRUE; bJustRemovedRTF = FALSE; break; } // move the memory and paste in new commands instead of the old RTF if (InsertThis[0] || iRemoveChars) { size_t len = strlen(InsertThis); memmove(p1 + len , p1 + iRemoveChars, strlen(p1) - iRemoveChars + 1); memcpy(p1, InsertThis, len); p1 += len; } else p1++; } mir_free(pIndex); #if !defined( _UNICODE ) return pszText; #else return mir_utf8decodeW(pszText); #endif }