~vanvugt/compiz/fix-1056615

« back to all changes in this revision

Viewing changes to compizconfig/integration/gnome/gsettings/src/ccs_gnome_integration_gsettings_integrated_setting_factory.c

  • Committer: Tarmac
  • Author(s): Sam Spilsbury
  • Date: 2012-10-16 11:43:02 UTC
  • mfrom: (3411.1.11 compiz.fix_1064791)
  • Revision ID: tarmac-20121016114302-svbjerf1lf8jb7lm
Don't write plugins-with-set-keys every single time we read a schema, if 
the value is already in plugins-with-set-keys. Added tests to demonstrate 
behaviour.
(LP: #1064791)

vanvugt says: This also seems to fix LP: #1044662, somehow.. Fixes: https://bugs.launchpad.net/bugs/1064791. Approved by Daniel van Vugt.

Show diffs side-by-side

added added

removed removed

Lines of Context:
11
11
#include <ccs_gsettings_interface_wrapper.h>
12
12
 
13
13
#include <gsettings_util.h>
 
14
#include <ccs_gsettings_wrapper_factory_interface.h>
14
15
 
15
16
#include "ccs_gnome_integration.h"
16
17
#include "ccs_gnome_integrated_setting.h"
19
20
#include "ccs_gnome_integration_gsettings_integrated_setting.h"
20
21
#include "ccs_gnome_integration_gsettings_integrated_setting_factory.h"
21
22
 
22
 
INTERFACE_TYPE (CCSGNOMEIntegrationGSettingsWrapperFactoryInterface);
23
 
 
24
23
char *
25
24
ccsGSettingsIntegratedSettingsTranslateNewGNOMEKeyForCCS (const char *key)
26
25
{
45
44
    return newKey;
46
45
}
47
46
 
48
 
CCSGSettingsWrapper *
49
 
ccsGNOMEIntegrationGSettingsWrapperFactoryNewGSettingsWrapper (CCSGNOMEIntegrationGSettingsWrapperFactory *factory,
50
 
                                                               const gchar                                *schemaName,
51
 
                                                               CCSGNOMEIntegrationGSettingsChangedCallback callback,
52
 
                                                               CCSGNOMEValueChangeData                    *data,
53
 
                                                               CCSObjectAllocationInterface               *ai)
54
 
{
55
 
    return (*(GET_INTERFACE (CCSGNOMEIntegrationGSettingsWrapperFactoryInterface, factory))->newGSettingsWrapper) (factory, schemaName, callback, data, ai);
56
 
}
57
 
 
58
 
/* CCSGNOMEIntegrationGSettingsWrapperFactory implementation */
59
 
typedef struct _CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate;
60
 
struct _CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate
61
 
{
62
 
};
63
 
 
64
 
CCSGSettingsWrapper *
65
 
ccsGNOMEIntegrationGSettingsWrapperFactoryNewGSettingsWrapperDefault (CCSGNOMEIntegrationGSettingsWrapperFactory *factory,
66
 
                                                                      const gchar                                 *schemaName,
67
 
                                                                      CCSGNOMEIntegrationGSettingsChangedCallback callback,
68
 
                                                                      CCSGNOMEValueChangeData                     *data,
69
 
                                                                      CCSObjectAllocationInterface                *ai)
70
 
{
71
 
    CCSGSettingsWrapper *wrapper = ccsGSettingsWrapperNewForSchema (schemaName, ai);
72
 
    ccsGSettingsWrapperConnectToChangedSignal (wrapper, (GCallback) callback, data);
73
 
 
74
 
    return wrapper;
75
 
}
76
 
 
77
 
const CCSGNOMEIntegrationGSettingsWrapperFactoryInterface ccsGNOMEIntegrationGSettingsWrapperFactoryInterface =
78
 
{
79
 
    ccsGNOMEIntegrationGSettingsWrapperFactoryNewGSettingsWrapperDefault
80
 
};
81
 
 
82
 
void
83
 
ccsGNOMEIntegrationGSettingsWrapperDefaultImplFree (CCSGNOMEIntegrationGSettingsWrapperFactory *wrapperFactory)
84
 
{
85
 
    ccsObjectFinalize (wrapperFactory);
86
 
    (*wrapperFactory->object.object_allocation->free_) (wrapperFactory->object.object_allocation->allocator,
87
 
                                                        wrapperFactory);
88
 
}
89
 
 
90
 
CCSGNOMEIntegrationGSettingsWrapperFactory *
91
 
ccsGNOMEIntegrationGSettingsWrapperDefaultImplNew (CCSObjectAllocationInterface *ai)
92
 
{
93
 
    CCSGNOMEIntegrationGSettingsWrapperFactory *wrapperFactory = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGNOMEIntegrationGSettingsWrapperFactory));
94
 
 
95
 
    if (!wrapperFactory)
96
 
        return NULL;
97
 
 
98
 
    CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate));
99
 
 
100
 
    if (!priv)
101
 
    {
102
 
        (*ai->free_) (ai->allocator, wrapperFactory);
103
 
        return NULL;
104
 
    }
105
 
 
106
 
    ccsObjectInit (wrapperFactory, ai);
107
 
    ccsObjectAddInterface (wrapperFactory, (const CCSInterface *) &ccsGNOMEIntegrationGSettingsWrapperFactoryInterface, GET_INTERFACE_TYPE (CCSGNOMEIntegrationGSettingsWrapperFactoryInterface));
108
 
    ccsObjectSetPrivate (wrapperFactory, (CCSPrivate *) priv);
109
 
 
110
 
    return wrapperFactory;
111
 
}
112
 
 
113
 
void
114
 
ccsGNOMEIntegrationGSettingsWrapperDefaultImpl (CCSGNOMEIntegrationGSettingsWrapperFactory *factory)
115
 
{
116
 
    ccsObjectFinalize (factory);
117
 
    (*factory->object.object_allocation->free_) (factory->object.object_allocation->allocator, factory);
118
 
}
119
 
 
120
47
typedef struct _CCSGSettingsIntegratedSettingFactoryPrivate CCSGSettingsIntegratedSettingFactoryPrivate;
121
48
 
122
49
struct _CCSGSettingsIntegratedSettingFactoryPrivate
123
50
{
124
 
    CCSGNOMEIntegrationGSettingsWrapperFactory *wrapperFactory;
 
51
    CCSGSettingsWrapperFactory *wrapperFactory;
125
52
    GHashTable  *pluginsToSettingsGSettingsWrapperQuarksHashTable;
126
53
    GHashTable  *quarksToGSettingsWrappersHashTable;
127
54
    GHashTable  *pluginsToSettingsSpecialTypesHashTable;
153
80
 
154
81
}
155
82
 
 
83
GCallback
 
84
ccsGSettingsIntegratedSettingsChangeCallback ()
 
85
{
 
86
    return (GCallback) gnomeGSettingsValueChanged;
 
87
}
 
88
 
156
89
static CCSIntegratedSetting *
157
90
createNewGSettingsIntegratedSetting (CCSGSettingsWrapper *wrapper,
158
91
                                     const char  *gnomeName,
193
126
}
194
127
 
195
128
static GHashTable *
196
 
initializeGSettingsWrappers (CCSGNOMEIntegrationGSettingsWrapperFactory *factory,
197
 
                             CCSGNOMEValueChangeData                    *data)
 
129
initializeGSettingsWrappers (CCSGSettingsWrapperFactory *factory)
198
130
{
199
131
    const CCSGSettingsWrapperIntegratedSchemasQuarks *quarks = ccsGNOMEGSettingsWrapperQuarks ();
200
132
    GHashTable *quarksToGSettingsWrappers = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, ccsGSettingsWrapperUnrefWrapper);
201
133
 
202
134
    g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED),
203
 
                         ccsGNOMEIntegrationGSettingsWrapperFactoryNewGSettingsWrapper (factory,
204
 
                                                                                        g_quark_to_string (quarks->ORG_COMPIZ_INTEGRATED),
205
 
                                                                                        gnomeGSettingsValueChanged,
206
 
                                                                                        data,
207
 
                                                                                        factory->object.object_allocation));
 
135
                         ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory,
 
136
                                                                        g_quark_to_string (quarks->ORG_COMPIZ_INTEGRATED),
 
137
                                                                        factory->object.object_allocation));
208
138
    g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS),
209
 
                         ccsGNOMEIntegrationGSettingsWrapperFactoryNewGSettingsWrapper (factory,
210
 
                                                                                        g_quark_to_string (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS),
211
 
                                                                                        gnomeGSettingsValueChanged,
212
 
                                                                                        data,
213
 
                                                                                        factory->object.object_allocation));
 
139
                         ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory,
 
140
                                                                        g_quark_to_string (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS),
 
141
                                                                        factory->object.object_allocation));
214
142
    g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES),
215
 
                         ccsGNOMEIntegrationGSettingsWrapperFactoryNewGSettingsWrapper (factory,
216
 
                                                                                        g_quark_to_string (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES),
217
 
                                                                                        gnomeGSettingsValueChanged,
218
 
                                                                                        data,
219
 
                                                                                        factory->object.object_allocation));
 
143
                         ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory,
 
144
                                                                        g_quark_to_string (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES),
 
145
                                                                        factory->object.object_allocation));
220
146
    g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL),
221
 
                         ccsGNOMEIntegrationGSettingsWrapperFactoryNewGSettingsWrapper (factory,
222
 
                                                                                        g_quark_to_string (quarks->ORG_GNOME_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL),
223
 
                                                                                        gnomeGSettingsValueChanged,
224
 
                                                                                        data,
225
 
                                                                                        factory->object.object_allocation));
 
147
                         ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory,
 
148
                                                                        g_quark_to_string (quarks->ORG_GNOME_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL),
 
149
                                                                        factory->object.object_allocation));
226
150
    g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_GNOME_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS),
227
 
                         ccsGNOMEIntegrationGSettingsWrapperFactoryNewGSettingsWrapper (factory,
228
 
                                                                                        g_quark_to_string (quarks->ORG_GNOME_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS),
229
 
                                                                                        gnomeGSettingsValueChanged,
230
 
                                                                                        data,
231
 
                                                                                        factory->object.object_allocation));
 
151
                         ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory,
 
152
                                                                        g_quark_to_string (quarks->ORG_GNOME_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS),
 
153
                                                                        factory->object.object_allocation));
232
154
 
233
155
    return quarksToGSettingsWrappers;
234
156
}
235
157
 
236
158
CCSIntegratedSetting *
237
159
ccsGSettingsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType (CCSIntegratedSettingFactory *factory,
238
 
                                                                                 CCSIntegration              *integration,
239
 
                                                                                 const char                  *pluginName,
240
 
                                                                                 const char                  *settingName,
241
 
                                                                                 CCSSettingType              type)
 
160
                                                                                     CCSIntegration              *integration,
 
161
                                                                                     const char                  *pluginName,
 
162
                                                                                     const char                  *settingName,
 
163
                                                                                     CCSSettingType              type)
242
164
{
243
165
    CCSGSettingsIntegratedSettingFactoryPrivate *priv = (CCSGSettingsIntegratedSettingFactoryPrivate *) ccsObjectGetPrivate (factory);
244
166
    GHashTable                              *settingsGSettingsWrapperQuarksHashTable = g_hash_table_lookup (priv->pluginsToSettingsGSettingsWrapperQuarksHashTable, pluginName);
246
168
    GHashTable                              *settingsSettingNameGNOMENameHashTable = g_hash_table_lookup (priv->pluginsToSettingNameGNOMENameHashTable, pluginName);
247
169
 
248
170
    if (!priv->quarksToGSettingsWrappersHashTable)
249
 
        priv->quarksToGSettingsWrappersHashTable = initializeGSettingsWrappers (priv->wrapperFactory, priv->valueChangeData);
 
171
        priv->quarksToGSettingsWrappersHashTable = initializeGSettingsWrappers (priv->wrapperFactory);
250
172
 
251
173
    if (settingsGSettingsWrapperQuarksHashTable &&
252
174
        settingsSpecialTypesHashTable &&
258
180
        const gchar *integratedName = g_hash_table_lookup (settingsSettingNameGNOMENameHashTable, settingName);
259
181
 
260
182
        return createNewGSettingsIntegratedSetting (wrapper,
261
 
                                                integratedName,
262
 
                                                pluginName,
263
 
                                                settingName,
264
 
                                                type,
265
 
                                                specialType,
266
 
                                                factory->object.object_allocation);
 
183
                                                    integratedName,
 
184
                                                    pluginName,
 
185
                                                    settingName,
 
186
                                                    type,
 
187
                                                    specialType,
 
188
                                                    factory->object.object_allocation);
267
189
    }
268
190
 
269
191
 
287
209
    if (priv->pluginsToSettingNameGNOMENameHashTable)
288
210
        g_hash_table_unref (priv->pluginsToSettingNameGNOMENameHashTable);
289
211
 
290
 
    ccsGNOMEIntegrationGSettingsWrapperDefaultImplFree (priv->wrapperFactory);
 
212
    ccsGSettingsWrapperFactoryUnref (priv->wrapperFactory);
291
213
 
292
214
    ccsObjectFinalize (factory);
293
215
    (*factory->object.object_allocation->free_) (factory->object.object_allocation->allocator, factory);
294
216
}
295
217
 
296
 
 
297
218
const CCSIntegratedSettingFactoryInterface ccsGSettingsIntegratedSettingFactoryInterface =
298
219
{
299
220
    ccsGSettingsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType,
301
222
};
302
223
 
303
224
CCSIntegratedSettingFactory *
304
 
ccsGSettingsIntegratedSettingFactoryNew (CCSGNOMEIntegrationGSettingsWrapperFactory       *wrapperFactory,
305
 
                                         CCSGNOMEValueChangeData                          *valueChangeData,
306
 
                                         CCSObjectAllocationInterface                     *ai)
 
225
ccsGSettingsIntegratedSettingFactoryNew (CCSGSettingsWrapperFactory   *wrapperFactory,
 
226
                                         CCSGNOMEValueChangeData      *valueChangeData,
 
227
                                         CCSObjectAllocationInterface *ai)
307
228
{
308
229
    CCSIntegratedSettingFactory *factory = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSettingFactory));
309
230
 
318
239
        return NULL;
319
240
    }
320
241
 
 
242
    ccsGSettingsWrapperFactoryRef (wrapperFactory);
 
243
 
321
244
    priv->wrapperFactory = wrapperFactory;
322
245
    priv->pluginsToSettingsGSettingsWrapperQuarksHashTable = ccsGNOMEGSettingsIntegrationPopulateSettingNameToIntegratedSchemasQuarksHashTable ();
323
246
    priv->pluginsToSettingsSpecialTypesHashTable = ccsGNOMEIntegrationPopulateSpecialTypesHashTables ();