pidgin/gtkrequest.c

branch
next.minor
changeset 29499
08832cbd946b
parent 27660
f9d3ec6e177e
child 29638
13c95d82cb5f
equal deleted inserted replaced
29498:6003eba1e2e2 29499:08832cbd946b
593 } 593 }
594 594
595 /* Create the dialog. */ 595 /* Create the dialog. */
596 data->dialog = dialog = gtk_dialog_new(); 596 data->dialog = dialog = gtk_dialog_new();
597 597
598 #if GTK_CHECK_VERSION(2,10,0)
599 gtk_window_set_deletable(GTK_WINDOW(data->dialog), FALSE); 598 gtk_window_set_deletable(GTK_WINDOW(data->dialog), FALSE);
600 #endif
601 599
602 if (title != NULL) 600 if (title != NULL)
603 gtk_window_set_title(GTK_WINDOW(dialog), title); 601 gtk_window_set_title(GTK_WINDOW(dialog), title);
604 #ifdef _WIN32 602 #ifdef _WIN32
605 else 603 else
1443 } else { 1441 } else {
1444 pidgin_clear_cursor(GTK_WIDGET(data->dialog)); 1442 pidgin_clear_cursor(GTK_WIDGET(data->dialog));
1445 } 1443 }
1446 } 1444 }
1447 1445
1448 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
1449 static void 1446 static void
1450 file_ok_check_if_exists_cb(GtkWidget *widget, gint response, PidginRequestData *data) 1447 file_ok_check_if_exists_cb(GtkWidget *widget, gint response, PidginRequestData *data)
1451 { 1448 {
1452 gchar *current_folder; 1449 gchar *current_folder;
1453 1450
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);

mercurial