add: memset(&ev, 0, sizeof(XEvent));  ev.xclient.type = ClientMessage; ev.xclient.message_type = XInternAtom(WMScreenDisplay(WMWidgetScreen(w)), "_WINDOWMAKER_COMMAND", False); ev.xclient.window = DefaultRootWindow(WMScreenDisplay(WMWidgetScreen(w))); ev.xclient.format = 8;  for (i = 0; i <= strlen(msg); i++) { ev.xclient.data.b[i] = msg[i]; } XSendEvent(WMScreenDisplay(WMWidgetScreen(w)), DefaultRootWindow(WMScreenDisplay(WMWidgetScreen(w))), False, SubstructureRedirectMask, &ev); XFlush(WMScreenDisplay(WMWidgetScreen(w)));
context: save(WMWidget *w, void *data){    int i;    proplist_t p1, p2;    proplist_t keyList;    proplist_t key;/*    puts("gathering data");*/    for (i=0; i<WPrefs.sectionCount; i++) {	PanelRec *rec = WMGetHangedData(WPrefs.sectionB[i]);	if ((rec->callbacks.flags & INITIALIZED_PANEL))	    savePanelData((Panel*)rec);    }/*    puts("compressing data");*/    /* compare the user dictionary with the global and remove redundant data */    keyList = PLGetAllDictionaryKeys(GlobalDB);/*    puts(PLGetDescription(WindowMakerDB));*/    for (i=0; i<PLGetNumberOfElements(keyList); i++) {	key = PLGetArrayElement(keyList, i);		/* We don't have this value anyway, so no problem. 	 * Probably  a new option */	p1 = PLGetDictionaryEntry(WindowMakerDB, key);	if (!p1)	    continue;	/* The global doesn't have it, so no problem either. */	p2 = PLGetDictionaryEntry(GlobalDB, key);	if (!p2)	    continue;	/* If both values are the same, don't save. */	if (PLIsEqual(p1, p2))	    PLRemoveDictionaryEntry(WindowMakerDB, key);    }/*    puts(PLGetDescription(WindowMakerDB));*/    PLRelease(keyList);/*    puts("storing data");*/    PLSave(WindowMakerDB, YES);}