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);
}
Esempio n. 2
0
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);
}