| 1503 } else { |
1500 } else { |
| 1504 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder", current_folder); |
1501 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder", current_folder); |
| 1505 } |
1502 } |
| 1506 g_free(current_folder); |
1503 g_free(current_folder); |
| 1507 } |
1504 } |
| 1508 |
|
| 1509 #else /* FILECHOOSER */ |
|
| 1510 |
|
| 1511 static void |
|
| 1512 file_ok_check_if_exists_cb(GtkWidget *button, PidginRequestData *data) |
|
| 1513 { |
|
| 1514 const gchar *name; |
|
| 1515 gchar *current_folder; |
|
| 1516 |
|
| 1517 generic_response_start(data); |
|
| 1518 |
|
| 1519 name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(data->dialog)); |
|
| 1520 |
|
| 1521 /* If name is a directory then change directories */ |
|
| 1522 if (data->type == PURPLE_REQUEST_FILE) { |
|
| 1523 if (pidgin_check_if_dir(name, GTK_FILE_SELECTION(data->dialog))) |
|
| 1524 return; |
|
| 1525 } |
|
| 1526 |
|
| 1527 current_folder = g_path_get_dirname(name); |
|
| 1528 |
|
| 1529 g_free(data->u.file.name); |
|
| 1530 if (data->type == PURPLE_REQUEST_FILE) |
|
| 1531 data->u.file.name = g_strdup(name); |
|
| 1532 else |
|
| 1533 { |
|
| 1534 if (g_file_test(name, G_FILE_TEST_IS_DIR)) |
|
| 1535 data->u.file.name = g_strdup(name); |
|
| 1536 else |
|
| 1537 data->u.file.name = g_strdup(current_folder); |
|
| 1538 } |
|
| 1539 |
|
| 1540 if (current_folder != NULL) { |
|
| 1541 if (data->u.file.savedialog) { |
|
| 1542 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/filelocations/last_save_folder", current_folder); |
|
| 1543 } else { |
|
| 1544 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder", current_folder); |
|
| 1545 } |
|
| 1546 g_free(current_folder); |
|
| 1547 } |
|
| 1548 |
|
| 1549 #endif /* FILECHOOSER */ |
|
| 1550 #if 0 /* mismatched curly braces */ |
|
| 1551 } |
|
| 1552 #endif |
|
| 1553 if ((data->u.file.savedialog == TRUE) && |
1505 if ((data->u.file.savedialog == TRUE) && |
| 1554 (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) { |
1506 (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) { |
| 1555 purple_request_action(data, NULL, _("That file already exists"), |
1507 purple_request_action(data, NULL, _("That file already exists"), |
| 1556 _("Would you like to overwrite it?"), 0, |
1508 _("Would you like to overwrite it?"), 0, |
| 1557 NULL, NULL, NULL, |
1509 NULL, NULL, NULL, |
| 1560 _("Choose New Name"), G_CALLBACK(file_yes_no_cb)); |
1512 _("Choose New Name"), G_CALLBACK(file_yes_no_cb)); |
| 1561 } else |
1513 } else |
| 1562 file_yes_no_cb(data, 1); |
1514 file_yes_no_cb(data, 1); |
| 1563 } |
1515 } |
| 1564 |
1516 |
| 1565 #if !GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ |
|
| 1566 static gboolean |
|
| 1567 file_cancel_cb(PidginRequestData *data) |
|
| 1568 { |
|
| 1569 generic_response_start(data); |
|
| 1570 |
|
| 1571 if (data->cbs[0] != NULL) |
|
| 1572 ((PurpleRequestFileCb)data->cbs[0])(data->user_data, NULL); |
|
| 1573 |
|
| 1574 purple_request_close(data->type, data); |
|
| 1575 return FALSE; |
|
| 1576 } |
|
| 1577 #endif /* FILECHOOSER */ |
|
| 1578 |
|
| 1579 static void * |
1517 static void * |
| 1580 pidgin_request_file(const char *title, const char *filename, |
1518 pidgin_request_file(const char *title, const char *filename, |
| 1581 gboolean savedialog, |
1519 gboolean savedialog, |
| 1582 GCallback ok_cb, GCallback cancel_cb, |
1520 GCallback ok_cb, GCallback cancel_cb, |
| 1583 PurpleAccount *account, const char *who, PurpleConversation *conv, |
1521 PurpleAccount *account, const char *who, PurpleConversation *conv, |
| 1584 void *user_data) |
1522 void *user_data) |
| 1585 { |
1523 { |
| 1586 PidginRequestData *data; |
1524 PidginRequestData *data; |
| 1587 GtkWidget *filesel; |
1525 GtkWidget *filesel; |
| 1588 const gchar *current_folder; |
1526 const gchar *current_folder; |
| 1589 #if GTK_CHECK_VERSION(2,4,0) |
|
| 1590 gboolean folder_set = FALSE; |
1527 gboolean folder_set = FALSE; |
| 1591 #endif |
|
| 1592 |
1528 |
| 1593 data = g_new0(PidginRequestData, 1); |
1529 data = g_new0(PidginRequestData, 1); |
| 1594 data->type = PURPLE_REQUEST_FILE; |
1530 data->type = PURPLE_REQUEST_FILE; |
| 1595 data->user_data = user_data; |
1531 data->user_data = user_data; |
| 1596 data->cb_count = 2; |
1532 data->cb_count = 2; |
| 1597 data->cbs = g_new0(GCallback, 2); |
1533 data->cbs = g_new0(GCallback, 2); |
| 1598 data->cbs[0] = cancel_cb; |
1534 data->cbs[0] = cancel_cb; |
| 1599 data->cbs[1] = ok_cb; |
1535 data->cbs[1] = ok_cb; |
| 1600 data->u.file.savedialog = savedialog; |
1536 data->u.file.savedialog = savedialog; |
| 1601 |
1537 |
| 1602 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ |
|
| 1603 filesel = gtk_file_chooser_dialog_new( |
1538 filesel = gtk_file_chooser_dialog_new( |
| 1604 title ? title : (savedialog ? _("Save File...") |
1539 title ? title : (savedialog ? _("Save File...") |
| 1605 : _("Open File...")), |
1540 : _("Open File...")), |
| 1606 NULL, |
1541 NULL, |
| 1607 savedialog ? GTK_FILE_CHOOSER_ACTION_SAVE |
1542 savedialog ? GTK_FILE_CHOOSER_ACTION_SAVE |
| 1643 } |
1578 } |
| 1644 |
1579 |
| 1645 #endif |
1580 #endif |
| 1646 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(filesel)), "response", |
1581 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(filesel)), "response", |
| 1647 G_CALLBACK(file_ok_check_if_exists_cb), data); |
1582 G_CALLBACK(file_ok_check_if_exists_cb), data); |
| 1648 #else /* FILECHOOSER */ |
|
| 1649 filesel = gtk_file_selection_new( |
|
| 1650 title ? title : (savedialog ? _("Save File...") |
|
| 1651 : _("Open File..."))); |
|
| 1652 if (savedialog) { |
|
| 1653 current_folder = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/filelocations/last_save_folder"); |
|
| 1654 } else { |
|
| 1655 current_folder = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder"); |
|
| 1656 } |
|
| 1657 if (current_folder != NULL) { |
|
| 1658 gchar *path = g_strdup_printf("%s%s", current_folder, G_DIR_SEPARATOR_S); |
|
| 1659 gtk_file_selection_set_filename(GTK_FILE_SELECTION(filesel), path); |
|
| 1660 g_free(path); |
|
| 1661 } |
|
| 1662 if (filename != NULL) |
|
| 1663 gtk_file_selection_set_filename(GTK_FILE_SELECTION(filesel), filename); |
|
| 1664 |
|
| 1665 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(filesel)), "delete_event", |
|
| 1666 G_CALLBACK(file_cancel_cb), data); |
|
| 1667 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button), |
|
| 1668 "clicked", G_CALLBACK(file_cancel_cb), data); |
|
| 1669 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked", |
|
| 1670 G_CALLBACK(file_ok_check_if_exists_cb), data); |
|
| 1671 #endif /* FILECHOOSER */ |
|
| 1672 |
1583 |
| 1673 pidgin_auto_parent_window(filesel); |
1584 pidgin_auto_parent_window(filesel); |
| 1674 |
1585 |
| 1675 data->dialog = filesel; |
1586 data->dialog = filesel; |
| 1676 gtk_widget_show(filesel); |
1587 gtk_widget_show(filesel); |
| 1694 data->cbs = g_new0(GCallback, 2); |
1605 data->cbs = g_new0(GCallback, 2); |
| 1695 data->cbs[0] = cancel_cb; |
1606 data->cbs[0] = cancel_cb; |
| 1696 data->cbs[1] = ok_cb; |
1607 data->cbs[1] = ok_cb; |
| 1697 data->u.file.savedialog = FALSE; |
1608 data->u.file.savedialog = FALSE; |
| 1698 |
1609 |
| 1699 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ |
|
| 1700 dirsel = gtk_file_chooser_dialog_new( |
1610 dirsel = gtk_file_chooser_dialog_new( |
| 1701 title ? title : _("Select Folder..."), |
1611 title ? title : _("Select Folder..."), |
| 1702 NULL, |
1612 NULL, |
| 1703 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, |
1613 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, |
| 1704 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, |
1614 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, |
| 1709 if ((dirname != NULL) && (*dirname != '\0')) |
1619 if ((dirname != NULL) && (*dirname != '\0')) |
| 1710 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dirsel), dirname); |
1620 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dirsel), dirname); |
| 1711 |
1621 |
| 1712 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(dirsel)), "response", |
1622 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(dirsel)), "response", |
| 1713 G_CALLBACK(file_ok_check_if_exists_cb), data); |
1623 G_CALLBACK(file_ok_check_if_exists_cb), data); |
| 1714 #else |
|
| 1715 dirsel = gtk_file_selection_new(title ? title : _("Select Folder...")); |
|
| 1716 |
|
| 1717 g_signal_connect_swapped(G_OBJECT(dirsel), "delete_event", |
|
| 1718 G_CALLBACK(file_cancel_cb), data); |
|
| 1719 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(dirsel)->cancel_button), |
|
| 1720 "clicked", G_CALLBACK(file_cancel_cb), data); |
|
| 1721 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dirsel)->ok_button), "clicked", |
|
| 1722 G_CALLBACK(file_ok_check_if_exists_cb), data); |
|
| 1723 #endif |
|
| 1724 |
1624 |
| 1725 data->dialog = dirsel; |
1625 data->dialog = dirsel; |
| 1726 pidgin_auto_parent_window(dirsel); |
1626 pidgin_auto_parent_window(dirsel); |
| 1727 |
1627 |
| 1728 gtk_widget_show(dirsel); |
1628 gtk_widget_show(dirsel); |