Mercurial > pidgin.yaz
comparison console/gntstatus.c @ 14755:811464ba52de
[gaim-migrate @ 17512]
Rocking patch (#1574228) from Richard Nelson (wabz) to fix the behaviour of the
status-windows for transient statuses. I butchered it a little, and might have
broke something in the process. I take the blames if this causes any problems.
committer: Tailor Script <tailor@pidgin.im>
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Wed, 18 Oct 2006 04:00:27 +0000 |
parents | fa0c8fa2b5a7 |
children | 34e049e6ce10 |
comparison
equal
deleted
inserted
replaced
14754:c8feea859665 | 14755:811464ba52de |
---|---|
54 GHashTable *hash; /* list of windows for substatuses */ | 54 GHashTable *hash; /* list of windows for substatuses */ |
55 } EditStatus; | 55 } EditStatus; |
56 | 56 |
57 typedef struct | 57 typedef struct |
58 { | 58 { |
59 GaimAccount *account; | |
60 const GaimStatusType *type; | |
61 char *message; | |
62 } RowInfo; | |
63 | |
64 typedef struct | |
65 { | |
59 GntWidget *window; | 66 GntWidget *window; |
60 GntWidget *type; | 67 GntWidget *type; |
61 GntWidget *message; | 68 GntWidget *message; |
62 | 69 |
63 EditStatus *parent; | 70 EditStatus *parent; |
64 GaimAccount *account; | 71 RowInfo *key; |
65 } EditSubStatus; | 72 } EditSubStatus; |
66 | 73 |
67 static GList *edits; /* List of opened edit-status dialogs */ | 74 static GList *edits; /* List of opened edit-status dialogs */ |
68 | 75 |
69 static void | 76 static void |
211 { | 218 { |
212 gnt_widget_destroy(sub->window); /* the "destroy" callback will remove entry from the hashtable */ | 219 gnt_widget_destroy(sub->window); /* the "destroy" callback will remove entry from the hashtable */ |
213 } | 220 } |
214 | 221 |
215 static void | 222 static void |
223 free_key(gpointer key, gpointer n) | |
224 { | |
225 RowInfo *row = key; | |
226 g_free(row->message); | |
227 g_free(key); | |
228 } | |
229 | |
230 | |
231 static void | |
216 update_edit_list(GntWidget *widget, EditStatus *edit) | 232 update_edit_list(GntWidget *widget, EditStatus *edit) |
217 { | 233 { |
218 edits = g_list_remove(edits, edit); | 234 edits = g_list_remove(edits, edit); |
219 gaim_notify_close_with_handle(edit); | 235 gaim_notify_close_with_handle(edit); |
220 g_hash_table_foreach(edit->hash, (GHFunc)destroy_substatus_win, NULL); | 236 g_hash_table_foreach(edit->hash, (GHFunc)destroy_substatus_win, NULL); |
237 g_list_foreach((GList*)gnt_tree_get_rows(GNT_TREE(edit->tree)), free_key, NULL); | |
221 g_free(edit); | 238 g_free(edit); |
222 } | 239 } |
240 | |
241 static void | |
242 set_substatuses(EditStatus *edit) | |
243 { | |
244 const GList *iter; | |
245 for (iter = gnt_tree_get_rows(GNT_TREE(edit->tree)); iter; iter = iter->next) { | |
246 RowInfo *key = iter->data; | |
247 if (gnt_tree_get_choice(GNT_TREE(edit->tree), key)) { | |
248 gaim_savedstatus_set_substatus(edit->saved, key->account, key->type, key->message); | |
249 } | |
250 } | |
251 } | |
252 | |
223 | 253 |
224 static void | 254 static void |
225 use_trans_status_cb(GntWidget *button, EditStatus *edit) | 255 use_trans_status_cb(GntWidget *button, EditStatus *edit) |
226 { | 256 { |
227 const char *message; | 257 const char *message; |
232 prim = GPOINTER_TO_INT(gnt_combo_box_get_selected_data(GNT_COMBO_BOX(edit->type))); | 262 prim = GPOINTER_TO_INT(gnt_combo_box_get_selected_data(GNT_COMBO_BOX(edit->type))); |
233 | 263 |
234 saved = gaim_savedstatus_find_transient_by_type_and_message(prim, message); | 264 saved = gaim_savedstatus_find_transient_by_type_and_message(prim, message); |
235 if (saved == NULL) { | 265 if (saved == NULL) { |
236 saved = gaim_savedstatus_new(NULL, prim); | 266 saved = gaim_savedstatus_new(NULL, prim); |
267 edit->saved = saved; | |
268 set_substatuses(edit); | |
237 } | 269 } |
238 gaim_savedstatus_set_message(saved, message); | 270 gaim_savedstatus_set_message(saved, message); |
239 gaim_savedstatus_activate(saved); | 271 gaim_savedstatus_activate(saved); |
240 gnt_widget_destroy(edit->window); | 272 gnt_widget_destroy(edit->window); |
241 } | 273 } |
271 | 303 |
272 if (edit->saved == NULL) | 304 if (edit->saved == NULL) |
273 { | 305 { |
274 edit->saved = gaim_savedstatus_new(title, prim); | 306 edit->saved = gaim_savedstatus_new(title, prim); |
275 gaim_savedstatus_set_message(edit->saved, message); | 307 gaim_savedstatus_set_message(edit->saved, message); |
308 set_substatuses(edit); | |
276 if (statuses.tree) | 309 if (statuses.tree) |
277 gnt_tree_add_row_last(GNT_TREE(statuses.tree), edit->saved, | 310 gnt_tree_add_row_last(GNT_TREE(statuses.tree), edit->saved, |
278 gnt_tree_create_row(GNT_TREE(statuses.tree), title, | 311 gnt_tree_create_row(GNT_TREE(statuses.tree), title, |
279 gaim_primitive_get_name_from_type(prim), message), NULL); | 312 gaim_primitive_get_name_from_type(prim), message), NULL); |
280 } | 313 } |
302 add_substatus(EditStatus *edit, GaimAccount *account) | 335 add_substatus(EditStatus *edit, GaimAccount *account) |
303 { | 336 { |
304 char *name; | 337 char *name; |
305 const char *type = NULL, *message = NULL; | 338 const char *type = NULL, *message = NULL; |
306 GaimSavedStatusSub *sub = NULL; | 339 GaimSavedStatusSub *sub = NULL; |
340 RowInfo *key; | |
307 | 341 |
308 if (!edit || !edit->tree) | 342 if (!edit || !edit->tree) |
309 return; | 343 return; |
310 | 344 |
311 if (edit->saved) | 345 if (edit->saved) |
312 sub = gaim_savedstatus_get_substatus(edit->saved, account); | 346 sub = gaim_savedstatus_get_substatus(edit->saved, account); |
313 | 347 |
348 key = g_new0(RowInfo, 1); | |
349 key->account = account; | |
350 | |
314 if (sub) | 351 if (sub) |
315 { | 352 { |
316 type = gaim_status_type_get_name(gaim_savedstatus_substatus_get_type(sub)); | 353 key->type = gaim_savedstatus_substatus_get_type(sub); |
354 type = gaim_status_type_get_name(key->type); | |
317 message = gaim_savedstatus_substatus_get_message(sub); | 355 message = gaim_savedstatus_substatus_get_message(sub); |
356 key->message = g_strdup(message); | |
318 } | 357 } |
319 | 358 |
320 name = g_strdup_printf("%s (%s)", gaim_account_get_username(account), | 359 name = g_strdup_printf("%s (%s)", gaim_account_get_username(account), |
321 gaim_account_get_protocol_name(account)); | 360 gaim_account_get_protocol_name(account)); |
322 gnt_tree_add_choice(GNT_TREE(edit->tree), account, | 361 gnt_tree_add_choice(GNT_TREE(edit->tree), key, |
323 gnt_tree_create_row(GNT_TREE(edit->tree), name, type, message), NULL, NULL); | 362 gnt_tree_create_row(GNT_TREE(edit->tree), name, type, message), NULL, NULL); |
324 | 363 |
325 if (sub) | 364 if (sub) |
326 gnt_tree_set_choice(GNT_TREE(edit->tree), account, TRUE); | 365 gnt_tree_set_choice(GNT_TREE(edit->tree), key, TRUE); |
327 g_free(name); | 366 g_free(name); |
328 } | 367 } |
329 | 368 |
330 static void | 369 static void |
331 substatus_window_destroy_cb(GntWidget *window, EditSubStatus *sub) | 370 substatus_window_destroy_cb(GntWidget *window, EditSubStatus *sub) |
332 { | 371 { |
333 g_hash_table_remove(sub->parent->hash, sub->account); | 372 g_hash_table_remove(sub->parent->hash, sub->key->account); |
334 g_free(sub); | 373 g_free(sub); |
335 } | 374 } |
336 | 375 |
337 static void | 376 static void |
338 save_substatus_cb(GntWidget *widget, EditSubStatus *sub) | 377 save_substatus_cb(GntWidget *widget, EditSubStatus *sub) |
339 { | 378 { |
340 GaimSavedStatus *saved = sub->parent->saved; | 379 GaimSavedStatus *saved = sub->parent->saved; |
341 GaimAccount *account = sub->account; | 380 RowInfo *row = sub->key; |
342 const char *message; | 381 const char *message; |
343 GaimStatusType *type; | 382 GaimStatusType *type; |
344 | 383 |
345 type = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(sub->type)); | 384 type = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(sub->type)); |
346 message = gnt_entry_get_text(GNT_ENTRY(sub->message)); | 385 message = gnt_entry_get_text(GNT_ENTRY(sub->message)); |
347 | 386 |
348 gaim_savedstatus_set_substatus(saved, account, type, message); | 387 row->type = type; |
349 | 388 row->message = g_strdup(message); |
350 gnt_tree_set_choice(GNT_TREE(sub->parent->tree), account, TRUE); | 389 |
351 gnt_tree_change_text(GNT_TREE(sub->parent->tree), account, 1, | 390 if (saved) /* Save the substatus if the savedstatus actually exists. */ |
391 gaim_savedstatus_set_substatus(saved, row->account, type, message); | |
392 | |
393 gnt_tree_set_choice(GNT_TREE(sub->parent->tree), row, TRUE); | |
394 gnt_tree_change_text(GNT_TREE(sub->parent->tree), row, 1, | |
352 gaim_status_type_get_name(type)); | 395 gaim_status_type_get_name(type)); |
353 gnt_tree_change_text(GNT_TREE(sub->parent->tree), account, 2, message); | 396 gnt_tree_change_text(GNT_TREE(sub->parent->tree), row, 2, message); |
354 | 397 |
355 gnt_widget_destroy(sub->window); | 398 gnt_widget_destroy(sub->window); |
356 } | 399 } |
357 | 400 |
358 static gboolean | 401 static gboolean |
363 EditSubStatus *sub; | 406 EditSubStatus *sub; |
364 GntWidget *window, *combo, *entry, *box, *button, *l; | 407 GntWidget *window, *combo, *entry, *box, *button, *l; |
365 GaimSavedStatusSub *substatus = NULL; | 408 GaimSavedStatusSub *substatus = NULL; |
366 const GList *iter; | 409 const GList *iter; |
367 char *name; | 410 char *name; |
368 GaimAccount *account = gnt_tree_get_selection_data(tree); | 411 RowInfo *selected = gnt_tree_get_selection_data(tree); |
369 | 412 GaimAccount *account = selected->account; |
370 if (gnt_tree_get_choice(tree, account)) | 413 |
414 if (gnt_tree_get_choice(tree, selected)) | |
371 { | 415 { |
372 /* There was a savedstatus for this account. Now remove it. */ | 416 /* There was a savedstatus for this account. Now remove it. */ |
417 g_free(selected->message); | |
418 selected->type = NULL; | |
419 selected->message = NULL; | |
420 /* XXX: should we really be saving it right now? */ | |
373 gaim_savedstatus_unset_substatus(edit->saved, account); | 421 gaim_savedstatus_unset_substatus(edit->saved, account); |
374 gnt_tree_change_text(tree, account, 1, NULL); | 422 gnt_tree_change_text(tree, account, 1, NULL); |
375 gnt_tree_change_text(tree, account, 2, NULL); | 423 gnt_tree_change_text(tree, account, 2, NULL); |
376 return FALSE; | 424 return FALSE; |
377 } | 425 } |
382 if (edit->saved) | 430 if (edit->saved) |
383 substatus = gaim_savedstatus_get_substatus(edit->saved, account); | 431 substatus = gaim_savedstatus_get_substatus(edit->saved, account); |
384 | 432 |
385 sub = g_new0(EditSubStatus, 1); | 433 sub = g_new0(EditSubStatus, 1); |
386 sub->parent = edit; | 434 sub->parent = edit; |
387 sub->account = account; | 435 sub->key = selected; |
388 | 436 |
389 sub->window = window = gnt_vbox_new(FALSE); | 437 sub->window = window = gnt_vbox_new(FALSE); |
390 gnt_box_set_toplevel(GNT_BOX(window), TRUE); | 438 gnt_box_set_toplevel(GNT_BOX(window), TRUE); |
391 gnt_box_set_title(GNT_BOX(window), _("Substatus")); /* XXX: a better title */ | 439 gnt_box_set_title(GNT_BOX(window), _("Substatus")); /* XXX: a better title */ |
392 | 440 |