__ATTR_TIOS_CALLBACK__ short fputc(short c, FILE *f) { short tmode=!(f->flags&_F_BIN); unsigned short minalloc; char *base=f->base,*oldbase=base; if(f->flags&_F_ERR) return EOF; if(!(f->flags&_F_WRIT)) __FERROR(f); minalloc=peek_w(base)+3; if(minalloc>65520u) __FERROR(f); if(minalloc>f->alloc) { HeapUnlock(f->handle); if(f->alloc<=65520u-f->buffincrement) f->alloc+=f->buffincrement; else f->alloc=65520u; if(!HeapRealloc(f->handle,f->alloc)) __FERROR(f); base=f->base=HLock(f->handle); f->fpos+=base-oldbase; oldbase=base; } if(feof(f)) (*(short*)base)++; if(c=='\n'&&tmode) c='\r'; poke(f->fpos++,c); if(c=='\r'&&tmode) fputc(' ',f); if(base+peek_w(base)+(tmode?0:2)==f->fpos) { f->flags|=_F_EOF; if(tmode) { poke(f->fpos,0); poke(f->fpos+1,0xE0); } } return c; }
MRESULT EXPENTRY Text3DWndProc(HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2) { LONG lClr; /* Presentation Parameter Colour */ PCREATESTRUCT pcrst; /* Create Structure Pointer */ PTEXTFIELD ptf; /* Text Field Structure Pointer */ PWNDPARAMS pwprm; /* Window Parameters Pointer */ RECTL rcl; /* Rectangle Holder */ ULONG flStyle; /* Control Style */ ULONG ulID; /* Presentation Parameter ID */ switch ( msg ) { /* Perform control initialization when the */ /* control is created */ case WM_CREATE : /* Save the address of the text string pointer */ /* in the control's reserved memory to allow it */ /* to be referenced as required by the control */ WinSetWindowPtr(hWnd, QWW_CDATA, (PVOID)(ptf = (PTEXTFIELD)HeapMalloc(hHeap, sizeof(TEXTFIELD)))); /* Get the control's creation structure address */ /* to copy the default text of the control to */ /* the memory in the heap */ pcrst = (PCREATESTRUCT)PVOIDFROMMP(mp2); if ( pcrst->pszText ) { ptf->pszText = (PSZ)HeapMalloc(hHeap, (ULONG)(ptf->cText = (LONG)strlen(pcrst->pszText)) + 1UL); memcpy(ptf->pszText, pcrst->pszText, (UINT)ptf->cText); } /* Set up the colours that will be used within */ /* the painting of the control. */ SetDefaultColours(hWnd, ptf); /* Check to see if the user provided font that */ /* should override the default font that would */ /* be set */ if ( !WinQueryPresParam(hWnd, PP_FONTNAMESIZE, 0L, &ulID, 4L, (PVOID)&lClr, QPF_NOINHERIT) ) /* System indicates not set since not data was */ /* returned, therefore set default font for the */ /* control */ WinSetPresParam(hWnd, PP_FONTNAMESIZE, 8L, (PVOID)"10.Helv"); if ( (ptf->flStyle = pcrst->flStyle) & DS_RAISED ) { ptf->fRaised = TRUE; ptf->lClrLeftTop = RGB_WHITE; ptf->lClrBottomRight = ptf->lClrBorder; } else { ptf->fRaised = FALSE; ptf->lClrLeftTop = ptf->lClrBorder; ptf->lClrBottomRight = RGB_WHITE; } if ( ((rcl.xRight = pcrst->cx) > 0L) && ((rcl.yTop = pcrst->cy) > 0L) ) { rcl.xLeft = rcl.yBottom = 0L; CalcSize(&rcl, ptf); } break; /* Control size changing, update the rectangle */ /* points for the 3D text control */ case WM_SIZE : if ( ((LONG)(SHORT)SHORT1FROMMP(mp2) > 0L) && ((LONG)(SHORT)SHORT2FROMMP(mp2) > 0L) ) { WinQueryWindowRect(hWnd, &rcl); CalcSize(&rcl, (PTEXTFIELD)WinQueryWindowPtr(hWnd, QWW_CDATA)); } else { ptf = (PTEXTFIELD)WinQueryWindowPtr(hWnd, QWW_CDATA); ptf->fDraw = FALSE; } break; /* Process window parameters setting */ case WM_SETWINDOWPARAMS : /* Get the address for the windows parameters */ /* structure */ pwprm = (PWNDPARAMS)PVOIDFROMMP(mp1); /* Check to see if the text for the control is */ /* being set */ if ( pwprm->fsStatus & WPM_TEXT ) { /* Text being set, get the address of the text */ /* string stored in the heap */ ptf = (PTEXTFIELD)WinQueryWindowPtr(hWnd, QWW_CDATA); /* Check to see if any text is being set */ if ( pwprm->cchText ) { if ( ptf->cText ) ptf->pszText = (PSZ)HeapRealloc(hHeap, ptf->pszText, (ULONG)(ptf->cText = (LONG)pwprm->cchText) + 1UL); else ptf->pszText = (PSZ)HeapMalloc(hHeap, (ULONG)(ptf->cText = (LONG)pwprm->cchText) + 1UL); /* Check to make sure that the text that is to */ /* be set is not greater than the memory */ /* allocated */ memcpy(ptf->pszText, pwprm->pszText, (UINT)pwprm->cchText); ptf->pszText[ptf->cText] = 0; } else { if ( ptf->cText ) HeapFree(hHeap, ptf->pszText); /* No text is being set, clear any existing text */ ptf->cText = 0L; } if ( ptf->fDraw ) WinReleasePS(hpsDrawText(WinGetPS(hWnd), ptf)); } break; /* Process window parameters query */ case WM_QUERYWINDOWPARAMS : /* Get the address for the windows parameters */ /* structure */ pwprm = (PWNDPARAMS)PVOIDFROMMP(mp1); /* Determine the type of query */ switch ( pwprm->fsStatus ) { /* Query type: get text */ case WPM_TEXT : /* Text being asked for, get the address of the */ /* text string stored in the heap */ ptf = (PTEXTFIELD)WinQueryWindowPtr(hWnd, QWW_CDATA); /* Copy the text from the string to the */ /* structure */ memcpy(pwprm->pszText, ptf->pszText, (UINT)(ptf->cText + 1)); break; /* Query type: get text length */ case WPM_CCHTEXT : /* Text length being asked for, get the address */ /* of the text string stored in the heap */ ptf = (PTEXTFIELD)WinQueryWindowPtr(hWnd, QWW_CDATA); /* Place the length the string within the */ /* structure */ pwprm->cchText = (ULONG)ptf->cText; break; /* Query type: get control data length */ case WPM_CBCTLDATA : /* Set the control data length to zero */ pwprm->cbCtlData = 0; break; default : return(WinDefWindowProc(hWnd, msg, mp1, mp2)); } break; /* Presentation parameters changed, record the */ /* change internally */ case WM_PRESPARAMCHANGED : /* Check to see if an individual presentation */ /* parameter has changed if so, get the new */ /* colour value for use by the painting routines */ if ( LONGFROMMP(mp1) && (LONGFROMMP(mp1) < PP_FONTNAMESIZE) ) { /* Get the address of the control info from the */ /* control's reserved memory */ ptf = (PTEXTFIELD)WinQueryWindowPtr(hWnd, QWW_CDATA); /* Get the new presentation parameter colour for */ /* the presentation parameter that has changed. */ /* Get the colour as a RGB value so as to be */ /* able to get an exact value and not an */ /* approximation which could happen if the */ /* presentation parameter was set as a RGB but */ /* queried as an index. When WinQueryPresParam */ /* returns a 0, it indicates that no */ /* presentation parameter set and the default */ /* colours should be used. */ switch ( LONGFROMMP(mp1) ) { case PP_FOREGROUNDCOLOR : case PP_FOREGROUNDCOLORINDEX : ptf->lClrText = lGetPresParam(hWnd, PP_FOREGROUNDCOLOR, PP_FOREGROUNDCOLORINDEX, SYSCLR_OUTPUTTEXT); break; case PP_BACKGROUNDCOLOR : case PP_BACKGROUNDCOLORINDEX : ptf->lClrBackground = lGetPresParam(hWnd, PP_BACKGROUNDCOLOR, PP_BACKGROUNDCOLORINDEX, SYSCLR_DIALOGBACKGROUND); break; case PP_BORDERCOLOR : case PP_BORDERCOLORINDEX : ptf->lClrBorder = lGetPresParam(hWnd, PP_BORDERCOLOR, PP_BORDERCOLORINDEX, SYSCLR_BUTTONDARK); break; } if ( ptf->fRaised ) ptf->lClrBottomRight = ptf->lClrBorder; else ptf->lClrLeftTop = ptf->lClrBorder; /* Invalidate the button to force to use the */ /* new colours just set or removed */ if ( ptf->fDraw ) WinReleasePS(hpsDrawText(WinGetPS(hWnd), ptf)); } else /* Determine if the Scheme Palette has forced a */ /* global scheme update in which case, check all */ /* of the presentation parameters to see if they */ /* have been added or removed */ if ( LONGFROMMP(mp1) == 0L ) /* Set up the colours that will be used within */ /* the painting of the control. */ SetDefaultColours(hWnd, ptf = (PTEXTFIELD)WinQueryWindowPtr(hWnd, QWW_CDATA)); break; /* Mouse being passed over the control, imply */ /* that the control is transparent to the */ /* system */ case WM_HITTEST : return(MRFROMLONG(HT_TRANSPARENT)); /* Erase control background */ case WM_ERASEBACKGROUND : return(MRFROMLONG(TRUE)); /* Paint the Control */ case WM_PAINT : /* Get the address of the text from the */ /* control's reserved memory */ ptf = (PTEXTFIELD)WinQueryWindowPtr(hWnd, QWW_CDATA); /* Before painting, check to see if the style of */ /* the control has changed. When it has changed */ /* make sure that the control internal values */ /* are updated to reflect any changes made. */ if ( ((flStyle = WinQueryWindowULong(hWnd, QWL_STYLE)) & (DT_MASK && SS_TEXT)) != (ptf->flStyle & (DT_MASK && SS_TEXT)) ) { if ( (ptf->flStyle = flStyle) & DS_RAISED ) { ptf->fRaised = TRUE; ptf->lClrLeftTop = RGB_WHITE; ptf->lClrBottomRight = ptf->lClrBorder; } else { ptf->fRaised = FALSE; ptf->lClrLeftTop = ptf->lClrBorder; ptf->lClrBottomRight = RGB_WHITE; } WinQueryWindowRect(hWnd, &rcl); CalcSize(&rcl, ptf); } /* Get the presentation space for the control */ /* and set the colour table to RGB mode */ if ( ptf->fDraw ) WinEndPaint(hpsDrawText(WinBeginPaint(hWnd, (HPS)NULL, (PRECTL)NULL), ptf)); break; /* Control being destroyed */ case WM_DESTROY : /* Release the heap allocated for use by the */ /* control */ ptf = (PTEXTFIELD)WinQueryWindowPtr(hWnd, QWW_CDATA); if ( ptf->cText ) HeapFree(hHeap, ptf->pszText); HeapFree(hHeap, ptf); break; /* Default message processing */ default : return(WinDefWindowProc(hWnd, msg, mp1, mp2)); } return(0L); }