Mercurial > pidgin.yaz
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", |