static void ccpSetContextFromOption (CompObject *object, CompOption *o, const char *plugin) { CCP_CORE (&core); CCSPlugin *bsp; CCSSetting *setting; Bool screen = (object->type == COMP_OBJECT_TYPE_SCREEN); int screenNum = 0; /* we currently only support screen and display opton types */ if (object->type != COMP_OBJECT_TYPE_SCREEN && object->type != COMP_OBJECT_TYPE_DISPLAY) return; if (screen) { char *name = compObjectName (object); if (name) { screenNum = atoi (name); free (name); } } bsp = ccsFindPlugin (cc->context, (plugin) ? plugin : CORE_VTABLE_NAME); if (!bsp) return; setting = ccsFindSetting (bsp, o->name, screen, screenNum); if (!setting) return; if (!ccpTypeCheck (setting, o)) return; ccpValueToSetting (object, setting, &o->value); ccsWriteChangedSettings (cc->context); }
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); }