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;
}
示例#2
0
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;
	}
}