comparison src/gtkconn.c @ 7493:6b9f452e84e1

[gaim-migrate @ 8106] Otro patchita de Daniel Atallah. Este es mejor disconnection dialog stuff. Muchos gracias Daniel! committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Thu, 13 Nov 2003 07:14:01 +0000
parents 4a416ff9cb4f
children 39185ff57842
comparison
equal deleted inserted replaced
7492:0ecc3ab93938 7493:6b9f452e84e1
273 GtkWidget *sw; 273 GtkWidget *sw;
274 GtkWidget *label; 274 GtkWidget *label;
275 }; 275 };
276 struct disconnect_window *disconnect_window = NULL; 276 struct disconnect_window *disconnect_window = NULL;
277 277
278 static void disconnect_window_hide()
279 {
280 gtk_widget_destroy(disconnect_window->window);
281 g_free(disconnect_window);
282 disconnect_window = NULL;
283 }
284
278 static void disconnect_response_cb(GtkDialog *dialog, gint id, GtkWidget *widget) 285 static void disconnect_response_cb(GtkDialog *dialog, gint id, GtkWidget *widget)
279 { 286 {
280 GtkTreeIter iter; 287 GtkTreeIter iter;
281 GValue val = { 0, }; 288 GValue val = { 0, };
282 GtkTreeSelection *sel = NULL; 289 GtkTreeSelection *sel = NULL;
283 GtkTreeModel *model = NULL; 290 GtkTreeModel *model = NULL;
284 GaimAccount *account = NULL; 291 GaimAccount *account = NULL;
292 GaimConnection *gc = NULL;
285 293
286 switch(id) { 294 switch(id) {
287 case GTK_RESPONSE_CLOSE: 295 case GTK_RESPONSE_CLOSE:
288 gtk_widget_destroy(disconnect_window->window); 296 disconnect_window_hide();
289 g_free(disconnect_window);
290 disconnect_window = NULL;
291 break; 297 break;
292 case GTK_RESPONSE_ACCEPT: 298 case GTK_RESPONSE_ACCEPT:
293 model = gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview)); 299 model = gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview));
294 /* 300 /*
295 * If we have more than one account disconnection displayed, then 301 * If we have more than one account disconnection displayed, then
303 } else { 309 } else {
304 /* There is only one account disconnection, so reconnect to it. */ 310 /* There is only one account disconnection, so reconnect to it. */
305 if (!gtk_tree_model_get_iter_first(model, &iter)) 311 if (!gtk_tree_model_get_iter_first(model, &iter))
306 return; 312 return;
307 } 313 }
308 gtk_tree_model_get_value (model, &iter, 4, &val); 314 gtk_tree_model_get_value(model, &iter, 4, &val);
309 account = g_value_get_pointer(&val); 315 account = g_value_get_pointer(&val);
310 gaim_account_connect(account); 316 gc = gaim_account_connect(account);
311 g_value_unset(&val); 317 g_value_unset(&val);
318 if (gaim_connection_get_state(gc) != GAIM_DISCONNECTED) {
319 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
320 if (!gtk_tree_model_get_iter_first(model, &iter))
321 disconnect_window_hide();
322 else {
323 gtk_tree_selection_select_iter(sel, &iter);
324 if (!gtk_tree_model_iter_next(model, &iter))
325 gtk_widget_hide_all(disconnect_window->sw);
326 }
327 }
312 break; 328 break;
313 } 329 }
314 } 330 }
315 331
316 static void disconnect_tree_cb(GtkTreeSelection *sel, GtkTreeModel *model) 332 static void disconnect_tree_cb(GtkTreeSelection *sel, GtkTreeModel *model)
420 gtk_widget_set_size_request(disconnect_window->treeview, -1, 96); 436 gtk_widget_set_size_request(disconnect_window->treeview, -1, 96);
421 g_signal_connect (G_OBJECT (sel), "changed", 437 g_signal_connect (G_OBJECT (sel), "changed",
422 G_CALLBACK (disconnect_tree_cb), list_store); 438 G_CALLBACK (disconnect_tree_cb), list_store);
423 } else { 439 } else {
424 list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview))); 440 list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview)));
425 441 gboolean removedPreviousAccountDisconnection = FALSE;
426 gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list_store), &iter); 442
427 do { 443 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list_store), &iter)) {
428 gtk_tree_model_get_value(GTK_TREE_MODEL(list_store), &iter, 4, &val); 444 do {
429 account = g_value_get_pointer(&val); 445 gtk_tree_model_get_value(GTK_TREE_MODEL(list_store), &iter, 4, &val);
430 if (account == gaim_connection_get_account(gc)) 446 account = g_value_get_pointer(&val);
431 gtk_list_store_remove(list_store, &iter); 447 g_value_unset(&val);
432 } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(list_store), &iter)); 448 if (account == gaim_connection_get_account(gc)) {
449 gtk_list_store_remove(list_store, &iter);
450 removedPreviousAccountDisconnection = TRUE;
451 break;
452 }
453 } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(list_store), &iter));
454 }
433 455
434 gtk_list_store_append (list_store, &iter); 456 gtk_list_store_append (list_store, &iter);
435 gtk_list_store_set(list_store, &iter, 457 gtk_list_store_set(list_store, &iter,
436 0, scale, 458 0, scale,
437 1, gaim_account_get_username(gaim_connection_get_account(gc)), 459 1, gaim_account_get_username(gaim_connection_get_account(gc)),
438 2, gaim_date_full(), 460 2, gaim_date_full(),
439 3, label_text, 461 3, label_text,
440 4, gaim_connection_get_account(gc), -1); 462 4, gaim_connection_get_account(gc), -1);
441 gtk_label_set_markup(GTK_LABEL(disconnect_window->label), label_text); 463 gtk_label_set_markup(GTK_LABEL(disconnect_window->label), label_text);
464 /*
465 * Only cause the tree view to show up if there will be
466 * more than one disconnection event listed in it.
467 */
468 if (!removedPreviousAccountDisconnection || GTK_WIDGET_VISIBLE(disconnect_window->sw))
442 gtk_widget_show_all(disconnect_window->sw); 469 gtk_widget_show_all(disconnect_window->sw);
443 } 470 }
444 g_free(label_text); 471 g_free(label_text);
445 g_object_unref(G_OBJECT(icon)); 472 g_object_unref(G_OBJECT(icon));
446 g_object_unref(G_OBJECT(scale)); 473 g_object_unref(G_OBJECT(scale));
474 gtk_window_present(GTK_WINDOW(disconnect_window->window));
447 } 475 }
448 476
449 static GaimConnectionUiOps conn_ui_ops = 477 static GaimConnectionUiOps conn_ui_ops =
450 { 478 {
451 gaim_gtk_connection_connect_progress, 479 gaim_gtk_connection_connect_progress,