| 96 GParamSpec *pspec) |
96 GParamSpec *pspec) |
| 97 { |
97 { |
| 98 PidginPluginInfoPrivate *priv = PIDGIN_PLUGIN_INFO_GET_PRIVATE(obj); |
98 PidginPluginInfoPrivate *priv = PIDGIN_PLUGIN_INFO_GET_PRIVATE(obj); |
| 99 |
99 |
| 100 switch (param_id) { |
100 switch (param_id) { |
| 101 case PROP_PIDGIN_CONFIG_FRAME: |
101 case PROP_PIDGIN_CONFIG_FRAME_CB: |
| 102 priv->get_config_frame = g_value_get_pointer(value); |
102 priv->config_frame_cb = g_value_get_pointer(value); |
| 103 break; |
103 break; |
| 104 default: |
104 default: |
| 105 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); |
105 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); |
| 106 break; |
106 break; |
| 107 } |
107 } |
| 113 GParamSpec *pspec) |
113 GParamSpec *pspec) |
| 114 { |
114 { |
| 115 PidginPluginInfoPrivate *priv = PIDGIN_PLUGIN_INFO_GET_PRIVATE(obj); |
115 PidginPluginInfoPrivate *priv = PIDGIN_PLUGIN_INFO_GET_PRIVATE(obj); |
| 116 |
116 |
| 117 switch (param_id) { |
117 switch (param_id) { |
| 118 case PROP_PIDGIN_CONFIG_FRAME: |
118 case PROP_PIDGIN_CONFIG_FRAME_CB: |
| 119 g_value_set_pointer(value, priv->get_config_frame); |
119 g_value_set_pointer(value, priv->config_frame_cb); |
| 120 break; |
120 break; |
| 121 default: |
121 default: |
| 122 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); |
122 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); |
| 123 break; |
123 break; |
| 124 } |
124 } |
| 133 |
133 |
| 134 /* Setup properties */ |
134 /* Setup properties */ |
| 135 obj_class->get_property = pidgin_plugin_info_get_property; |
135 obj_class->get_property = pidgin_plugin_info_get_property; |
| 136 obj_class->set_property = pidgin_plugin_info_set_property; |
136 obj_class->set_property = pidgin_plugin_info_set_property; |
| 137 |
137 |
| 138 g_object_class_install_property(obj_class, PROP_PIDGIN_CONFIG_FRAME, |
138 g_object_class_install_property(obj_class, PROP_PIDGIN_CONFIG_FRAME_CB, |
| 139 g_param_spec_pointer("pidgin-config-frame", |
139 g_param_spec_pointer("pidgin-config-frame-cb", |
| 140 "Pidgin configuration frame callback", |
140 "Pidgin configuration frame callback", |
| 141 "Callback that returns a GTK configuration frame", |
141 "Callback that returns a GTK configuration frame", |
| 142 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); |
142 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); |
| 143 } |
143 } |
| 144 |
144 |
| 194 return FALSE; |
194 return FALSE; |
| 195 |
195 |
| 196 if (PIDGIN_IS_PLUGIN_INFO(info)) |
196 if (PIDGIN_IS_PLUGIN_INFO(info)) |
| 197 priv = PIDGIN_PLUGIN_INFO_GET_PRIVATE(info); |
197 priv = PIDGIN_PLUGIN_INFO_GET_PRIVATE(info); |
| 198 |
198 |
| 199 ret = ((priv && priv->get_config_frame) || |
199 ret = ((priv && priv->config_frame_cb) || |
| 200 purple_plugin_info_get_pref_frame_callback(info) || |
200 purple_plugin_info_get_pref_frame_cb(info) || |
| 201 purple_plugin_info_get_pref_request_callback(info)); |
201 purple_plugin_info_get_pref_request_cb(info)); |
| 202 |
202 |
| 203 return ret; |
203 return ret; |
| 204 } |
204 } |
| 205 |
205 |
| 206 static GtkWidget * |
206 static GtkWidget * |
| 216 info = purple_plugin_get_info(plugin); |
216 info = purple_plugin_get_info(plugin); |
| 217 if (PIDGIN_IS_PLUGIN_INFO(info)) |
217 if (PIDGIN_IS_PLUGIN_INFO(info)) |
| 218 priv = PIDGIN_PLUGIN_INFO_GET_PRIVATE(info); |
218 priv = PIDGIN_PLUGIN_INFO_GET_PRIVATE(info); |
| 219 |
219 |
| 220 if (priv) |
220 if (priv) |
| 221 config = priv->get_config_frame(plugin); |
221 config = priv->config_frame_cb(plugin); |
| 222 |
222 |
| 223 if (!config && purple_plugin_info_get_pref_frame_callback(info)) |
223 if (!config && purple_plugin_info_get_pref_frame_cb(info)) |
| 224 { |
224 { |
| 225 PurplePluginPrefFrame *frame; |
225 PurplePluginPrefFrame *frame; |
| 226 PurplePluginPrefFrameCallback get_pref_frame = |
226 PurplePluginPrefFrameCb pref_frame_cb = |
| 227 purple_plugin_info_get_pref_frame_callback(info); |
227 purple_plugin_info_get_pref_frame_cb(info); |
| 228 |
228 |
| 229 frame = get_pref_frame(plugin); |
229 frame = pref_frame_cb(plugin); |
| 230 |
230 |
| 231 config = pidgin_plugin_pref_create_frame(frame); |
231 config = pidgin_plugin_pref_create_frame(frame); |
| 232 |
232 |
| 233 *purple_pref_frame = frame; |
233 *purple_pref_frame = frame; |
| 234 } |
234 } |
| 282 pidgin_plugin_open_config(PurplePlugin *plugin, GtkWindow *parent) |
282 pidgin_plugin_open_config(PurplePlugin *plugin, GtkWindow *parent) |
| 283 { |
283 { |
| 284 PurplePluginInfo *info; |
284 PurplePluginInfo *info; |
| 285 PidginPluginInfoPrivate *priv = NULL; |
285 PidginPluginInfoPrivate *priv = NULL; |
| 286 PidginPluginUiData *ui_data; |
286 PidginPluginUiData *ui_data; |
| 287 PurplePluginPrefFrameCallback get_pref_frame; |
287 PurplePluginPrefFrameCb pref_frame_cb; |
| 288 PurplePluginPrefRequestCallback get_pref_request; |
288 PurplePluginPrefRequestCb pref_request_cb; |
| 289 PidginPluginConfigFrame get_pidgin_frame = NULL; |
289 PidginPluginConfigFrameCb get_pidgin_frame = NULL; |
| 290 gint prefs_count; |
290 gint prefs_count; |
| 291 |
291 |
| 292 g_return_if_fail(plugin != NULL); |
292 g_return_if_fail(plugin != NULL); |
| 293 |
293 |
| 294 info = purple_plugin_get_info(plugin); |
294 info = purple_plugin_get_info(plugin); |
| 302 return; |
302 return; |
| 303 |
303 |
| 304 if (PIDGIN_IS_PLUGIN_INFO(info)) |
304 if (PIDGIN_IS_PLUGIN_INFO(info)) |
| 305 priv = PIDGIN_PLUGIN_INFO_GET_PRIVATE(info); |
305 priv = PIDGIN_PLUGIN_INFO_GET_PRIVATE(info); |
| 306 |
306 |
| 307 get_pref_frame = purple_plugin_info_get_pref_frame_callback(info); |
307 pref_frame_cb = purple_plugin_info_get_pref_frame_cb(info); |
| 308 get_pref_request = purple_plugin_info_get_pref_request_callback(info); |
308 pref_request_cb = purple_plugin_info_get_pref_request_cb(info); |
| 309 |
309 |
| 310 if (priv) |
310 if (priv) |
| 311 get_pidgin_frame = priv->get_config_frame; |
311 get_pidgin_frame = priv->config_frame_cb; |
| 312 |
312 |
| 313 prefs_count = 0; |
313 prefs_count = 0; |
| 314 if (get_pref_frame) |
314 if (pref_frame_cb) |
| 315 prefs_count++; |
315 prefs_count++; |
| 316 if (get_pref_request) |
316 if (pref_request_cb) |
| 317 prefs_count++; |
317 prefs_count++; |
| 318 if (get_pidgin_frame) |
318 if (get_pidgin_frame) |
| 319 prefs_count++; |
319 prefs_count++; |
| 320 |
320 |
| 321 if (prefs_count > 1) { |
321 if (prefs_count > 1) { |
| 329 purple_plugin_info_set_ui_data(info, ui_data); |
329 purple_plugin_info_set_ui_data(info, ui_data); |
| 330 |
330 |
| 331 /* Priority: pidgin frame > purple request > purple frame |
331 /* Priority: pidgin frame > purple request > purple frame |
| 332 * Purple frame could be replaced with purple request some day. |
332 * Purple frame could be replaced with purple request some day. |
| 333 */ |
333 */ |
| 334 if (get_pref_request && !get_pidgin_frame) { |
334 if (pref_request_cb && !get_pidgin_frame) { |
| 335 ui_data->type = PIDGIN_PLUGIN_UI_DATA_TYPE_REQUEST; |
335 ui_data->type = PIDGIN_PLUGIN_UI_DATA_TYPE_REQUEST; |
| 336 ui_data->u.request_handle = get_pref_request(plugin); |
336 ui_data->u.request_handle = pref_request_cb(plugin); |
| 337 purple_request_add_close_notify(ui_data->u.request_handle, |
337 purple_request_add_close_notify(ui_data->u.request_handle, |
| 338 purple_callback_set_zero, &info->ui_data); |
338 purple_callback_set_zero, &info->ui_data); |
| 339 purple_request_add_close_notify(ui_data->u.request_handle, |
339 purple_request_add_close_notify(ui_data->u.request_handle, |
| 340 g_free, ui_data); |
340 g_free, ui_data); |
| 341 } else { |
341 } else { |