CCSGSettingsWrapper * getSettingsObjectForCCSSetting (CCSBackend *backend, CCSSetting *setting) { CCSGSettingsWrapper *ret = NULL; gchar *pathName = makeSettingPath (ccsGSettingsBackendGetCurrentProfile (backend), setting); ret = ccsGSettingsGetSettingsObjectForPluginWithPath (backend, ccsPluginGetName (ccsSettingGetParent (setting)), pathName, ccsPluginGetContext (ccsSettingGetParent (setting))); g_free (pathName); return ret; }
static void writeSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { char *keyName; IniPrivData *data; data = (IniPrivData *) ccsObjectGetPrivate (backend); if (!data) return; if (asprintf (&keyName, "s%d_%s", ccsContextGetScreenNum (context), ccsSettingGetName (setting)) == -1) return; if (ccsSettingGetIsDefault (setting)) { ccsIniRemoveEntry (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName); free (keyName); return; } switch (ccsSettingGetType (setting)) { case TypeString: { char *value; if (ccsGetString (setting, (const char **) &value)) ccsIniSetString (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeMatch: { char *value; if (ccsGetMatch (setting, (const char **) &value)) ccsIniSetString (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeInt: { int value; if (ccsGetInt (setting, &value)) ccsIniSetInt (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeFloat: { float value; if (ccsGetFloat (setting, &value)) ccsIniSetFloat (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeBool: { Bool value; if (ccsGetBool (setting, &value)) ccsIniSetBool (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeColor: { CCSSettingColorValue value; if (ccsGetColor (setting, &value)) ccsIniSetColor (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeKey: { CCSSettingKeyValue value; if (ccsGetKey (setting, &value)) ccsIniSetKey (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeButton: { CCSSettingButtonValue value; if (ccsGetButton (setting, &value)) ccsIniSetButton (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeEdge: { unsigned int value; if (ccsGetEdge (setting, &value)) ccsIniSetEdge (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeBell: { Bool value; if (ccsGetBell (setting, &value)) ccsIniSetBell (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeList: { CCSSettingValueList value; if (ccsGetList (setting, &value)) ccsIniSetList (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value, ccsSettingGetInfo (setting)->forList.listType); } break; default: break; } if (keyName) free (keyName); }
static void readSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { Bool status = FALSE; char *keyName; IniPrivData *data; data = (IniPrivData *) ccsObjectGetPrivate (backend); if (!data) return; if (asprintf (&keyName, "s%d_%s", ccsContextGetScreenNum (context), ccsSettingGetName (setting)) == -1) return; switch (ccsSettingGetType (setting)) { case TypeString: { char *value; if (ccsIniGetString (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value)) { ccsSetString (setting, value, TRUE); free (value); status = TRUE; } } break; case TypeMatch: { char *value; if (ccsIniGetString (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value)) { ccsSetMatch (setting, value, TRUE); free (value); status = TRUE; } } break; case TypeInt: { int value; if (ccsIniGetInt (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value)) { ccsSetInt (setting, value, TRUE); status = TRUE; } } break; case TypeBool: { Bool value; if (ccsIniGetBool (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value)) { ccsSetBool (setting, (value != 0), TRUE); status = TRUE; } } break; case TypeFloat: { float value; if (ccsIniGetFloat (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value)) { ccsSetFloat (setting, value, TRUE); status = TRUE; } } break; case TypeColor: { CCSSettingColorValue color; if (ccsIniGetColor (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &color)) { ccsSetColor (setting, color, TRUE); status = TRUE; } } break; case TypeKey: { CCSSettingKeyValue key; if (ccsIniGetKey (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &key)) { ccsSetKey (setting, key, TRUE); status = TRUE; } } break; case TypeButton: { CCSSettingButtonValue button; if (ccsIniGetButton (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &button)) { ccsSetButton (setting, button, TRUE); status = TRUE; } } break; case TypeEdge: { unsigned int edges; if (ccsIniGetEdge (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &edges)) { ccsSetEdge (setting, edges, TRUE); status = TRUE; } } break; case TypeBell: { Bool bell; if (ccsIniGetBell (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &bell)) { ccsSetBell (setting, bell, TRUE); status = TRUE; } } break; case TypeList: { CCSSettingValueList value; if (ccsIniGetList (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value, setting)) { ccsSetList (setting, value, TRUE); ccsSettingValueListFree (value, TRUE); status = TRUE; } } break; default: break; } if (!status) { /* reset setting to default if it could not be read */ ccsResetToDefault (setting, TRUE); } if (keyName) free (keyName); }
static void ccsGNOMEIntegrationBackendWriteOptionFromSetting (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting) { GError *err = NULL; CCSSettingType type = TypeNum; CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); if (ccsIntegratedSettingsStorageEmpty (priv->storage)) registerAllIntegratedOptions (integration); if (priv->noWrites) return; /* Do not allow recursing back into writeIntegratedSetting */ ccsIntegrationDisallowIntegratedWrites (integration); CCSSettingType sType = ccsSettingGetType (setting); CCSSettingInfo *sInfo = ccsSettingGetInfo (setting); CCSSettingValue *vSetting = ccsSettingGetValue (setting); CCSSettingValue *v = ccsCopyValue (vSetting, sType, sInfo); if (!v) return; switch (ccsGNOMEIntegratedSettingInfoGetSpecialOptionType ((CCSGNOMEIntegratedSettingInfo *) integratedSetting)) { case OptionInt: ccsIntegratedSettingWriteValue (integratedSetting, v, TypeInt); break; case OptionBool: ccsIntegratedSettingWriteValue (integratedSetting, v, TypeBool); break; case OptionString: ccsIntegratedSettingWriteValue (integratedSetting, v, TypeString); break; case OptionKey: { CCSSettingValue *newValue = calloc (1, sizeof (CCSSettingValue)); newValue->isListChild = FALSE; newValue->parent = NULL; newValue->refCount = 1; if (ccsGNOMEIntegrationBackendKeyValueToStringValue (v, newValue)) { /* Really this is a lie - the writer expects a string * but it needs to know if its a key or a string */ type = TypeKey; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } if (newValue) ccsFreeSettingValueWithType (newValue, TypeString); } break; case OptionSpecial: { const char *settingName = ccsSettingGetName (setting); const char *pluginName = ccsPluginGetName (ccsSettingGetParent (setting)); CCSSettingValue *newValue = calloc (1, sizeof (CCSSettingValue)); newValue->isListChild = FALSE; newValue->parent = NULL; newValue->refCount = 1; if (strcmp (settingName, "current_viewport") == 0) { newValue->value.asBool = !v->value.asBool; type = TypeBool; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } else if (strcmp (settingName, "fullscreen_visual_bell") == 0) { const char *newValueString = v->value.asBool ? "fullscreen" : "frame_flash"; newValue->value.asString = strdup (newValueString); type = TypeString; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } else if (strcmp (settingName, "click_to_focus") == 0) { const char *newValueString = v->value.asBool ? "click" : "sloppy"; newValue->value.asString = strdup (newValueString); type = TypeString; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } else if ((strcmp (settingName, "run_command_screenshot_key") == 0 || strcmp (settingName, "run_command_window_screenshot_key") == 0 || strcmp (settingName, "run_command_terminal_key") == 0)) { if (ccsGNOMEIntegrationBackendKeyValueToStringValue (v, newValue)) { /* These are actually stored as strings in the schemas */ type = TypeString; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } } else if (((strcmp (settingName, "initiate_button") == 0) && ((strcmp (pluginName, "move") == 0) || (strcmp (pluginName, "resize") == 0))) || ((strcmp (settingName, "window_menu_button") == 0) && (strcmp (pluginName, "core") == 0))) { unsigned int modMask; Bool resizeWithRightButton = FALSE; if ((getButtonBindingForSetting (priv->context, "resize", "initiate_button") == 3) || (getButtonBindingForSetting (priv->context, "core", "window_menu_button") == 2)) { resizeWithRightButton = TRUE; } CCSIntegratedSettingList resizeButtonSetting = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, ccsGNOMEIntegratedPluginNames.SPECIAL, ccsGNOMEIntegratedSettingNames.NULL_RESIZE_WITH_RIGHT_BUTTON.compizName); newValue->value.asBool = resizeWithRightButton; type = TypeBool; ccsIntegratedSettingWriteValue (resizeButtonSetting->data, newValue, type); CCSIntegratedSettingList mouseModifierSetting = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, ccsGNOMEIntegratedPluginNames.SPECIAL, ccsGNOMEIntegratedSettingNames.NULL_MOUSE_BUTTON_MODIFIER.compizName); modMask = v->value.asButton.buttonModMask; if (setGnomeMouseButtonModifier (mouseModifierSetting->data, modMask)) { setButtonBindingForSetting (priv->context, "move", "initiate_button", 1, modMask); setButtonBindingForSetting (priv->context, "resize", "initiate_button", resizeWithRightButton ? 3 : 2, modMask); setButtonBindingForSetting (priv->context, "core", "window_menu_button", resizeWithRightButton ? 2 : 3, modMask); } /* We own the returned lists, so free them */ ccsIntegratedSettingListFree (resizeButtonSetting, FALSE); ccsIntegratedSettingListFree (mouseModifierSetting, FALSE); } if (newValue) ccsFreeSettingValueWithType (newValue, type); } break; } if (err) { ccsError ("%s", err->message); g_error_free (err); } if (v) ccsFreeSettingValueWithType (v, sType); /* we should immediately write changed settings */ ccsWriteChangedSettings (priv->context); ccsIntegrationAllowIntegratedWrites (integration); }
static Bool ccsGNOMEIntegrationBackendReadOptionIntoSetting (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting) { Bool ret = FALSE; CCSSettingValue *v = NULL; CCSSettingType type = TypeNum; CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); if (ccsIntegratedSettingsStorageEmpty (priv->storage)) registerAllIntegratedOptions (integration); if (!ccsSettingIsReadableByBackend (setting)) return FALSE; switch (ccsGNOMEIntegratedSettingInfoGetSpecialOptionType ((CCSGNOMEIntegratedSettingInfo *) integratedSetting)) { case OptionInt: { type = TypeInt; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; ccsSetInt (setting, v->value.asInt, TRUE); ret = TRUE; } break; case OptionBool: { type = TypeBool; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; ccsSetBool (setting, v->value.asBool, TRUE); ret = TRUE; } break; case OptionString: { type = TypeString; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; char *str = v->value.asString; ccsSetString (setting, str, TRUE); ret = TRUE; } break; case OptionKey: { /* Some backends store keys differently so we need to let the backend know * that we really intend to read a key and let it handle the conversion */ type = TypeKey; if (ccsGNOMEIntegrationBackendReadISAndSetSettingForType (integratedSetting, setting, &v, TypeKey, type)) ret = TRUE; } break; case OptionSpecial: { const char *settingName = ccsSettingGetName (setting); const char *pluginName = ccsPluginGetName (ccsSettingGetParent (setting)); if (strcmp (settingName, "current_viewport") == 0) { type = TypeBool; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; Bool showAll = v->value.asBool; ccsSetBool (setting, !showAll, TRUE); ret = TRUE; } else if (strcmp (settingName, "fullscreen_visual_bell") == 0) { type = TypeString; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; const char *value = v->value.asString; if (value) { Bool fullscreen; fullscreen = strcmp (value, "fullscreen") == 0; ccsSetBool (setting, fullscreen, TRUE); ret = TRUE; } } else if (strcmp (settingName, "click_to_focus") == 0) { type = TypeString; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; const char *focusMode = v->value.asString; if (focusMode) { Bool clickToFocus = (strcmp (focusMode, "click") == 0); ccsSetBool (setting, clickToFocus, TRUE); ret = TRUE; } } else if ((strcmp (settingName, "run_command_screenshot_key") == 0 || strcmp (settingName, "run_command_window_screenshot_key") == 0 || strcmp (settingName, "run_command_terminal_key") == 0)) { /* These are always stored as strings, no matter what the backend is * so the source type should be string */ type = TypeKey; if (ccsGNOMEIntegrationBackendReadISAndSetSettingForType (integratedSetting, setting, &v, TypeString, type)) ret = TRUE; } else if (((strcmp (settingName, "initiate_button") == 0) && ((strcmp (pluginName, "move") == 0) || (strcmp (pluginName, "resize") == 0))) || ((strcmp (settingName, "window_menu_button") == 0) && (strcmp (pluginName, "core") == 0))) { gboolean resizeWithRightButton; CCSSettingButtonValue button; memset (&button, 0, sizeof (CCSSettingButtonValue)); ccsGetButton (setting, &button); CCSIntegratedSettingList mouseModifierSetting = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, ccsGNOMEIntegratedPluginNames.SPECIAL, ccsGNOMEIntegratedSettingNames.NULL_MOUSE_BUTTON_MODIFIER.compizName); button.buttonModMask = getGnomeMouseButtonModifier (mouseModifierSetting->data); CCSIntegratedSettingList resizeButtonSetting = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, ccsGNOMEIntegratedPluginNames.SPECIAL, ccsGNOMEIntegratedSettingNames.NULL_RESIZE_WITH_RIGHT_BUTTON.compizName); type = TypeBool; v = ccsIntegratedSettingReadValue (resizeButtonSetting->data, type); resizeWithRightButton = v->value.asBool; if (strcmp (settingName, "window_menu_button") == 0) button.button = resizeWithRightButton ? 2 : 3; else if (strcmp (pluginName, "resize") == 0) button.button = resizeWithRightButton ? 3 : 2; else button.button = 1; ccsSetButton (setting, button, TRUE); ret = TRUE; /* Free the returned lists */ ccsIntegratedSettingListFree (mouseModifierSetting, FALSE); ccsIntegratedSettingListFree (resizeButtonSetting, FALSE); } } break; default: break; } if (v) ccsFreeSettingValueWithType (v, type); return ret; }
gchar * makeSettingPath (const char *currentProfile, CCSSetting *setting) { return makeCompizPluginPath (currentProfile, ccsPluginGetName (ccsSettingGetParent (setting))); }