XSettingsResult xsettings_manager_set_setting (XSettingsManager *manager, XSettingsSetting *setting) { XSettingsSetting *old_setting = xsettings_list_lookup (settings, setting->name); XSettingsSetting *new_setting; XSettingsResult result; if (old_setting) { if (xsettings_setting_equal (old_setting, setting)) return XSETTINGS_SUCCESS; xsettings_list_delete (&settings, setting->name); } new_setting = xsettings_setting_copy (setting); if (!new_setting) return XSETTINGS_NO_MEM; new_setting->last_change_serial = manager->serial; result = xsettings_list_insert (&settings, new_setting); if (result != XSETTINGS_SUCCESS) xsettings_setting_free (new_setting); return result; }
static void notify_changes(XSettingsData* client, XSettingsList* old_settings, XSettingsCallback callback, void* cb_data) { if(!callback) return; XSettingsList* old_iter = old_settings; XSettingsList* new_iter = client->settings; while(old_iter || new_iter) { int cmp; if(old_iter && new_iter) cmp = strcmp(old_iter->setting->name, new_iter->setting->name); else if(old_iter) cmp = -1; else cmp = 1; if(cmp < 0) callback(old_iter->setting->name, XSETTINGS_ACTION_DELETED, NULL, cb_data); else if(cmp == 0) { if(!xsettings_setting_equal(old_iter->setting, new_iter->setting)) callback(old_iter->setting->name, XSETTINGS_ACTION_CHANGED, new_iter->setting, cb_data); } else callback(new_iter->setting->name, XSETTINGS_ACTION_NEW, new_iter->setting, cb_data); if(old_iter) old_iter = old_iter->next; if(new_iter) new_iter = new_iter->next; } }