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;
}
Example #2
0
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);
}
Example #3
0
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);
}
Example #4
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);
}
Example #5
0
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)));
}