| 1468 } else { |
1465 } else { |
| 1469 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder", current_folder); |
1466 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder", current_folder); |
| 1470 } |
1467 } |
| 1471 g_free(current_folder); |
1468 g_free(current_folder); |
| 1472 } |
1469 } |
| 1473 |
|
| 1474 #else /* FILECHOOSER */ |
|
| 1475 |
|
| 1476 static void |
|
| 1477 file_ok_check_if_exists_cb(GtkWidget *button, PidginRequestData *data) |
|
| 1478 { |
|
| 1479 const gchar *name; |
|
| 1480 gchar *current_folder; |
|
| 1481 |
|
| 1482 generic_response_start(data); |
|
| 1483 |
|
| 1484 name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(data->dialog)); |
|
| 1485 |
|
| 1486 /* If name is a directory then change directories */ |
|
| 1487 if (data->type == PURPLE_REQUEST_FILE) { |
|
| 1488 if (pidgin_check_if_dir(name, GTK_FILE_SELECTION(data->dialog))) |
|
| 1489 return; |
|
| 1490 } |
|
| 1491 |
|
| 1492 current_folder = g_path_get_dirname(name); |
|
| 1493 |
|
| 1494 g_free(data->u.file.name); |
|
| 1495 if (data->type == PURPLE_REQUEST_FILE) |
|
| 1496 data->u.file.name = g_strdup(name); |
|
| 1497 else |
|
| 1498 { |
|
| 1499 if (g_file_test(name, G_FILE_TEST_IS_DIR)) |
|
| 1500 data->u.file.name = g_strdup(name); |
|
| 1501 else |
|
| 1502 data->u.file.name = g_strdup(current_folder); |
|
| 1503 } |
|
| 1504 |
|
| 1505 if (current_folder != NULL) { |
|
| 1506 if (data->u.file.savedialog) { |
|
| 1507 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/filelocations/last_save_folder", current_folder); |
|
| 1508 } else { |
|
| 1509 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder", current_folder); |
|
| 1510 } |
|
| 1511 g_free(current_folder); |
|
| 1512 } |
|
| 1513 |
|
| 1514 #endif /* FILECHOOSER */ |
|
| 1515 #if 0 /* mismatched curly braces */ |
|
| 1516 } |
|
| 1517 #endif |
|
| 1518 if ((data->u.file.savedialog == TRUE) && |
1470 if ((data->u.file.savedialog == TRUE) && |
| 1519 (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) { |
1471 (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) { |
| 1520 purple_request_action(data, NULL, _("That file already exists"), |
1472 purple_request_action(data, NULL, _("That file already exists"), |
| 1521 _("Would you like to overwrite it?"), 0, |
1473 _("Would you like to overwrite it?"), 0, |
| 1522 NULL, NULL, NULL, |
1474 NULL, NULL, NULL, |
| 1525 _("Choose New Name"), G_CALLBACK(file_yes_no_cb)); |
1477 _("Choose New Name"), G_CALLBACK(file_yes_no_cb)); |
| 1526 } else |
1478 } else |
| 1527 file_yes_no_cb(data, 1); |
1479 file_yes_no_cb(data, 1); |
| 1528 } |
1480 } |
| 1529 |
1481 |
| 1530 #if !GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ |
|
| 1531 static gboolean |
|
| 1532 file_cancel_cb(PidginRequestData *data) |
|
| 1533 { |
|
| 1534 generic_response_start(data); |
|
| 1535 |
|
| 1536 if (data->cbs[0] != NULL) |
|
| 1537 ((PurpleRequestFileCb)data->cbs[0])(data->user_data, NULL); |
|
| 1538 |
|
| 1539 purple_request_close(data->type, data); |
|
| 1540 return FALSE; |
|
| 1541 } |
|
| 1542 #endif /* FILECHOOSER */ |
|
| 1543 |
|
| 1544 static void * |
1482 static void * |
| 1545 pidgin_request_file(const char *title, const char *filename, |
1483 pidgin_request_file(const char *title, const char *filename, |
| 1546 gboolean savedialog, |
1484 gboolean savedialog, |
| 1547 GCallback ok_cb, GCallback cancel_cb, |
1485 GCallback ok_cb, GCallback cancel_cb, |
| 1548 PurpleAccount *account, const char *who, PurpleConversation *conv, |
1486 PurpleAccount *account, const char *who, PurpleConversation *conv, |
| 1549 void *user_data) |
1487 void *user_data) |
| 1550 { |
1488 { |
| 1551 PidginRequestData *data; |
1489 PidginRequestData *data; |
| 1552 GtkWidget *filesel; |
1490 GtkWidget *filesel; |
| 1553 const gchar *current_folder; |
1491 const gchar *current_folder; |
| 1554 #if GTK_CHECK_VERSION(2,4,0) |
|
| 1555 gboolean folder_set = FALSE; |
1492 gboolean folder_set = FALSE; |
| 1556 #endif |
|
| 1557 |
1493 |
| 1558 data = g_new0(PidginRequestData, 1); |
1494 data = g_new0(PidginRequestData, 1); |
| 1559 data->type = PURPLE_REQUEST_FILE; |
1495 data->type = PURPLE_REQUEST_FILE; |
| 1560 data->user_data = user_data; |
1496 data->user_data = user_data; |
| 1561 data->cb_count = 2; |
1497 data->cb_count = 2; |
| 1562 data->cbs = g_new0(GCallback, 2); |
1498 data->cbs = g_new0(GCallback, 2); |
| 1563 data->cbs[0] = cancel_cb; |
1499 data->cbs[0] = cancel_cb; |
| 1564 data->cbs[1] = ok_cb; |
1500 data->cbs[1] = ok_cb; |
| 1565 data->u.file.savedialog = savedialog; |
1501 data->u.file.savedialog = savedialog; |
| 1566 |
1502 |
| 1567 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ |
|
| 1568 filesel = gtk_file_chooser_dialog_new( |
1503 filesel = gtk_file_chooser_dialog_new( |
| 1569 title ? title : (savedialog ? _("Save File...") |
1504 title ? title : (savedialog ? _("Save File...") |
| 1570 : _("Open File...")), |
1505 : _("Open File...")), |
| 1571 NULL, |
1506 NULL, |
| 1572 savedialog ? GTK_FILE_CHOOSER_ACTION_SAVE |
1507 savedialog ? GTK_FILE_CHOOSER_ACTION_SAVE |
| 1608 } |
1543 } |
| 1609 |
1544 |
| 1610 #endif |
1545 #endif |
| 1611 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(filesel)), "response", |
1546 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(filesel)), "response", |
| 1612 G_CALLBACK(file_ok_check_if_exists_cb), data); |
1547 G_CALLBACK(file_ok_check_if_exists_cb), data); |
| 1613 #else /* FILECHOOSER */ |
|
| 1614 filesel = gtk_file_selection_new( |
|
| 1615 title ? title : (savedialog ? _("Save File...") |
|
| 1616 : _("Open File..."))); |
|
| 1617 if (savedialog) { |
|
| 1618 current_folder = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/filelocations/last_save_folder"); |
|
| 1619 } else { |
|
| 1620 current_folder = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder"); |
|
| 1621 } |
|
| 1622 if (current_folder != NULL) { |
|
| 1623 gchar *path = g_strdup_printf("%s%s", current_folder, G_DIR_SEPARATOR_S); |
|
| 1624 gtk_file_selection_set_filename(GTK_FILE_SELECTION(filesel), path); |
|
| 1625 g_free(path); |
|
| 1626 } |
|
| 1627 if (filename != NULL) |
|
| 1628 gtk_file_selection_set_filename(GTK_FILE_SELECTION(filesel), filename); |
|
| 1629 |
|
| 1630 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(filesel)), "delete_event", |
|
| 1631 G_CALLBACK(file_cancel_cb), data); |
|
| 1632 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button), |
|
| 1633 "clicked", G_CALLBACK(file_cancel_cb), data); |
|
| 1634 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked", |
|
| 1635 G_CALLBACK(file_ok_check_if_exists_cb), data); |
|
| 1636 #endif /* FILECHOOSER */ |
|
| 1637 |
1548 |
| 1638 pidgin_auto_parent_window(filesel); |
1549 pidgin_auto_parent_window(filesel); |
| 1639 |
1550 |
| 1640 data->dialog = filesel; |
1551 data->dialog = filesel; |
| 1641 gtk_widget_show(filesel); |
1552 gtk_widget_show(filesel); |
| 1659 data->cbs = g_new0(GCallback, 2); |
1570 data->cbs = g_new0(GCallback, 2); |
| 1660 data->cbs[0] = cancel_cb; |
1571 data->cbs[0] = cancel_cb; |
| 1661 data->cbs[1] = ok_cb; |
1572 data->cbs[1] = ok_cb; |
| 1662 data->u.file.savedialog = FALSE; |
1573 data->u.file.savedialog = FALSE; |
| 1663 |
1574 |
| 1664 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ |
|
| 1665 dirsel = gtk_file_chooser_dialog_new( |
1575 dirsel = gtk_file_chooser_dialog_new( |
| 1666 title ? title : _("Select Folder..."), |
1576 title ? title : _("Select Folder..."), |
| 1667 NULL, |
1577 NULL, |
| 1668 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, |
1578 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, |
| 1669 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, |
1579 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, |
| 1674 if ((dirname != NULL) && (*dirname != '\0')) |
1584 if ((dirname != NULL) && (*dirname != '\0')) |
| 1675 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dirsel), dirname); |
1585 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dirsel), dirname); |
| 1676 |
1586 |
| 1677 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(dirsel)), "response", |
1587 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(dirsel)), "response", |
| 1678 G_CALLBACK(file_ok_check_if_exists_cb), data); |
1588 G_CALLBACK(file_ok_check_if_exists_cb), data); |
| 1679 #else |
|
| 1680 dirsel = gtk_file_selection_new(title ? title : _("Select Folder...")); |
|
| 1681 |
|
| 1682 g_signal_connect_swapped(G_OBJECT(dirsel), "delete_event", |
|
| 1683 G_CALLBACK(file_cancel_cb), data); |
|
| 1684 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(dirsel)->cancel_button), |
|
| 1685 "clicked", G_CALLBACK(file_cancel_cb), data); |
|
| 1686 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dirsel)->ok_button), "clicked", |
|
| 1687 G_CALLBACK(file_ok_check_if_exists_cb), data); |
|
| 1688 #endif |
|
| 1689 |
1589 |
| 1690 data->dialog = dirsel; |
1590 data->dialog = dirsel; |
| 1691 pidgin_auto_parent_window(dirsel); |
1591 pidgin_auto_parent_window(dirsel); |
| 1692 |
1592 |
| 1693 gtk_widget_show(dirsel); |
1593 gtk_widget_show(dirsel); |