comparison src/gtkrequest.c @ 10605:56d4460bb6bd

[gaim-migrate @ 12037] This makes us remember the last used folders for saving files, opening files, and buddy icons (separately). Also fixes a file transfer crash when you decide not to overwrite an existing file but then choose a different file to save to. committer: Tailor Script <tailor@pidgin.im>
author Stu Tomlinson <stu@nosnilmot.com>
date Wed, 16 Feb 2005 21:07:10 +0000
parents c047cf7e18ba
children 57589eb36449
comparison
equal deleted inserted replaced
10604:255225f7639e 10605:56d4460bb6bd
1442 } 1442 }
1443 1443
1444 static void 1444 static void
1445 file_yes_no_cb(GaimGtkRequestData *data, gint id) 1445 file_yes_no_cb(GaimGtkRequestData *data, gint id)
1446 { 1446 {
1447 if (data->cbs[id] != NULL) 1447 /* Only call the callback if yes was selected, otherwise the request
1448 ((GaimRequestFileCb)data->cbs[id])(data->user_data, data->u.file.name); 1448 * (eg. file transfer) will be cancelled, then when a new filename is chosen
1449 1449 * things go BOOM */
1450 if (id == 1) 1450 if (id == 1) {
1451 if (data->cbs[1] != NULL)
1452 ((GaimRequestFileCb)data->cbs[1])(data->user_data, data->u.file.name);
1451 gaim_request_close(GAIM_REQUEST_FILE, data); 1453 gaim_request_close(GAIM_REQUEST_FILE, data);
1454 }
1452 } 1455 }
1453 1456
1454 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ 1457 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
1455 static void 1458 static void
1456 file_ok_check_if_exists_cb(GtkWidget *widget, gint response, GaimGtkRequestData *data) 1459 file_ok_check_if_exists_cb(GtkWidget *widget, gint response, GaimGtkRequestData *data)
1463 gaim_request_close(GAIM_REQUEST_FILE, data); 1466 gaim_request_close(GAIM_REQUEST_FILE, data);
1464 return; 1467 return;
1465 } 1468 }
1466 1469
1467 data->u.file.name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data->dialog)); 1470 data->u.file.name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data->dialog));
1468 if (data->u.file.savedialog) { 1471 current_folder = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(data->dialog));
1469 current_folder = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(data->dialog)); 1472 if (current_folder != NULL) {
1470 if (current_folder) { 1473 if (data->u.file.savedialog) {
1471 gaim_prefs_set_string("/gaim/gtk/filetransfer/last_folder", current_folder); 1474 gaim_prefs_set_string("/gaim/gtk/filelocations/last_save_folder", current_folder);
1472 g_free(current_folder); 1475 } else {
1473 } 1476 gaim_prefs_set_string("/gaim/gtk/filelocations/last_open_folder", current_folder);
1474 } 1477 }
1478 g_free(current_folder);
1479 }
1480
1475 #else /* FILECHOOSER */ 1481 #else /* FILECHOOSER */
1482
1476 static void 1483 static void
1477 file_ok_check_if_exists_cb(GtkWidget *button, GaimGtkRequestData *data) 1484 file_ok_check_if_exists_cb(GtkWidget *button, GaimGtkRequestData *data)
1478 { 1485 {
1479 const gchar *name; 1486 const gchar *name;
1487 gchar *current_folder;
1480 1488
1481 name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(data->dialog)); 1489 name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(data->dialog));
1482 1490
1483 /* If name is a directory then change directories */ 1491 /* If name is a directory then change directories */
1484 if (gaim_gtk_check_if_dir(name, GTK_FILE_SELECTION(data->dialog))) 1492 if (gaim_gtk_check_if_dir(name, GTK_FILE_SELECTION(data->dialog)))
1485 return; 1493 return;
1486 1494
1495 current_folder = g_path_get_dirname(name);
1496 if (current_folder != NULL) {
1497 if (data->u.file.savedialog) {
1498 gaim_prefs_set_string("/gaim/gtk/filelocations/last_save_folder", current_folder);
1499 } else {
1500 gaim_prefs_set_string("/gaim/gtk/filelocations/last_open_folder", current_folder);
1501 }
1502 g_free(current_folder);
1503 }
1504
1487 data->u.file.name = g_strdup(name); 1505 data->u.file.name = g_strdup(name);
1506
1488 #endif /* FILECHOOSER */ 1507 #endif /* FILECHOOSER */
1489 1508
1490 if ((data->u.file.savedialog == TRUE) && 1509 if ((data->u.file.savedialog == TRUE) &&
1491 (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) { 1510 (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) {
1492 gaim_request_yes_no(data, NULL, _("That file already exists"), 1511 gaim_request_yes_no(data, NULL, _("That file already exists"),
1514 GCallback ok_cb, GCallback cancel_cb, 1533 GCallback ok_cb, GCallback cancel_cb,
1515 void *user_data) 1534 void *user_data)
1516 { 1535 {
1517 GaimGtkRequestData *data; 1536 GaimGtkRequestData *data;
1518 GtkWidget *filesel; 1537 GtkWidget *filesel;
1538 const gchar *current_folder;
1519 1539
1520 data = g_new0(GaimGtkRequestData, 1); 1540 data = g_new0(GaimGtkRequestData, 1);
1521 data->type = GAIM_REQUEST_FILE; 1541 data->type = GAIM_REQUEST_FILE;
1522 data->user_data = user_data; 1542 data->user_data = user_data;
1523 data->cb_count = 2; 1543 data->cb_count = 2;
1537 savedialog ? GTK_STOCK_SAVE 1557 savedialog ? GTK_STOCK_SAVE
1538 : GTK_STOCK_OPEN, 1558 : GTK_STOCK_OPEN,
1539 GTK_RESPONSE_ACCEPT, 1559 GTK_RESPONSE_ACCEPT,
1540 NULL); 1560 NULL);
1541 gtk_dialog_set_default_response(GTK_DIALOG(filesel), GTK_RESPONSE_ACCEPT); 1561 gtk_dialog_set_default_response(GTK_DIALOG(filesel), GTK_RESPONSE_ACCEPT);
1542 if (filename != NULL) { 1562
1543 if (savedialog) { 1563 if (savedialog) {
1544 const gchar *current_folder = gaim_prefs_get_string("/gaim/gtk/filetransfer/last_folder"); 1564 current_folder = gaim_prefs_get_string("/gaim/gtk/filelocations/last_save_folder");
1545 gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(filesel), filename); 1565 } else {
1546 if (current_folder) { 1566 current_folder = gaim_prefs_get_string("/gaim/gtk/filelocations/last_open_folder");
1547 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(filesel), current_folder); 1567 }
1548 } 1568 if (filename != NULL)
1549 } else 1569 gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(filesel), filename);
1550 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(filesel), filename); 1570 if ((current_folder != NULL) && (*current_folder != '\0'))
1551 } 1571 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(filesel), current_folder);
1572
1552 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(filesel)), "response", 1573 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(filesel)), "response",
1553 G_CALLBACK(file_ok_check_if_exists_cb), data); 1574 G_CALLBACK(file_ok_check_if_exists_cb), data);
1554 #else /* FILECHOOSER */ 1575 #else /* FILECHOOSER */
1555 filesel = gtk_file_selection_new(title ? title 1576 filesel = gtk_file_selection_new(title ? title
1556 : (savedialog ? _("Save File...") 1577 : (savedialog ? _("Save File...")
1557 : _("Open File..."))); 1578 : _("Open File...")));
1579 if (savedialog) {
1580 current_folder = gaim_prefs_get_string("/gaim/gtk/filelocations/last_save_folder");
1581 } else {
1582 current_folder = gaim_prefs_get_string("/gaim/gtk/filelocations/last_open_folder");
1583 }
1584 if (current_folder != NULL) {
1585 gchar *path = g_strdup_printf("%s%s", current_folder, G_DIR_SEPARATOR_S);
1586 gtk_file_selection_set_filename(GTK_FILE_SELECTION(filesel), path);
1587 g_free(path);
1588 }
1558 if (filename != NULL) 1589 if (filename != NULL)
1559 gtk_file_selection_set_filename(GTK_FILE_SELECTION(filesel), filename); 1590 gtk_file_selection_set_filename(GTK_FILE_SELECTION(filesel), filename);
1591
1560 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(filesel)), "delete_event", 1592 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(filesel)), "delete_event",
1561 G_CALLBACK(file_cancel_cb), data); 1593 G_CALLBACK(file_cancel_cb), data);
1562 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button), 1594 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button),
1563 "clicked", G_CALLBACK(file_cancel_cb), data); 1595 "clicked", G_CALLBACK(file_cancel_cb), data);
1564 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked", 1596 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked",