From 24519b62928fc29ae129a9522769922308fa414f Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 12 Mar 2005 01:16:04 +0000 Subject: [PATCH] Added code to automatically convert Icon paths in WMWindowAttributes from the old .AppInfo/... to the new Library/WindowMaker/... on the fly when Window Maker starts. This should allow a transparent transition without any need for users to do anything. --- ChangeLog | 3 +++ src/defaults.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/ChangeLog b/ChangeLog index 46b80556..ff926740 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,6 +14,9 @@ Changes since version 0.91.0: - fixed to allow parallel builds on SMP systems using make -j - updated Italian translation (Marco Colombo ) - applied .AppInfo --> Library path rename patch (Alex Perez ) +- added code to automatically update the icon paths from the old .AppInfo + style to the new Library/WindowMaker style in WMWindowAttributes when + Window Maker starts to make transition transparent for users. Changes since version 0.90.0: diff --git a/src/defaults.c b/src/defaults.c index 724e915e..a879b097 100644 --- a/src/defaults.c +++ b/src/defaults.c @@ -971,6 +971,53 @@ appendMenu(WMPropList *destarr, WMPropList *array) #endif +/* Fixup paths for cached pixmaps from .AppInfo to Library/WindowMaker/... */ +static Bool +fixupCachedPixmapsPaths(WMPropList *dict) +{ + WMPropList *allApps, *app, *props, *iconkey, *icon, *newicon; + char *path, *fixedpath, *ptr, *search, *replace; + int i, len, slen; + Bool changed = False; + + search = "/.AppInfo/WindowMaker/"; + slen = strlen(search); + + iconkey = WMCreatePLString("Icon"); + allApps = WMGetPLDictionaryKeys(dict); + + for (i=0; i < WMGetPropListItemCount(allApps); i++) { + app = WMGetFromPLArray(allApps, i); + props = WMGetFromPLDictionary(dict, app); + if (!props) + continue; + icon = WMGetFromPLDictionary(props, iconkey); + if (icon && WMIsPLString(icon)) { + path = WMGetFromPLString(icon); + ptr = strstr(path, search); + if (ptr) { + changed = True; + len = (ptr - path); + fixedpath = wmalloc(strlen(path)+32); + strncpy(fixedpath, path, len); + fixedpath[len] = 0; + strcat(fixedpath, "/Library/WindowMaker/CachedPixmaps/"); + strcat(fixedpath, ptr+slen); + newicon = WMCreatePLString(fixedpath); + WMPutInPLDictionary(props, iconkey, newicon); + WMReleasePropList(newicon); + wfree(fixedpath); + } + } + } + + WMReleasePropList(allApps); + WMReleasePropList(iconkey); + + return changed; +} + + void wDefaultsMergeGlobalMenus(WDDomain *menuDomain) { @@ -1076,6 +1123,15 @@ wDefaultsInitDomain(char *domain, Bool requireDictionary) wwarning(_("Domain %s (%s) of defaults database is corrupted!"), domain, the_path); } + if (strcmp(domain, "WMWindowAttributes")==0 && db->dictionary) { + if (fixupCachedPixmapsPaths(db->dictionary)) { + WMWritePropListToFile(db->dictionary, db->path, True); + /* re-read the timestamp. if this fails take current time */ + if (stat(db->path, &stbuf)<0) { + stbuf.st_mtime = time(NULL); + } + } + } db->timestamp = stbuf.st_mtime; } else { wwarning(_("could not load domain %s from user defaults database"), -- 2.11.4.GIT