pidgin/gtkrequest.c

branch
next.minor
changeset 29638
13c95d82cb5f
parent 28793
31a37be33d28
parent 29499
08832cbd946b
child 29686
f9dee36112d0
equal deleted inserted replaced
28799:2ed8df75a7de 29638:13c95d82cb5f
624 } 624 }
625 625
626 /* Create the dialog. */ 626 /* Create the dialog. */
627 data->dialog = dialog = gtk_dialog_new(); 627 data->dialog = dialog = gtk_dialog_new();
628 628
629 #if GTK_CHECK_VERSION(2,10,0)
630 gtk_window_set_deletable(GTK_WINDOW(data->dialog), FALSE); 629 gtk_window_set_deletable(GTK_WINDOW(data->dialog), FALSE);
631 #endif
632 630
633 if (title != NULL) 631 if (title != NULL)
634 gtk_window_set_title(GTK_WINDOW(dialog), title); 632 gtk_window_set_title(GTK_WINDOW(dialog), title);
635 #ifdef _WIN32 633 #ifdef _WIN32
636 else 634 else
1478 } else { 1476 } else {
1479 pidgin_clear_cursor(GTK_WIDGET(data->dialog)); 1477 pidgin_clear_cursor(GTK_WIDGET(data->dialog));
1480 } 1478 }
1481 } 1479 }
1482 1480
1483 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
1484 static void 1481 static void
1485 file_ok_check_if_exists_cb(GtkWidget *widget, gint response, PidginRequestData *data) 1482 file_ok_check_if_exists_cb(GtkWidget *widget, gint response, PidginRequestData *data)
1486 { 1483 {
1487 gchar *current_folder; 1484 gchar *current_folder;
1488 1485
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);

mercurial