/*********************************************************************** $Id: presparm.c 1009 2008-05-10 07:51:58Z stevenhl $ Edit presentation parameters Copyright (c) 1993-98 M. Kimes Copyright (c) 2006 Steven H.Levine 22 Jul 06 SHL Check more run time errors 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat 22 Nov 07 GKY Use CopyPresParams to fix presparam inconsistencies in menus 10 Dec 07 GKY Updated CopyPresParams to copy all parameter types 29 Feb 08 GKY Use xfree where appropriate ***********************************************************************/ #include #define INCL_WIN #define INCL_LONGLONG // dircnrs.h #include "fm3dll.h" // static PSZ pszSrcFile = __FILE__; #ifdef NEVER /* * this routine will fill a buffer with all defined window pres params * the PRESPARAMS structure returned is suitable to be passed as * pPresParams ie. WinCreateWindow(,,,,,,,,,,,, PVOID pPresParams) */ VOID StoreWndPresParams(HWND hwnd, CHAR * tagname, HINI prof) { PARAM *pparam; PRESPARAMS *ppresparams; if (!tagname || !*tagname || !prof) return; /* setup memory access */ ppresparams = (PRESPARAMS *) xmalloc(PP_MAXBUF, pszSrcFile, __LINE__); if (!ppresparams) return; ppresparams->cb = 0; /* no entries yet */ pparam = ppresparams->aparam; /* cast structure onto memory */ /* * query every possible presentation parameter... */ /* foreground color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_FOREGROUNDCOLOR, PP_FOREGROUNDCOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT); if (pparam->cb) { /* was the param found? */ ppresparams->cb += 12; /* used 12 bytes */ pparam = (PPARAM) (((ULONG) pparam) + 12); /* advance 12 bytes to next memory location */ } /* background color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_BACKGROUNDCOLOR, PP_BACKGROUNDCOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* hilited foreground color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_HILITEFOREGROUNDCOLOR, PP_HILITEFOREGROUNDCOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* hilited background color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_HILITEBACKGROUNDCOLOR, PP_HILITEBACKGROUNDCOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* disabled foreground color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_DISABLEDFOREGROUNDCOLOR, PP_DISABLEDFOREGROUNDCOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* disabled background color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_DISABLEDBACKGROUNDCOLOR, PP_DISABLEDBACKGROUNDCOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* border color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_BORDERCOLOR, PP_BORDERCOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* font name & size -- maximum 44 bytes (32 for face name, 4 for point size) + 8 for data */ pparam->cb = WinQueryPresParam(hwnd, PP_FONTNAMESIZE, 0, &pparam->id, 36, (PVOID) pparam->ab, QPF_NOINHERIT); if (pparam->cb) { ppresparams->cb += (pparam->cb + 8); pparam = (PPARAM) (((ULONG) pparam) + pparam->cb + 8); } /* active color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_ACTIVECOLOR, PP_ACTIVECOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* inactive color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_INACTIVECOLOR, PP_INACTIVECOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* active text foreground color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_ACTIVETEXTFGNDCOLOR, PP_ACTIVETEXTFGNDCOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT | QPF_PURERGBCOLOR); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* active text background color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_ACTIVETEXTBGNDCOLOR, PP_ACTIVETEXTBGNDCOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT | QPF_PURERGBCOLOR); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* inactive text foreground color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_INACTIVETEXTFGNDCOLOR, PP_INACTIVETEXTFGNDCOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT | QPF_PURERGBCOLOR); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* inactive text background color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_INACTIVETEXTBGNDCOLOR, PP_INACTIVETEXTBGNDCOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT | QPF_PURERGBCOLOR); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* shadow color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_SHADOW, 0, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* menu foreground color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_MENUFOREGROUNDCOLOR, PP_MENUFOREGROUNDCOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* menu background color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_MENUBACKGROUNDCOLOR, PP_MENUBACKGROUNDCOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* menu hilite foreground color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_MENUHILITEFGNDCOLOR, PP_MENUHILITEFGNDCOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* menu hilite background color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_MENUHILITEBGNDCOLOR, PP_MENUHILITEBGNDCOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* menu disabled foreground color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_MENUDISABLEDFGNDCOLOR, PP_MENUDISABLEDFGNDCOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } /* menu disabled background color -- takes 12 bytes */ pparam->cb = WinQueryPresParam(hwnd, PP_MENUDISABLEDBGNDCOLOR, PP_MENUDISABLEDBGNDCOLORINDEX, &pparam->id, sizeof(LONG), (PVOID) pparam->ab, QPF_NOINHERIT); if (pparam->cb) { ppresparams->cb += 12; pparam = (PPARAM) (((ULONG) pparam) + 12); } if (ppresparams->cb) PrfWriteProfileData(prof, appname, tagname, ppresparams, ppresparams->cb + 4); xfree(ppresparams, pszSrcFile, __LINE__); } #endif // NEVER VOID CopyPresParams(HWND target, HWND source) { /* * Copy presentation parameters of interest to us from one window * to another */ ULONG AttrFound, AttrValue[64], cbRetLen, x = 0, AttrName[] = { PP_FONTNAMESIZE, PP_FOREGROUNDCOLOR, PP_BACKGROUNDCOLOR, PP_HILITEBACKGROUNDCOLOR, PP_HILITEFOREGROUNDCOLOR, PP_BORDERCOLOR, PP_MENUFOREGROUNDCOLOR, PP_MENUBACKGROUNDCOLOR, PP_FOREGROUNDCOLORINDEX, PP_BACKGROUNDCOLORINDEX, PP_HILITEFOREGROUNDCOLORINDEX, PP_HILITEBACKGROUNDCOLORINDEX, PP_DISABLEDFOREGROUNDCOLOR, PP_DISABLEDBACKGROUNDCOLOR, PP_DISABLEDFOREGROUNDCOLORINDEX, PP_DISABLEDBACKGROUNDCOLORINDEX, PP_BORDERCOLOR, PP_BORDERCOLORINDEX, PP_FONTHANDLE, PP_ACTIVECOLOR, PP_ACTIVECOLORINDEX, PP_INACTIVECOLOR, PP_INACTIVECOLORINDEX, PP_ACTIVETEXTFGNDCOLOR, PP_ACTIVETEXTFGNDCOLORINDEX, PP_ACTIVETEXTBGNDCOLOR, PP_ACTIVETEXTBGNDCOLORINDEX, PP_INACTIVETEXTFGNDCOLOR, PP_INACTIVETEXTFGNDCOLORINDEX, PP_INACTIVETEXTBGNDCOLOR, PP_INACTIVETEXTBGNDCOLORINDEX, PP_SHADOW, PP_MENUFOREGROUNDCOLORINDEX, PP_MENUBACKGROUNDCOLORINDEX, PP_MENUHILITEFGNDCOLOR, PP_MENUHILITEFGNDCOLORINDEX, PP_MENUHILITEBGNDCOLOR, PP_MENUHILITEBGNDCOLORINDEX, PP_MENUDISABLEDFGNDCOLOR, PP_MENUDISABLEDFGNDCOLORINDEX, PP_MENUDISABLEDBGNDCOLOR, PP_MENUDISABLEDBGNDCOLORINDEX, PP_SHADOWTEXTCOLOR, PP_SHADOWTEXTCOLORINDEX, PP_SHADOWHILITEFGNDCOLOR, PP_SHADOWHILITEFGNDCOLORINDEX, PP_SHADOWHILITEBGNDCOLOR, PP_SHADOWHILITEBGNDCOLORINDEX, PP_ICONTEXTBACKGROUNDCOLOR, PP_ICONTEXTBACKGROUNDCOLORINDEX, PP_BORDERLIGHTCOLOR, PP_BORDERDARKCOLOR, PP_BORDER2COLOR, PP_BORDER2LIGHTCOLOR, PP_BORDER2DARKCOLOR, PP_BORDERDEFAULTCOLOR, PP_FIELDBACKGROUNDCOLOR, PP_BUTTONBACKGROUNDCOLOR, PP_BUTTONBORDERLIGHTCOLOR, PP_BUTTONBORDERDARKCOLOR, PP_ARROWCOLOR, PP_ARROWBORDERLIGHTCOLOR, PP_ARROWBORDERDARKCOLOR, PP_ARROWDISABLEDCOLOR, PP_CHECKLIGHTCOLOR, PP_CHECKMIDDLECOLOR, PP_CHECKDARKCOLOR, PP_PAGEFOREGROUNDCOLOR, PP_PAGEBACKGROUNDCOLOR, PP_MAJORTABFOREGROUNDCOLOR, PP_MAJORTABBACKGROUNDCOLOR, PP_MINORTABFOREGROUNDCOLOR, PP_MINORTABBACKGROUNDCOLOR, PP_USER, 0 }; while (AttrName[x]) { cbRetLen = WinQueryPresParam(source, AttrName[x], 0, &AttrFound, sizeof(AttrValue), &AttrValue, 0); //printf("%s %x\n", AttrValue, source); fflush(stdout); //printf("%x\n", AttrValue); fflush(stdout); if (cbRetLen) WinSetPresParam(target, AttrName[x], cbRetLen, (PVOID) AttrValue); x++; } //while } VOID SetPresParams(HWND hwnd, RGB2 * back, RGB2 * fore, RGB2 * border, CHAR * font) { if (font) WinSetPresParam(hwnd, PP_FONTNAMESIZE, strlen(font) + 1, (PVOID) font); if (back) WinSetPresParam(hwnd, PP_BACKGROUNDCOLOR, sizeof(RGB2), (PVOID) back); if (fore) WinSetPresParam(hwnd, PP_FOREGROUNDCOLOR, sizeof(RGB2), (PVOID) fore); if (border) WinSetPresParam(hwnd, PP_BORDERCOLOR, sizeof(RGB2), (PVOID) border); } VOID IfNoParam(HWND hwnd, CHAR * keyroot, ULONG size, PVOID attrvalue) { ULONG fsize = 0; CHAR s[81]; sprintf(s, "%s", keyroot); if (!PrfQueryProfileSize(fmprof, appname, s, &fsize) || !fsize) WinSetPresParam(hwnd, PP_FONTNAMESIZE, size, (PVOID) attrvalue); } VOID PresParamChanged(HWND hwnd, CHAR * keyroot, MPARAM mp1, MPARAM mp2) { ULONG AttrFound, AttrValue[64], cbRetLen; cbRetLen = WinQueryPresParam(hwnd, (ULONG) mp1, 0, &AttrFound, (ULONG) sizeof(AttrValue), &AttrValue, 0); if (cbRetLen) { CHAR s[133]; *s = 0; switch (AttrFound) { case PP_BACKGROUNDCOLOR: sprintf(s, "%s.Backgroundcolor", keyroot); break; case PP_FOREGROUNDCOLOR: sprintf(s, "%s.Foregroundcolor", keyroot); break; case PP_HILITEBACKGROUNDCOLOR: sprintf(s, "%s.Hilitebackgroundcolor", keyroot); break; case PP_HILITEFOREGROUNDCOLOR: sprintf(s, "%s.Hiliteforegroundcolor", keyroot); break; case PP_BORDERCOLOR: sprintf(s, "%s.Bordercolor", keyroot); break; case PP_FONTNAMESIZE: sprintf(s, "%s.Fontnamesize", keyroot); break; default: break; } if (*s) PrfWriteProfileData(fmprof, appname, s, (PVOID) AttrValue, cbRetLen); } } VOID RestorePresParams(HWND hwnd, CHAR * keyroot) { CHAR s[81]; ULONG AttrValue[64], size; size = sizeof(AttrValue); sprintf(s, "%s.Backgroundcolor", keyroot); if (PrfQueryProfileData(fmprof, appname, s, (PVOID) AttrValue, &size) && size) WinSetPresParam(hwnd, PP_BACKGROUNDCOLOR, size, (PVOID) AttrValue); size = sizeof(AttrValue); sprintf(s, "%s.Foregroundcolor", keyroot); if (PrfQueryProfileData(fmprof, appname, s, (PVOID) AttrValue, &size) && size) WinSetPresParam(hwnd, PP_FOREGROUNDCOLOR, size, (PVOID) AttrValue); size = sizeof(AttrValue); sprintf(s, "%s.Hilitebackgroundcolor", keyroot); if (PrfQueryProfileData(fmprof, appname, s, (PVOID) AttrValue, &size) && size) WinSetPresParam(hwnd, PP_HILITEBACKGROUNDCOLOR, size, (PVOID) AttrValue); size = sizeof(AttrValue); sprintf(s, "%s.Hiliteforegroundcolor", keyroot); if (PrfQueryProfileData(fmprof, appname, s, (PVOID) AttrValue, &size) && size) WinSetPresParam(hwnd, PP_HILITEFOREGROUNDCOLOR, size, (PVOID) AttrValue); size = sizeof(AttrValue); sprintf(s, "%s.Bordercolor", keyroot); if (PrfQueryProfileData(fmprof, appname, s, (PVOID) AttrValue, &size) && size) WinSetPresParam(hwnd, PP_BORDERCOLOR, size, (PVOID) AttrValue); size = sizeof(AttrValue); sprintf(s, "%s.Fontnamesize", keyroot); if (PrfQueryProfileData(fmprof, appname, s, (PVOID) AttrValue, &size) && size) WinSetPresParam(hwnd, PP_FONTNAMESIZE, size, (PVOID) AttrValue); } /** SavePresParams * Save the presentation parameters used by RestorePresParams */ VOID SavePresParams(HWND hwnd, CHAR *keyroot) { ULONG AttrFound, AttrValue[64], cbRetLen, x = 0, AttrName[] = { PP_FONTNAMESIZE, PP_FOREGROUNDCOLOR, PP_BACKGROUNDCOLOR, PP_HILITEBACKGROUNDCOLOR, PP_HILITEFOREGROUNDCOLOR, PP_BORDERCOLOR, 0 }; while (AttrName[x]) { cbRetLen = WinQueryPresParam(hwnd, AttrName[x], 0, &AttrFound, sizeof(AttrValue), &AttrValue, 0); if (cbRetLen){ CHAR s[133]; *s = 0; switch (AttrFound) { case PP_BACKGROUNDCOLOR: sprintf(s, "%s.Backgroundcolor", keyroot); break; case PP_FOREGROUNDCOLOR: sprintf(s, "%s.Foregroundcolor", keyroot); break; case PP_HILITEBACKGROUNDCOLOR: sprintf(s, "%s.Hilitebackgroundcolor", keyroot); break; case PP_HILITEFOREGROUNDCOLOR: sprintf(s, "%s.Hiliteforegroundcolor", keyroot); break; case PP_BORDERCOLOR: sprintf(s, "%s.Bordercolor", keyroot); break; case PP_FONTNAMESIZE: sprintf(s, "%s.Fontnamesize", keyroot); break; default: break; } if (*s) PrfWriteProfileData(fmprof, appname, s, (PVOID) AttrValue, cbRetLen); } x++; } //while } #pragma alloc_text(PRESPARAM,CopyPresParams,SetPresParams,IfNoParam) #pragma alloc_text(PRESPARAM,PresParamChanged,RestorePresParams,SavePresParams) #pragma alloc_text(PRESPARAM,StoreWndPresParams)