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