63 #include <sys/types.h> 65 #include <sys/param.h> 67 #include <netinet/in.h> 70 #include "file_help.h" 78 typedef struct _CONF_FILE_
81 int iOffsGlobal, iOffsLocal;
94 static const char *
const *argv_copy = NULL;
95 static int argc_copy = 0;
102 static void __settings_cleanup(
void);
108 static __inline__
void trim_ends(
const char **ppLeft,
const char **ppRight)
110 const char *p1=*ppLeft, *p2 = *ppRight;
111 while(p1 < p2 && *p1 <=
' ')
115 while(p2 > p1 && *(p2 - 1) <=
' ')
124 static __inline__
char * DoMakePath(
char *pSrc,
const char *szPath,
const char *szName,
const char *szExt)
129 for(p1=szPath; *p1; p1++)
134 if(*szPath && *(p1 - 1) !=
'/')
139 for(p1=szName; *p1; p1++)
144 for(p1=szExt; *p1; p1++)
161 argv_copy = (
const char *
const *)argv;
170 __settings_cleanup();
203 int CHGetResourceString_Old(Display *pDisplay,
const char *szIdentifier,
char *szData,
int cbData)
207 const char *p1, *p2, *p3;
208 int iRval = -1, iLen;
210 iLen = strlen(szIdentifier);
217 pScreen = XDefaultScreenOfDisplay((Display *)pDisplay);
222 pData = XScreenResourceString(pScreen);
231 pData = XResourceManagerString((Display *)pDisplay);
243 while(*p1 && *p1 !=
'\n')
249 while(p3 < p1 && *p3 !=
':')
256 if(iLen == (p3 - p2) &&
257 !strncasecmp(p2, szIdentifier, iLen))
260 while(p3 < p1 && *p3 <=
' ')
265 if((p1 - p3) < (cbData - 1))
269 memcpy(szData, p3, iRval);
275 while(*p1 && *p1 <=
' ')
283 if(szIdentifier[0] !=
'*' || !szIdentifier[1])
292 while(*p1 && *p1 !=
'\n')
298 while(p3 < p1 && *p3 !=
':')
305 if((p2 + iLen - 1) <= p3)
307 if(!strncasecmp(p3 - iLen + 1, szIdentifier + 1, iLen - 1) &&
308 (p2 == (p3 - iLen + 1) || *(p3 - iLen) ==
'.'))
311 while(p3 < p1 && *p3 <=
' ')
316 if((p1 - p3) < (cbData - 1))
320 memcpy(szData, p3, iRval);
327 while(*p1 && *p1 <=
' ')
335 static const char * TranslateColorRequest(
const char *szIdentifier)
339 if(szIdentifier[0] !=
'*')
343 if(!strcmp(szIdentifier,
"fg_color") ||
344 !strcmp(szIdentifier,
"bg_color") ||
345 !strcmp(szIdentifier,
"text_color") ||
346 !strcmp(szIdentifier,
"base_color") ||
347 !strcmp(szIdentifier,
"selected_fg_color") ||
348 !strcmp(szIdentifier,
"selected_bg_color") ||
349 !strcmp(szIdentifier,
"tooltip_fg_color") ||
350 !strcmp(szIdentifier,
"tooltip_bg_color"))
366 if(!strcmp(szIdentifier,
"*Menu.activeForeground"))
368 return "selected_fg_color";
371 if(!strcmp(szIdentifier,
"*Menu.activeBackground"))
373 return "selected_bg_color";
378 if(!strcmp(szIdentifier,
"*Text.foreground") ||
379 !strcmp(szIdentifier,
"*List.foreground") ||
380 !strcmp(szIdentifier,
"*Combo.foreground"))
385 if(!strcmp(szIdentifier,
"*Text.background") ||
386 !strcmp(szIdentifier,
"*List.background") ||
387 !strcmp(szIdentifier,
"*Combo.background"))
395 iLen = strlen(szIdentifier);
398 (iLen == 11 || szIdentifier[iLen - 11] ==
'.') &&
399 !strcmp(szIdentifier + iLen - 10,
"foreground"))
405 (iLen == 11 || szIdentifier[iLen - 11] ==
'.') &&
406 !strcmp(szIdentifier + iLen - 10,
"background"))
412 (iLen == 7 || szIdentifier[iLen - 7] ==
'.') &&
413 !strcmp(szIdentifier + iLen - 6,
"border"))
419 (iLen == 12 || szIdentifier[iLen - 12] ==
'.') &&
420 !strcmp(szIdentifier + iLen - 11,
"borderColor"))
426 (iLen == 17 || szIdentifier[iLen - 17] ==
'.') &&
427 !strcmp(szIdentifier + iLen - 16,
"activeForeground"))
433 (iLen == 17 || szIdentifier[iLen - 17] ==
'.') &&
434 !strcmp(szIdentifier + iLen - 16,
"activeBackground"))
440 (iLen == 17 || szIdentifier[iLen - 17] ==
'.') &&
441 !strcmp(szIdentifier + iLen - 16,
"selectForeground"))
443 return "selected_fg_color";
447 (iLen == 17 || szIdentifier[iLen - 17] ==
'.') &&
448 !strcmp(szIdentifier + iLen - 16,
"selectBackground"))
450 return "selected_bg_color";
454 (iLen == 20 || szIdentifier[iLen - 20] ==
'.') &&
455 !strcmp(szIdentifier + iLen - 19,
"highlightForeground"))
457 return "selected_fg_color";
461 (iLen == 20 || szIdentifier[iLen - 20] ==
'.') &&
462 !strcmp(szIdentifier + iLen - 19,
"highlightBackground"))
464 return "selected_bg_color";
509 const char *pTemp = TranslateColorRequest(szIdentifier);
519 int iLen0 = strlen(pTemp);
529 while(*p1 && *p1 !=
'\n')
536 if(!memcmp(p2, pTemp, iLen0) && p2[iLen0] ==
':')
547 memcpy(szData, p2, iLen0);
569 iRval = snprintf(szData, cbData,
"%d", pXS->
uData.
iData);
598 return CHGetResourceString_Old(pDisplay, szIdentifier, szData, cbData);
612 while(tbuf[0] && tbuf[0] <=
' ')
614 strcpy(tbuf, tbuf + 1);
646 char *p1, *p2, *p3, *p4, *p6;
651 static const char szGlobalPath[] = GLOBAL_PATH;
652 static const char szGlobalXPath[] = GLOBAL_XPATH;
653 static const char szLocalPath[] = LOCAL_PATH;
654 static const char szConf[] =
".conf";
655 char szLocalPath0[PATH_MAX];
660 pRval = (CONF_FILE *)
WBAlloc(
sizeof(*pRval) + strlen(szAppName) * 4 +
sizeof(szGlobalPath)
661 +
sizeof(szGlobalXPath) +
sizeof(szLocalPath) + 16 + PATH_MAX * 2);
667 bzero(pRval,
sizeof(*pRval));
671 p1 = (
char *)pRval +
sizeof(*pRval);
674 p2 = DoMakePath(p1, szGlobalPath, szAppName, szConf);
675 p3 = DoMakePath(p2, szGlobalXPath, szAppName, szConf);
689 strcpy(szLocalPath0, szLocalPath);
690 if(!szLocalPath0[0] || szLocalPath0[strlen(szLocalPath0)-1] !=
'/')
692 strcat(szLocalPath0,
"/");
695 strncat(szLocalPath0, szAppName,
sizeof(szLocalPath0) - strlen(szLocalPath0) - 1);
705 strncpy(szLocalPath0, p4,
sizeof(szLocalPath0));
709 if(szLocalPath0[strlen(szLocalPath0) - 1] !=
'/')
711 strcat(szLocalPath0,
"/");
714 p4 = DoMakePath(p3, szLocalPath0, LOCAL_CONF_NAME, szConf);
734 if(!stat(p1, &st) && S_ISREG(st.st_mode))
738 pRval->iGlobal = open(p1,O_RDWR);
745 if(pRval->iGlobal == -1)
747 pRval->iGlobal = open(p1,O_RDONLY);
751 if(pRval->iGlobal != -1)
753 pRval->iOffsGlobal = (int)(p1 - (
char *)pRval);
755 else if(!stat(p2, &st) && S_ISREG(st.st_mode))
759 pRval->iGlobal = open(p2,O_RDWR);
765 if(pRval->iGlobal == -1)
767 pRval->iGlobal = open(p2,O_RDONLY);
769 if(pRval->iGlobal != -1)
771 pRval->iOffsGlobal = (int)(p2 - (
char *)pRval);
779 if(!stat(p3, &st) && S_ISREG(st.st_mode))
781 pRval->iLocal = open(p3,O_RDWR);
785 pRval->iLocal = open(p3,O_CREAT|O_RDWR,0644);
788 if(pRval->iLocal != -1)
790 pRval->iOffsLocal = (int)(p3 - (
char *)pRval);
796 if(!stat(p4, &st) && S_ISREG(st.st_mode))
798 pRval->iLocal = open(p4,O_RDWR);
802 pRval->iLocal = open(p4,O_CREAT|O_RDWR,0644);
805 if(pRval->iLocal != -1)
807 pRval->iOffsLocal = (int)(p4 - (
char *)pRval);
814 pRval->iOffsLocal = 0;
819 if(pRval->iLocal != -1)
833 if(pRval->iGlobal != -1)
852 CONF_FILE *pTemp = (CONF_FILE *)pFile;
859 if(pTemp->iLocal != -1)
866 close(pTemp->iLocal);
870 if(pTemp->iGlobal != -1)
877 close(pTemp->iGlobal);
884 CONF_FILE *pTemp = (CONF_FILE *)pFile;
909 static void __get_line_strip_comments__(
const char **ppStart,
const char **ppEnd)
911 const char *p1 = *ppStart, *p2 = *ppEnd;
914 while(p1 < p2 && *p1 <=
' ')
920 *ppStart = *ppEnd = p2;
945 while(p2 > p1 && *(p2 - 1) <=
' ')
953 static void __find_section__(
void *hFile,
const char *szSection,
954 const char **ppSection,
const char **ppEndSection)
957 const char *p1, *p2, *pSection, *pEndSection;
958 CONF_FILE *pTemp = (CONF_FILE *)hFile;
960 *ppSection = pSection = NULL;
961 *ppEndSection = pEndSection = NULL;
964 ((!pTemp->pfhbL || !pTemp->pfhbL->ppLineBuf) &&
965 (!pTemp->pfhbG || !pTemp->pfhbG->ppLineBuf)))
970 iSectionLen = strlen(szSection);
974 for(i1=0; i1 < pTemp->pfhbL->lLineCount; i1++)
977 p1 = pTemp->pfhbL->ppLineBuf[i1];
978 p2 = pTemp->pfhbL->ppLineBuf[i1 + 1];
981 p2 = pTemp->pfhbL->cData + pTemp->pfhbL->lBufferCount;
984 __get_line_strip_comments__(&p1, &p2);
986 if((p2 - p1) >= iSectionLen + 2 && *p1 ==
'[' && *(p2 - 1) ==
']')
991 if((p2 - p1) == iSectionLen && !strncasecmp(p1, szSection, iSectionLen))
993 pSection = pTemp->pfhbL->ppLineBuf[i1 + 1];
1003 for(i1++; i1 < pTemp->pfhbL->lLineCount; i1++)
1006 p1 = pTemp->pfhbL->ppLineBuf[i1];
1007 p2 = pTemp->pfhbL->ppLineBuf[i1 + 1];
1010 p2 = pTemp->pfhbL->cData + pTemp->pfhbL->lBufferCount;
1013 __get_line_strip_comments__(&p1, &p2);
1015 if((p2 - p1) > 2 && *p1 ==
'[' && *(p2 - 1) ==
']')
1017 pEndSection = pTemp->pfhbL->ppLineBuf[i1];
1024 pEndSection = pTemp->pfhbL->cData + pTemp->pfhbL->lBufferCount;
1028 *ppSection = pSection;
1029 *ppEndSection = pEndSection;
1033 if(pTemp->pfhbG && !*ppSection)
1035 *ppSection = pSection = NULL;
1036 *ppEndSection = pEndSection = NULL;
1038 for(i1=0; i1 < pTemp->pfhbG->lLineCount; i1++)
1041 p1 = pTemp->pfhbG->ppLineBuf[i1];
1042 p2 = pTemp->pfhbG->ppLineBuf[i1 + 1];
1045 p2 = pTemp->pfhbG->cData + pTemp->pfhbG->lBufferCount;
1048 __get_line_strip_comments__(&p1, &p2);
1050 if((p2 - p1) >= iSectionLen + 2 && *p1 ==
'[' && *(p2 - 1) ==
']')
1054 trim_ends(&p1, &p2);
1055 if((p2 - p1) == iSectionLen && !strncasecmp(p1, szSection, iSectionLen))
1057 pSection = pTemp->pfhbG->ppLineBuf[i1 + 1];
1071 for(i1++; i1 < pTemp->pfhbG->lLineCount; i1++)
1074 p1 = pTemp->pfhbG->ppLineBuf[i1];
1075 p2 = pTemp->pfhbG->ppLineBuf[i1 + 1];
1078 p2 = pTemp->pfhbG->cData + pTemp->pfhbG->lBufferCount;
1081 __get_line_strip_comments__(&p1, &p2);
1083 if((p2 - p1) > 2 && *p1 ==
'[' && *(p2 - 1) ==
']')
1085 pEndSection = pTemp->pfhbG->ppLineBuf[i1];
1092 pEndSection = pTemp->pfhbG->cData + pTemp->pfhbG->lBufferCount;
1096 *ppSection = pSection;
1097 *ppEndSection = pEndSection;
1106 #if 0 // RESERVED (not currently used) 1108 static void __find_global_section__(
void *hFile,
const char *szSection,
1109 const char **ppSection,
const char **ppEndSection)
1111 int i1, iSectionLen;
1112 const char *p1, *p2, *pSection, *pEndSection;
1113 CONF_FILE *pTemp = (CONF_FILE *)hFile;
1115 *ppSection = pSection = NULL;
1116 *ppEndSection = pEndSection = NULL;
1118 if(!pTemp || !pTemp->pfhbG || !pTemp->pfhbG->ppLineBuf)
1123 iSectionLen = strlen(szSection);
1125 for(i1=0; i1 < pTemp->pfhbG->lLineCount; i1++)
1128 p1 = pTemp->pfhbG->ppLineBuf[i1];
1129 p2 = pTemp->pfhbG->ppLineBuf[i1 + 1];
1131 p2 = pTemp->pfhbG->cData + pTemp->pfhbG->lBufferCount;
1133 __get_line_strip_comments__(&p1, &p2);
1135 if((p2 - p1) >= iSectionLen + 2 && *p1 ==
'[' && *(p2 - 1) ==
']')
1139 trim_ends(&p1, &p2);
1140 if((p2 - p1) == iSectionLen && !strncasecmp(p1, szSection, iSectionLen))
1142 pSection = pTemp->pfhbG->ppLineBuf[i1 + 1];
1153 for(; i1 < pTemp->pfhbG->lLineCount; i1++)
1156 p1 = pTemp->pfhbG->ppLineBuf[i1];
1157 p2 = pTemp->pfhbG->ppLineBuf[i1 + 1];
1159 p2 = pTemp->pfhbG->cData + pTemp->pfhbG->lBufferCount;
1161 __get_line_strip_comments__(&p1, &p2);
1163 if((p2 - p1) >= iSectionLen + 2 && *p1 ==
'[' && *(p2 - 1) ==
']')
1165 pEndSection = pTemp->pfhbG->ppLineBuf[i1];
1171 pEndSection = pTemp->pfhbG->cData + pTemp->pfhbG->lBufferCount;
1174 *ppSection = pSection;
1175 *ppEndSection = pEndSection;
1181 static int __enum_conf_file_sections__(
void *hFile,
char *szData,
int cbData)
1184 const char *p1, *p2;
1185 CONF_FILE *pTemp = (CONF_FILE *)hFile;
1187 if(!pTemp || !pTemp->pfhbL || !pTemp->pfhbL->ppLineBuf)
1193 for(i1=0, i2=0; i1 < pTemp->pfhbL->lLineCount; i1++)
1196 p1 = pTemp->pfhbL->ppLineBuf[i1];
1197 p2 = pTemp->pfhbL->ppLineBuf[i1 + 1];
1200 p2 = pTemp->pfhbL->cData + pTemp->pfhbL->lBufferCount;
1203 __get_line_strip_comments__(&p1, &p2);
1207 if((p2 - p1) >= 2 && *p1 ==
'[' && *(p2 - 1) ==
']')
1211 trim_ends(&p1, &p2);
1214 i2 += (p2 - p1) + 1;
1215 if(cbData >= (p2 - p1) + 2)
1218 memcpy(szData, p1, p2 - p1);
1219 szData[p2 - p1] = 0;
1220 szData[p2 - p1 + 1] = 0;
1222 szData += (p2 - p1) + 1;
1223 cbData -= (p2 - p1) + 1;
1243 const char *szIdentifier,
char *szData,
int cbData)
1245 int i1, i2, iIdentifierLen;
1246 const char *p1, *p2, *pSection, *pEndSection;
1247 CONF_FILE *pTemp = (CONF_FILE *)hFile;
1251 if(!pTemp || ((!pTemp->pfhbL || !pTemp->pfhbL->ppLineBuf)
1252 && (!pTemp->pfhbG || !pTemp->pfhbG->ppLineBuf)))
1260 WB_ERROR_PRINT(
"%s - 'linebuf' problem - %p %p %p %p\n", __FUNCTION__,
1261 pTemp->pfhbL, pTemp->pfhbL->ppLineBuf,
1262 pTemp->pfhbG, pTemp->pfhbG->ppLineBuf);
1268 if(!szSection || !*szSection)
1270 return __enum_conf_file_sections__(hFile, szData, cbData);
1273 iIdentifierLen = strlen(szIdentifier);
1275 __find_section__(hFile, szSection, &pSection, &pEndSection);
1278 WB_ERROR_PRINT(
"TEMPORARY: %s - did not find section \"%s\"\n", __FUNCTION__, szSection);
1285 pTemp->pfhbL->ppLineBuf &&
1286 pTemp->pfhbL->lLineCount > 0 &&
1287 pTemp->pfhbL->ppLineBuf[0] < pSection &&
1288 pTemp->pfhbL->ppLineBuf[pTemp->pfhbL->lLineCount - 1] >= pSection)
1290 pFHB = pTemp->pfhbL;
1292 else if(pTemp->pfhbG &&
1293 pTemp->pfhbG->ppLineBuf &&
1294 pTemp->pfhbG->lLineCount > 0 &&
1295 pTemp->pfhbG->ppLineBuf[0] < pSection &&
1296 pTemp->pfhbG->ppLineBuf[pTemp->pfhbG->lLineCount - 1] >= pSection)
1298 pFHB = pTemp->pfhbG;
1321 while(p1 < p2 && *p1 <=
' ')
1331 if(p2 - p1 > iIdentifierLen &&
1332 !strncasecmp(szIdentifier, p1, iIdentifierLen) &&
1333 p1[iIdentifierLen] ==
'=')
1336 p1 += iIdentifierLen + 1;
1337 if(p2 > p1 && *(p2 - 1) ==
'\n')
1339 if(p2 > (p1 + 1) && *(p2 - 1) ==
'\n' && *(p2 - 2) ==
'\r')
1354 memcpy(szData, p1, i2);
1377 const char *szIdentifier,
const char *szData)
1379 int i1, i2, iSectionLine, iSectionLen, iIdentifierLen, iDataLen;
1381 const char *p1, *p2, *pSection, *pEndSection;
1382 CONF_FILE *pTemp = (CONF_FILE *)hFile;
1387 ((!pTemp->pfhbL || !pTemp->pfhbL->ppLineBuf) &&
1388 (!pTemp->pfhbG || !pTemp->pfhbG->ppLineBuf)))
1392 if(!szSection || !*szSection)
1397 iIdentifierLen = strlen(szIdentifier);
1398 iDataLen = szData ? strlen(szData) : -1;
1400 __find_section__(hFile, szSection, &pSection, &pEndSection);
1404 pTemp->pfhbL->ppLineBuf &&
1405 pTemp->pfhbL->lLineCount > 0 &&
1406 pTemp->pfhbL->ppLineBuf[0] < pSection &&
1407 pTemp->pfhbL->ppLineBuf[pTemp->pfhbL->lLineCount - 1] >= pSection)
1409 pFHB = pTemp->pfhbL;
1411 else if(pTemp->pfhbG &&
1412 pTemp->pfhbG->ppLineBuf &&
1413 pTemp->pfhbG->lLineCount > 0 &&
1414 pTemp->pfhbG->ppLineBuf[0] < pSection &&
1415 pTemp->pfhbG->ppLineBuf[pTemp->pfhbG->lLineCount - 1] >= pSection)
1418 pFHB = pTemp->pfhbG;
1451 while(p1 < p2 && *p1 <=
' ')
1461 if(p2 - p1 > iIdentifierLen &&
1462 !strncasecmp(szIdentifier, p1, iIdentifierLen) &&
1463 p1[iIdentifierLen] ==
'=')
1472 pBuf = (
char *)
WBAlloc(iDataLen + iIdentifierLen + 4);
1482 sprintf(pBuf,
"%s=%s", szIdentifier, szData);
1484 if(pFHB == pTemp->pfhbG)
1488 else if(pFHB == pTemp->pfhbL)
1515 pBuf = (
char *)
WBAlloc(iDataLen + iIdentifierLen + 4);
1527 while(i1 > iSectionLine)
1530 if(p1 && *p1 !=
'\r' && *p1 !=
'\n')
1538 sprintf(pBuf,
"%s=%s", szIdentifier, szData);
1545 else if(pTemp->pfhbG)
1560 iSectionLen = strlen(szSection);
1563 i1 = iSectionLen + 4;
1564 if(i1 < (iDataLen + iIdentifierLen + 2))
1566 i1 = iDataLen + iIdentifierLen + 2;
1569 pBuf = (
char *)
WBAlloc(i1 + 2);
1578 sprintf(pBuf,
"[%s]\n", szSection);
1583 i2 = pTemp->pfhbL->lLineCount;
1585 if(i2 >= pTemp->pfhbL->lLineCount)
1589 WB_ERROR_PRINT(
"%s - FBInsertLineIntoFileBuf failed (a)\n", __FUNCTION__);
1594 sprintf(pBuf,
"%s=%s\n", szIdentifier, szData);
1596 i2 = pTemp->pfhbL->lLineCount;
1600 if(i2 >= pTemp->pfhbL->lLineCount)
1602 WB_ERROR_PRINT(
"%s - FBInsertLineIntoFileBuf failed (b)\n", __FUNCTION__);
1606 else if(pTemp->pfhbG)
1608 i2 = pTemp->pfhbG->lLineCount;
1610 if(i2 >= pTemp->pfhbG->lLineCount)
1613 WB_ERROR_PRINT(
"%s - FBInsertLineIntoFileBuf failed (c)\n", __FUNCTION__);
1617 sprintf(pBuf,
"%s=%s\n", szIdentifier, szData);
1619 i2 = pTemp->pfhbG->lLineCount;
1623 if(i2 >= pTemp->pfhbG->lLineCount)
1625 WB_ERROR_PRINT(
"%s - FBInsertLineIntoFileBuf failed (d)\n", __FUNCTION__);
1632 WB_ERROR_PRINT(
"%s - pfhbG and pfhbL are both NULL\n", __FUNCTION__);
1645 if((iLen =
CHGetConfFileString(hFile, szSection, szIdentifier, tbuf,
sizeof(tbuf) - 1)) > 0)
1648 while(tbuf[0] && tbuf[0] <=
' ')
1650 strcpy(tbuf, tbuf + 1);
1678 p1 = tbuf +
sizeof(tbuf) - 1;
1683 *(--p1) = (
char)(
'0' + iData % 10);
1687 }
while(p1 > (tbuf + 1) && iData);
1712 typedef struct __XSETTINGS_HEADER__
1714 char cByteOrder, cUnused[3];
1715 unsigned int uiSerial;
1716 unsigned int nSettings;
1717 } __attribute__((__packed__)) XSETTINGS_HEADER;
1719 typedef struct __XSETTINGS_DATAHDR__
1721 char cSettingType, cUnused;
1722 unsigned short wNameLen;
1725 } __attribute__((__packed__)) XSETTINGS_DATAHDR;
1729 typedef struct __XSETTINGS_DATA_INT__
1731 unsigned int uiValue;
1732 } XSETTINGS_DATA_INT;
1734 typedef struct __XSETTINGS_DATA_STRING__
1736 unsigned int cbLength;
1738 } __attribute__((__packed__)) XSETTINGS_DATA_STRING;
1753 static char the_colors[]=
"fg_color:#000000000000\nbg_color:#ededececebeb\ntext_color:#1a1a1a1a1a1a\nbase_color:#ffffffffffff\n" 1754 "selected_fg_color:#ffffffffffff\nselected_bg_color:#2020abab2020\ntooltip_fg_color:#000000000000\n" 1755 "tooltip_bg_color:#f5f5f5f5b5b5";
1763 .szData = (
char *)the_colors
1768 if(!pXSettings || pXSettings->
pDisplay != pDisplay)
1775 for(i1=0; i1 < nSettings; i1++)
1777 if(!strcasecmp(szSettingName, pXSettings->
aData[i1].
szName))
1779 if(!strcasecmp(szSettingName,
"Gtk/ColorScheme") &&
1783 return &defcolorscheme;
1786 return pXSettings->
aData + i1;
1792 if(!strcasecmp(szSettingName,
"Gtk/ColorScheme"))
1793 return &defcolorscheme;
1804 int i1, iLen, nLen, iFormat, nItems, cbSize, cbNameLen, cbStrLen;
1807 unsigned long cbLeft, nI;
1808 char *pCur, *pDataEnd, *pXSCur, *pXSEnd;
1809 Atom a_XSETTINGS_Sn, a_XSETTINGS_SETTINGS, aType;
1811 XSETTINGS_HEADER *pHdr;
1812 XSETTINGS_DATAHDR *pDHdr;
1820 a_XSETTINGS_Sn = XInternAtom(pDisplay,
"_XSETTINGS_S0", False);
1821 a_XSETTINGS_SETTINGS = XInternAtom(pDisplay,
"_XSETTINGS_SETTINGS", False);
1825 XGrabServer(pDisplay);
1826 wOwn = XGetSelectionOwner(pDisplay, a_XSETTINGS_Sn);
1830 XUngrabServer(pDisplay);
1831 WB_ERROR_PRINT(
"%s:%d - %s unable to retrieve XSETTINGS data (no owner)\n",
1832 __FILE__, __LINE__, __FUNCTION__);
1844 if(XGetWindowProperty(pDisplay, wOwn, a_XSETTINGS_SETTINGS, 0, 0, False,
1845 AnyPropertyType, &aType, &iFormat, &nI, &cbLeft, (
unsigned char **)&pData))
1847 XUngrabServer(pDisplay);
1848 WB_ERROR_PRINT(
"%s:%d - %s unable to retrieve XSETTINGS data (XSETTINGS_SETTINGS)(a)\n",
1849 __FILE__, __LINE__, __FUNCTION__);
1863 XUngrabServer(pDisplay);
1864 WB_ERROR_PRINT(
"%s:%d - %s unable to retrieve XSETTINGS data (INCR)\n",
1865 __FILE__, __LINE__, __FUNCTION__);
1869 nLen = iLen = cbLeft;
1875 else if(iFormat == 32)
1882 if(XGetWindowProperty(pDisplay, wOwn, a_XSETTINGS_SETTINGS, 0, nLen, False,
1883 AnyPropertyType, &aType, &iFormat, &nI, &cbLeft, (
unsigned char **)&pData)
1886 XUngrabServer(pDisplay);
1887 WB_ERROR_PRINT(
"%s:%d - %s unable to retrieve XSETTINGS data (XSETTINGS_SETTINGS)(b)\n",
1888 __FILE__, __LINE__, __FUNCTION__);
1892 XUngrabServer(pDisplay);
1897 if(aType != a_XSETTINGS_SETTINGS)
1902 __FILE__, __LINE__, __FUNCTION__, (
int)aType, p1);
1915 __FILE__, __LINE__, __FUNCTION__);
1921 pHdr = (XSETTINGS_HEADER *)pData;
1922 pCur = (
char *)(pHdr + 1);
1923 pDataEnd = (
char *)pData + iLen;
1925 if(pCur >= pDataEnd)
1927 WB_ERROR_PRINT(
"%s:%d - %s XSETTINGS data corrupt (data buffer too small)\n",
1928 __FILE__, __LINE__, __FUNCTION__);
1937 if(pHdr->cByteOrder)
1939 nItems = htonl(pHdr->nSettings);
1943 nItems = pHdr->nSettings;
1946 for(i1=0; i1 < nItems; i1++)
1948 pDHdr = (XSETTINGS_DATAHDR *)pCur;
1955 if(((
char *)&(pDHdr->wNameLen) +
sizeof(pDHdr->wNameLen)) > pDataEnd)
1957 WB_ERROR_PRINT(
"%s:%d - %s XSETTINGS data corrupt (data buffer too small) %p %p %d of %d\n",
1958 __FILE__, __LINE__, __FUNCTION__, pCur, pDataEnd, i1, nItems);
1964 cbNameLen = pHdr->cByteOrder ? htons(pDHdr->wNameLen) : pDHdr->wNameLen;
1966 if(pDHdr->szName + cbNameLen + 1 >= pDataEnd)
1968 WB_ERROR_PRINT(
"%s:%d - %s XSETTINGS data corrupt (data buffer too small)\n",
1969 __FILE__, __LINE__, __FUNCTION__);
1974 cbSize +=
sizeof(
CHXSetting) + cbNameLen + 1;
1975 bzero(tbuf,
sizeof(tbuf));
1976 if(cbNameLen <
sizeof(tbuf))
1978 memcpy(tbuf, pDHdr->szName, cbNameLen);
1982 memcpy(tbuf, pDHdr->szName,
sizeof(tbuf) - 1);
1985 pCur = (
char *)&(pDHdr->szName) + ((cbNameLen + 7) & (~3));
1987 switch(pDHdr->cSettingType)
1992 cbSize +=
sizeof(XSETTINGS_DATA_INT);
1993 pCur +=
sizeof(XSETTINGS_DATA_INT);
2005 if(pCur +
sizeof(XSETTINGS_DATA_STRING) -
sizeof(((XSETTINGS_DATA_STRING *)0)->szData)
2008 WB_ERROR_PRINT(
"%s:%d - %s XSETTINGS data corrupt (data buffer too small)\n",
2009 __FILE__, __LINE__, __FUNCTION__);
2014 cbStrLen = pHdr->cByteOrder ? htons(((XSETTINGS_DATA_STRING *)pCur)->cbLength) : ((XSETTINGS_DATA_STRING *)pCur)->cbLength;
2022 cbSize +=
sizeof(XSETTINGS_DATA_STRING) -
sizeof(((XSETTINGS_DATA_STRING *)0)->szData) + cbStrLen + 1;
2023 pCur +=
sizeof(XSETTINGS_DATA_STRING) -
sizeof(((XSETTINGS_DATA_STRING *)0)->szData)
2024 + ((cbStrLen + 3) & (~3));
2028 cbSize +=
sizeof(XSETTINGS_DATA_STRING) -
sizeof(((XSETTINGS_DATA_STRING *)0)->szData);
2029 pCur +=
sizeof(XSETTINGS_DATA_STRING) -
sizeof(((XSETTINGS_DATA_STRING *)0)->szData);
2039 WB_ERROR_PRINT(
"%s:%d - %s XSETTINGS data corrupt (data buffer too small) %p %p %d of %d\n",
2040 __FILE__, __LINE__, __FUNCTION__, pCur, pDataEnd, i1, nItems);
2048 pCur = (
char *)(pHdr + 1);
2061 __FILE__, __LINE__, __FUNCTION__);
2068 pXSettings->
uiSerial = pHdr->cByteOrder ? htonl(pHdr->uiSerial) : pHdr->uiSerial;
2070 pXSEnd = (
char *)pXSettings + cbSize +
sizeof(
CHXSettings);
2071 pXSCur = (
char *)(pXSettings->
aData + nItems);
2073 for(i1=0; i1 < nItems; i1++)
2075 XSETTINGS_DATAHDR *pDHdr = (XSETTINGS_DATAHDR *)pCur;
2076 int cbNameLen = pHdr->cByteOrder ? htons(pDHdr->wNameLen) : pDHdr->wNameLen;
2079 if(pXSCur + cbNameLen + 1 > pXSEnd)
2081 WB_ERROR_PRINT(
"%s:%d - %s CHXSettings data corrupt (data buffer too small)\n",
2082 __FILE__, __LINE__, __FUNCTION__);
2093 memcpy(pXSCur, pDHdr->szName, cbNameLen);
2094 pXSCur += cbNameLen;
2097 pCur = (
char *)&(pDHdr->szName) + ((cbNameLen + 7) & (~3));
2099 pXS->
iType = pDHdr->cSettingType;
2101 switch(pDHdr->cSettingType)
2106 pXS->
uData.
iData = ((XSETTINGS_DATA_INT *)pCur)->uiValue;
2108 pCur +=
sizeof(XSETTINGS_DATA_INT);
2128 cbStrLen = pHdr->cByteOrder ? htons(((XSETTINGS_DATA_STRING *)pCur)->cbLength) : ((XSETTINGS_DATA_STRING *)pCur)->cbLength;
2129 pXS->
iLen = cbStrLen;
2133 if(pXSCur + cbStrLen + 1 > pXSEnd)
2135 WB_ERROR_PRINT(
"%s:%d - %s CHXSettings data corrupt (data buffer too small)\n",
2136 __FILE__, __LINE__, __FUNCTION__);
2146 memcpy(pXSCur, ((XSETTINGS_DATA_STRING *)pCur)->szData, cbStrLen);
2151 pCur +=
sizeof(XSETTINGS_DATA_STRING) -
sizeof(((XSETTINGS_DATA_STRING *)0)->szData)
2152 + ((cbStrLen + 3) & (~3));
2158 pCur +=
sizeof(XSETTINGS_DATA_STRING) -
sizeof(((XSETTINGS_DATA_STRING *)0)->szData);
2175 static void __settings_cleanup(
void)
2195 #define DEFAULT_DOUBLE_CLICK_TIME 250 2196 #define DEFAULT_DOUBLE_CLICK_DISTANCE 5 2197 #define DEFAULT_DRAG_THRESHOLD 9 2198 #define DEFAULT_CURSOR_BLINK (!0) 2199 #define DEFAULT_CURSOR_BLINK_TIME 1200 2204 static int iFirstTime = 1, iRval = DEFAULT_DOUBLE_CLICK_TIME;
2205 static unsigned int uiSerial;
2223 if(pDisplay && pDisplay != pXSettings->
pDisplay)
2225 return DEFAULT_DOUBLE_CLICK_TIME;
2243 static int iFirstTime = 1, iRval = DEFAULT_DOUBLE_CLICK_DISTANCE;
2244 static unsigned int uiSerial;
2262 if(pDisplay && pDisplay != pXSettings->
pDisplay)
2264 return DEFAULT_DOUBLE_CLICK_DISTANCE;
2282 static int iFirstTime = 1, iRval = DEFAULT_DRAG_THRESHOLD;
2283 static unsigned int uiSerial;
2301 if(pDisplay && pDisplay != pXSettings->
pDisplay)
2303 return DEFAULT_DRAG_THRESHOLD;
2321 static int iFirstTime = 1, iRval = DEFAULT_CURSOR_BLINK;
2322 static unsigned int uiSerial;
2340 if(pDisplay && pDisplay != pXSettings->
pDisplay)
2342 return DEFAULT_CURSOR_BLINK;
2360 static int iFirstTime = 1, iRval = DEFAULT_CURSOR_BLINK_TIME;
2361 static unsigned int uiSerial;
2379 if(pDisplay && pDisplay != pXSettings->
pDisplay)
2381 return DEFAULT_CURSOR_BLINK_TIME;
2412 char **ppData,
int *pcbData,
char **ppCurData,
2413 const char *ppXMLData,
const char *pXMLDataEnd)
2424 if(!ppOrigin || !*ppOrigin || !pcbOrigin || !ppCur || !*ppCur ||
2425 !ppXMLData || !*ppXMLData || !pXMLDataEnd ||
2469 int cbRval, cbData, cbNeed, cbOffs;
2470 const char *pEnd = pXMLData + cbLength;
2472 char *pData, *pCurData;
2475 if(!pXMLData || !cbLength || !*pXMLData)
2484 pData = malloc(cbData);
2485 if(!pRval || !pData)
2518 pCur =
InternalParseXML(&pRval, &cbRval, &pXCur, &pData, &cbData, &pCurData, pCur, pEnd);
2537 cbOffs = ((
char *)(pXCur + 1) - (
char *)pRval);
2540 cbNeed = cbOffs + 2 *
sizeof(*pXCur)
2541 + (pCurData - pData);
2545 void *pTemp = realloc(pRval, cbNeed);
2552 pXCur = (pXCur - pRval) + ((
CHXMLEntry *)pTemp);
2557 for(pXE=pRval; pXE < pXCur; pXE++)
2559 if(pXCur->nLabelOffset >= 0)
2565 pXCur->nLabelOffset = 0;
2568 if(pXCur->nDataOffset >= 0)
2570 pXCur->nDataOffset += cbOffs;
2574 pXCur->nDataOffset = 0;
2582 memcpy(pXCur, pData, (pCurData - pData) + 1);
2602 const char *pCur = pTagContents, *pEnd = pTagContents + cbLength;
2603 const char *p1, *p2, *p3;
2604 char *pRval, *pC, *pE, *p4, *p5;
2605 int i1, cbRval = 4096;
2614 cbLength = strlen(pTagContents);
2615 pEnd = pTagContents + cbLength;
2625 pE = pRval + cbRval;
2635 while(pCur < pEnd && *pCur)
2638 while(pCur < pEnd && *pCur && *pCur <=
' ')
2644 while(pCur < pEnd && *pCur >
' ' && *pCur !=
'=' && *pCur !=
'>' && *pCur !=
'[' && *pCur !=
'(')
2660 else if(pCur >= p1 + 2 && *(pCur - 1) ==
'-' && *(pCur - 2) ==
'-')
2664 else if(*(pCur - 1) ==
'/')
2670 else if(*pCur ==
'(' || *pCur ==
'[')
2700 goto value_is_now_p5;
2712 while(pCur < pEnd && *pCur && *pCur <=
' ')
2719 if(pCur < pEnd && *pCur ==
'=')
2723 while(pCur < pEnd && *pCur && *pCur <=
' ')
2730 if(*pCur ==
'"' || *pCur ==
'\'')
2734 while(pCur < pEnd && *pCur &&
2735 (*pCur != c1 || (pCur < pEnd - 1 && pCur[1] == c1)))
2762 while(pCur < pEnd && *pCur >
' ' && *pCur !=
'>')
2773 else if(pCur >= p3 + 2 && *(pCur - 1) ==
'-' && *(pCur - 2) ==
'-')
2777 else if(*(pCur - 1) ==
'/')
2808 if(pC + (p2 - p1) + strlen(p5) + 4 >= pE)
2811 while((p2 - p1) + strlen(p5) + 4 >= i1)
2829 pC = p4 + (pC - pRval);
2833 pE = pRval + cbRval;
2837 memcpy(pC, p1, p2 - p1);
2841 pC += strlen(pC) + 1;
2849 if(pC + (p2 - p1) + 3 >= pE)
2852 while((p2 - p1) + 3 >= i1)
2869 pC = p4 + (pC - pRval);
2873 pE = pRval + cbRval;
2877 memcpy(pC, p1, p2 - p1);
2891 const char *p1, *pEnd = pTagContents + cbLength;
2894 if(!pTagContents || cbLength == 0 || !*pTagContents)
2896 return pTagContents;
2901 cbLength = strlen(pTagContents);
2915 while(p1 < pEnd && *p1)
2943 register const char *p1 = pTagContents;
2947 if(!p1 || !cbLength)
2954 cbLength = strlen(p1);
2967 while(p1 < pE && *p1)
2970 if(bUseQuotes && (*p1 ==
'"' || *p1 ==
'\''))
2979 while(p1 < pE && *p1 &&
2980 (*p1 != c1 || ((p1 + 1) < pE && p1[1] == c1)))
3002 else if(*p1 == cEndChar)
3021 if(!p1 || p1 >= pE || !*p1 )
3038 if(!p1 || p1 >= pE || !*p1 )
3045 else if(!bUseQuotes && *p1 ==
'<' && (cEndChar ==
']' || cEndChar ==
')'))
3061 if(!p1 || p1 >= pE || !*p1 )
3095 pRval =
WBRunResult(
"xdg-mime",
"query",
"filetype",szFileName,NULL);
3100 p2 = pRval + strlen(pRval);
3101 while(p2 > pRval && *(p2 - 1) <=
' ')
3117 pRval =
WBRunResult(
"xdg-mime",
"query",
"default",szMimeType,NULL);
3123 p2 = pRval + strlen(pRval);
3124 while(p2 > pRval && *(p2 - 1) <=
' ')
3160 char *pRval, *p1, *p2, *pTemp;
3168 if(*szDesktopFile !=
'/')
3170 p1 =
WBAlloc(PATH_MAX * 2 + strlen(szDesktopFile));
3176 static const char *
const aszPaths[]=
3177 {
"/usr/local/share/applications/",
"/usr/share/applications/",
3178 "/usr/local/share/app-install/desktop/",
"/usr/share/app-install/desktop/" };
3186 strcat(p1, szDesktopFile);
3195 for(i1=0; i1 <
sizeof(aszPaths)/
sizeof(aszPaths[0]); i1++)
3197 strcpy(p1, aszPaths[i1]);
3198 strcat(p1, szDesktopFile);
3205 if(i1 >=
sizeof(aszPaths)/
sizeof(aszPaths[0]))
3217 WB_ERROR_PRINT(
"%s - File \"%s\" does not exist or cannot be located\n", __FUNCTION__, szDesktopFile);
3243 WB_ERROR_PRINT(
"TEMPORARY: %s - result \"%s\"\n", __FUNCTION__, pRval);
3246 if(pRval && strlen(pRval) >= strlen(pTemp))
3248 strcpy(pRval, pRval + strlen(pTemp) - 1);
3257 p2 = pRval + strlen(pRval);
3258 while(p2 > pRval && *(p2 - 1) <=
' ')
3276 #define LOAD_COLOR0(X,Y) if(CHGetResourceString(WBGetDefaultDisplay(), X, Y, sizeof(Y)) > 0) { } 3277 #define LOAD_COLOR(X,Y,Z) if(CHGetResourceString(WBGetDefaultDisplay(), X, Y, sizeof(Y)) <= 0){ WB_WARN_PRINT("%s - WARNING: can't find color %s, using default value %s\n", __FUNCTION__, X, Z); strcpy(Y,Z); } 3281 static char szRval[256];
3283 LOAD_COLOR(
"border_color", szRval,
"#000000");
3290 static char szRval[256];
3292 LOAD_COLOR0(
"bg_color",szRval)
else 3293 LOAD_COLOR0(
"*Form.background", szRval)
else 3294 LOAD_COLOR(
"*WmForm.background", szRval,
"#dcdad5");
3301 static char szRval[256];
3303 LOAD_COLOR(
"tooltip_bg_color",szRval,
"#f8f880");
3310 static char szRval[256];
3312 LOAD_COLOR0(
"bg_color",szRval)
else 3313 LOAD_COLOR0(
"*Dialog.background",szRval)
else 3314 LOAD_COLOR0(
"*Form.background", szRval)
else 3315 LOAD_COLOR0(
"*WmDialogShell.background",szRval)
else 3316 LOAD_COLOR0(
"*WmForm.background", szRval)
else 3317 LOAD_COLOR0(
"*Window.background",szRval)
else 3318 LOAD_COLOR(
"*background", szRval,
"#dcdad5");
3325 static char szRval[256];
3329 LOAD_COLOR0(
"base_color",szRval)
else 3330 LOAD_COLOR0(
"*Window.background",szRval)
else 3331 LOAD_COLOR(
"*background", szRval,
"#edeceb");
3343 static char szRval[256];
3345 LOAD_COLOR0(
"base_color",szRval)
else 3346 LOAD_COLOR0(
"*Window.background",szRval)
else 3347 LOAD_COLOR(
"*background", szRval,
"#ffffff");
3354 static char szRval[256];
3356 LOAD_COLOR0(
"fg_color",szRval)
else 3357 LOAD_COLOR0(
"*Dialog.foreground",szRval)
else 3358 LOAD_COLOR0(
"*Form.foreground", szRval)
else 3359 LOAD_COLOR0(
"*WmDialogShell.foreground",szRval)
else 3360 LOAD_COLOR0(
"*WmForm.foreground", szRval)
else 3361 LOAD_COLOR(
"*foreground", szRval,
"#000000");
3368 static char szRval[256];
3372 LOAD_COLOR0(
"fg_color",szRval)
else 3373 LOAD_COLOR(
"*foreground", szRval,
"#000000");
3392 static char szRval[256];
3394 LOAD_COLOR(
"tooltip_fg_color",szRval,
"#202020");
3401 static char szRval[256];
3403 LOAD_COLOR0(
"fg_color",szRval)
else 3404 LOAD_COLOR(
"*foreground", szRval,
"#000000");
3411 static char szRval[256];
3413 LOAD_COLOR0(
"selected_fg_color",szRval)
else 3414 LOAD_COLOR0(
"*selectForeground",szRval)
else 3415 LOAD_COLOR0(
"*highlightColor",szRval)
else 3416 LOAD_COLOR(
"*highlightForeground", szRval,
"#ffffff");
3427 static char szRval[256];
3429 LOAD_COLOR0(
"selected_bg_color",szRval)
else 3430 LOAD_COLOR0(
"*selectForeground",szRval)
else 3431 LOAD_COLOR(
"*highlightBackground", szRval,
"#20ab20");
3450 WBDebugPrint(
"WARNING: no CHXSettings data in CHDumpConfig\n");
3454 WBDebugPrint(
"========================================================================\n");
3455 WBDebugPrint(
"CHXSettings dump - DISP: %p # %d SER: %u (%08xH)\n",
3460 for(i1=0; i1 < nSettings; i1++)
3495 WBDebugPrint(
"========================================================================\n");
const char * CHGetHighlightForegroundColor(Display *pDisplay)
returns highlight foreground color
char * CHGetMimeDefaultApp(const char *szMimeType)
Get the default application for a particular MIME type.
char * szData
'char' typed pointer to data within string area
char ** ppLineBuf
array of pointers to beginning of each line (WBAlloc'd TODO: make it part of 'cData'?...
const CHXSettings * CHGetXSettings(Display *pDisplay)
returns a pointer to the cached X settings
int CHGetDoubleClickDistance(Display *pDisplay)
returns default double click distance (from X settings)
int iContentsIndex
0-based first array index for 'contents' for this entry; <= 0 for none
unsigned short sBlue
16-bit RGB value for Blue
'window helper' main header file for the X11workbench Toolkit API
int FBWriteFileBufHandle(int iFile, const file_help_buf_t *pBuf)
Write the file_help_buf_t object's text data to a file using an open file handle.
long lBufferCount
number of bytes of valid data
int nDataOffset
BYTE offset to data (zero-byte-terminated) string (from beginning of array) for the entry data; <= 0 ...
Utilities for copying and drawing text, determining text extents, and so on.
int iContainer
0-based index for container; <= 0 for none.
const CHXSetting * CHGetXSetting(Display *pDisplay, const char *szSettingName)
returns a pointer to a specific X setting entry by name
char * WBRunResult(const char *szAppName,...)
Run an application synchronously, returning 'stdout' output in a character buffer.
XSETTINGS_DATA_COLOR clrData
The data as a color value.
void FBInsertLineIntoFileBuf(file_help_buf_t **ppBuf, long lLineNum, const char *szLine)
Insert a line of text into a file_help_buf_t object at a specific line index.
void CHOnExit(void)
frees resources used by Configuration 'helper' functions
const char * CHFindEndOfXMLTag(const char *pTagContents, int cbLength)
Parses contents of an XML tag to find the end of it.
Atom aINCR
INCR Atom for the clipboard.
const char * CHGetActiveBackgroundColor(Display *pDisplay)
returns background color for active elements
const char * CHGetStaticBackgroundColor(Display *pDisplay)
returns background color for static elements
void FBDestroyFileBuf(file_help_buf_t *pBuf)
Destroy a file_help_buf_t object.
char cData[sizeof(char *)]
the data itself (aligned to size of a pointer)
Array wrapper for CHXSetting cache.
CHXSetting aData[1]
An array of 'nSettings' CHXSetting structures. Binary and string data directly follows the array.
struct tagXSETTINGS_DATA_COLOR XSETTINGS_DATA_COLOR
Structure for storing configuration color information, XSettingsTypeColor.
void * CHOpenConfFile(const char *szAppName, int iFlags)
open configuration file for read/write, optionally creating it, based on application name
static const char * InternalParseXML(CHXMLEntry **ppOrigin, int *pcbOrigin, CHXMLEntry **ppCur, char **ppData, int *pcbData, char **ppCurData, const char *ppXMLData, const char *pXMLDataEnd)
Parses contents of an XML tag, returning as WBAlloc'd string list similar to environment strings.
const char * CHFindEndOfXMLSection(const char *pTagContents, int cbLength, char cEndChar, int bUseQuotes)
Parses XML text for the end of a 'section', typically ending in '>' ')' or ']'.
int CHGetConfFileString(void *hFile, const char *szSection, const char *szIdentifier, char *szData, int cbData)
obtain a string from a configuration file
unsigned int uiSerial
serial number from last XSETTINGS query
'configuration helper' main header file for the X11 Work Bench Toolkit API
const char * CHGetActiveTextColor(Display *pDisplay)
returns 'active' text color
void FBDeleteLineFromFileBuf(file_help_buf_t *pBuf, long lLineNum)
Delete a line of text from a file_help_buf_t object at a specific line index.
void * WBReAlloc(void *pBuf, int nNewSize)
High performance memory sub-allocator 're-allocate'.
int CHGetCursorBlinkTime(Display *pDisplay)
returns default cursor blink time (from X settings)
int iType
The setting type (XSettingsType enumeration)
const char * CHFindNextXMLTag(const char *pTagContents, int cbLength, int nNestingFlags)
Parses contents of a XML to find the next tag, skipping comments along the way.
const char * CHGetDisabledTextColor(Display *pDisplay)
returns 'disabled' (greyed) text color
int CHGetArgC()
retrieves the argument count stored by CHRegisterArgs()
int WBStat(const char *szLinkName, unsigned long *pdwModeAttrReturn)
Obtain the 'stat' flags for a file name, resolving links as needed.
int CHGetResourceString(Display *pDisplay, const char *szIdentifier, char *szData, int cbData)
Queries desktop resource strings (may become deprecated)
int CHWriteConfFileString(void *hFile, const char *szSection, const char *szIdentifier, const char *szData)
write a string to a configuration file
int nLabelOffset
BYTE offset to label (zero-byte-terminated) string (from beginning of array) for this entry; <= 0 for...
void CHCloseConfFile(void *pFile)
close configuration file opened by CHOpenConfFile(), but does NOT free memory resources
const char * CHGetTextColor(Display *pDisplay)
returns text color
long lLineCount
number of lines in 'cData' when ppLineBuf not NULL
const char * CHGetDialogTextColor(Display *pDisplay)
returns text color for dialog frame elements
void * WBAlloc(int nSize)
High performance memory sub-allocator 'allocate'.
int CHGetResourceInt(Display *pDisplay, const char *szIdentifier)
Queryies desktop resource integer values (from strings) (may become deprecated)
CHXMLEntry * CHParseXML(const char *pXMLData, int cbLength)
Parses contents of an XML tag, returning as WBAlloc'd string list similar to environment strings.
void CHRegisterArgs(int argc, char **argv)
registers arguments from the command line for later use
void CHDumpConfig()
dump config information using debug output functions
int iData
The data as an integer value.
const char * CHGetHighlightBackgroundColor(Display *pDisplay)
returns highlight background color
#define WB_ERROR_PRINT(...)
Preferred method of implementing an 'error level' debug message for all subsystems.
int WBIsDirectory(const char *szFileName)
Return whether a file is a directory or a symlink to a directory.
void WBFree(void *pBuf)
High performance memory sub-allocator 'free'.
int FBParseFileBuf(file_help_buf_t *pBuf)
Parse or Re-Parse the data for a file_help_buf_t object.
const char * CHGetDialogBackgroundColor(Display *pDisplay)
returns background color for dialog frame elements
const char * szName
pointer to the NAME string within memory that follows CHXSettings::aData
int CHGetDoubleClickTime(Display *pDisplay)
returns default double click time (from X settings)
The setting is an RGBA Color stored as XSETTINGS_DATA_COLOR.
int CHGetCursorBlink(Display *pDisplay)
returns default cursor blink 'enable' flag (from X settings)
int iLen
length (where applicable)
int CHWriteConfFileInt(void *hFile, const char *szSection, const char *szIdentifier, int iData)
write an integer value to a configuration file
unsigned short sAlpha
16-bit ALPHA value. If not used, it will be 0xffff
Display * pDisplay
identifies which display it belongs to (reserved)
Descriptor for parsed XML entry.
void CHSettingsRefresh(Display *pDisplay)
refresh the internally cached X settings
int CHGetConfFileInt(void *hFile, const char *szSection, const char *szIdentifier)
obtain an integer value from a configuration file
void FBReplaceLineInFileBuf(file_help_buf_t **ppBuf, long lLineNum, const char *szLine)
Insert a line of text into a file_help_buf_t object at a specific line index.
static __inline__ int FBIsFileBufDirty(const file_help_buf_t *pBuf)
Inline function, returns TRUE if file_help_buf_t is 'dirty'.
basic 'buffered I/O' object structure for 'FileBuf' APIs
char * CHGetFileMimeType(const char *szFileName)
Get the MIME type for a particular file name or extension.
The setting is an integer.
char * WBCopyStringN(const char *pSrc, unsigned int nMaxChars)
A simple utility that returns a WBAlloc() copy of a string up to a maximum length (can also be 0-byte...
unsigned short sGreen
16-bit RGB value for Green
const char * CHGetDisabledBackgroundColor(Display *pDisplay)
returns background color for disabled (greyed) elements
const char * CHGetToolTipTextColor(Display *pDisplay)
returns text color for 'tool tips'
char * WBGetCanonicalPath(const char *szFileName)
Return the canonical path for a file name (similar to POSIX 'realpath()' funtion)
const char * CHGetBackgroundColor(Display *pDisplay)
returns background color for non-static elements
#define CHPARSEXML_BRACKET
int CHGetDragThreshold(Display *pDisplay)
returns default drag threshold (from X settings)
int iNextIndex
0-based index for next item at this level; <= 0 for none. 0 marks "end of list" for top level
const char *const * CHGetArgV()
retrieves the array of arguments stored by CHRegisterArgs()
void WBDebugPrint(const char *pFmt,...) __attribute__((format(printf
conditional debug message output
union tagCHXSetting::@7 uData
union of the data alias'
char * WBCopyString(const char *pSrc)
A simple utility that returns a WBAlloc() copy of a 0-byte terminated string.
void CHDestroyConfFile(void *pFile)
destroy configuration file opened by CHOpenConfFile(), freeing memory resources (but not the files)
The setting is a 0-byte terminated ASCII string.
int nSettings
the total number of settings in aData
file_help_buf_t * FBGetFileBufViaHandle(int iFile)
Construct a file_help_buf_t from a file handle.
#define WB_IF_DEBUG_LEVEL(L)
Preferred method of implementing conditional debug 'if block' code.
struct tagCHXMLEntry CHXMLEntry
Descriptor for parsed XML entry.
char * CHGetDesktopFileInfo(const char *szDesktopFile, const char *szInfo)
Get the default application for a particular MIME type.
const char * CHGetBorderColor(Display *pDisplay)
returns border color
Structure for storing configuration color information, XSettingsTypeColor.
unsigned short sRed
16-bit RGB value for RED
void WBNormalizeXMLString(char *pString)
De-Quote and 'normalize' an XML string 'in place', that is modifying the original string by removing ...
struct tagCHXSetting CHXSetting
Structure for storing settings information internally.
char * CHParseXMLTagContents(const char *pTagContents, int cbLength)
Parses contents of a single XML tag, returning as WBAlloc'd string list similar to environment string...
void WBCatString(char **ppDest, const char *pSrc)
A simple utility that concatenates a string onto the end of a 0-byte terminated WBAlloc() string.
Structure for storing settings information internally.
const char * CHGetToolTipBackgroundColor(Display *pDisplay)
returns background color for 'tool tips'