| 78 |
78 |
| 79 } u; |
79 } u; |
| 80 |
80 |
| 81 } PidginRequestData; |
81 } PidginRequestData; |
| 82 |
82 |
| 83 static GtkWindow * |
|
| 84 find_toplevel(GList *ll_toplevels, const char *role) |
|
| 85 { |
|
| 86 const char *window_role = NULL; |
|
| 87 GList *ll_itr = NULL; |
|
| 88 |
|
| 89 for (ll_itr = ll_toplevels ; ll_itr ; ll_itr = ll_itr->next) { |
|
| 90 if ((window_role = gtk_window_get_role(GTK_WINDOW(ll_itr->data))) != NULL) { |
|
| 91 if (!strcmp(window_role, role)) |
|
| 92 return GTK_WINDOW(ll_itr->data); |
|
| 93 } |
|
| 94 } |
|
| 95 |
|
| 96 return NULL; |
|
| 97 } |
|
| 98 |
|
| 99 static GtkWindow * |
|
| 100 get_request_parent(const char *ui_hint, PidginConversation *convo) |
|
| 101 { |
|
| 102 GtkWindow *toplevel = NULL; |
|
| 103 PidginBuddyList *blist = NULL; |
|
| 104 |
|
| 105 if (convo) |
|
| 106 return GTK_WINDOW(convo->win->window); |
|
| 107 |
|
| 108 if (strcmp(ui_hint, PURPLE_REQUEST_UI_HINT_BLIST)) { |
|
| 109 GList *ll_toplevels = NULL; |
|
| 110 |
|
| 111 ll_toplevels = gtk_window_list_toplevels(); |
|
| 112 |
|
| 113 if (!(toplevel = find_toplevel(ll_toplevels, ui_hint))) { |
|
| 114 if (!strcmp(ui_hint, PURPLE_REQUEST_UI_HINT_REGISTER)) |
|
| 115 toplevel = find_toplevel(ll_toplevels, "account"); |
|
| 116 else |
|
| 117 if (!strcmp(ui_hint, PURPLE_REQUEST_UI_HINT_XFER)) |
|
| 118 toplevel = find_toplevel(ll_toplevels, "file transfer"); |
|
| 119 } |
|
| 120 |
|
| 121 g_list_free(ll_toplevels); |
|
| 122 } |
|
| 123 |
|
| 124 /* Takes care of "pidgin-statusbox" as well */ |
|
| 125 if (!toplevel) |
|
| 126 if ((blist = pidgin_blist_get_default_gtk_blist()) != NULL) |
|
| 127 return GTK_WINDOW(blist->window); |
|
| 128 |
|
| 129 return toplevel; |
|
| 130 } |
|
| 131 |
|
| 132 static void |
83 static void |
| 133 generic_response_start(PidginRequestData *data) |
84 generic_response_start(PidginRequestData *data) |
| 134 { |
85 { |
| 135 g_return_if_fail(data != NULL); |
86 g_return_if_fail(data != NULL); |
| 136 |
87 |
| 335 const char *secondary, const char *default_value, |
286 const char *secondary, const char *default_value, |
| 336 gboolean multiline, gboolean masked, gchar *hint, |
287 gboolean multiline, gboolean masked, gchar *hint, |
| 337 const char *ok_text, GCallback ok_cb, |
288 const char *ok_text, GCallback ok_cb, |
| 338 const char *cancel_text, GCallback cancel_cb, |
289 const char *cancel_text, GCallback cancel_cb, |
| 339 PurpleAccount *account, const char *who, PurpleConversation *conv, |
290 PurpleAccount *account, const char *who, PurpleConversation *conv, |
| 340 const char *ui_hint, void *user_data) |
291 void *user_data) |
| 341 { |
292 { |
| 342 PidginRequestData *data; |
293 PidginRequestData *data; |
| 343 GtkWidget *dialog; |
294 GtkWidget *dialog; |
| 344 GtkWidget *vbox; |
295 GtkWidget *vbox; |
| 345 GtkWidget *hbox; |
296 GtkWidget *hbox; |
| 360 data->cbs[0] = ok_cb; |
311 data->cbs[0] = ok_cb; |
| 361 data->cbs[1] = cancel_cb; |
312 data->cbs[1] = cancel_cb; |
| 362 |
313 |
| 363 /* Create the dialog. */ |
314 /* Create the dialog. */ |
| 364 dialog = gtk_dialog_new_with_buttons(title ? title : PIDGIN_ALERT_TITLE, |
315 dialog = gtk_dialog_new_with_buttons(title ? title : PIDGIN_ALERT_TITLE, |
| 365 get_request_parent(ui_hint, conv ? PIDGIN_CONVERSATION(conv) : NULL), 0, |
316 NULL, 0, |
| 366 text_to_stock(cancel_text), 1, |
317 text_to_stock(cancel_text), 1, |
| 367 text_to_stock(ok_text), 0, |
318 text_to_stock(ok_text), 0, |
| 368 NULL); |
319 NULL); |
| 369 data->dialog = dialog; |
320 data->dialog = dialog; |
| 370 |
321 |
| 498 pidgin_request_choice(const char *title, const char *primary, |
449 pidgin_request_choice(const char *title, const char *primary, |
| 499 const char *secondary, int default_value, |
450 const char *secondary, int default_value, |
| 500 const char *ok_text, GCallback ok_cb, |
451 const char *ok_text, GCallback ok_cb, |
| 501 const char *cancel_text, GCallback cancel_cb, |
452 const char *cancel_text, GCallback cancel_cb, |
| 502 PurpleAccount *account, const char *who, PurpleConversation *conv, |
453 PurpleAccount *account, const char *who, PurpleConversation *conv, |
| 503 const char *ui_hint, void *user_data, va_list args) |
454 void *user_data, va_list args) |
| 504 { |
455 { |
| 505 PidginRequestData *data; |
456 PidginRequestData *data; |
| 506 GtkWidget *dialog; |
457 GtkWidget *dialog; |
| 507 GtkWidget *vbox, *vbox2; |
458 GtkWidget *vbox, *vbox2; |
| 508 GtkWidget *hbox; |
459 GtkWidget *hbox; |
| 522 data->cbs[0] = cancel_cb; |
473 data->cbs[0] = cancel_cb; |
| 523 data->cbs[1] = ok_cb; |
474 data->cbs[1] = ok_cb; |
| 524 |
475 |
| 525 /* Create the dialog. */ |
476 /* Create the dialog. */ |
| 526 data->dialog = dialog = gtk_dialog_new(); |
477 data->dialog = dialog = gtk_dialog_new(); |
| 527 gtk_window_set_transient_for(GTK_WINDOW(dialog), |
|
| 528 get_request_parent(ui_hint, conv ? PIDGIN_CONVERSATION(conv) : NULL)); |
|
| 529 |
478 |
| 530 if (title != NULL) |
479 if (title != NULL) |
| 531 gtk_window_set_title(GTK_WINDOW(dialog), title); |
480 gtk_window_set_title(GTK_WINDOW(dialog), title); |
| 532 #ifdef _WIN32 |
481 #ifdef _WIN32 |
| 533 gtk_window_set_title(GTK_WINDOW(dialog), PIDGIN_ALERT_TITLE); |
482 gtk_window_set_title(GTK_WINDOW(dialog), PIDGIN_ALERT_TITLE); |
| 604 |
553 |
| 605 static void * |
554 static void * |
| 606 pidgin_request_action(const char *title, const char *primary, |
555 pidgin_request_action(const char *title, const char *primary, |
| 607 const char *secondary, int default_action, |
556 const char *secondary, int default_action, |
| 608 PurpleAccount *account, const char *who, PurpleConversation *conv, |
557 PurpleAccount *account, const char *who, PurpleConversation *conv, |
| 609 const char *ui_hint, void *user_data, size_t action_count, va_list actions) |
558 void *user_data, size_t action_count, va_list actions) |
| 610 { |
559 { |
| 611 PidginRequestData *data; |
560 PidginRequestData *data; |
| 612 GtkWidget *dialog; |
561 GtkWidget *dialog; |
| 613 GtkWidget *vbox; |
562 GtkWidget *vbox; |
| 614 GtkWidget *hbox; |
563 GtkWidget *hbox; |
| 634 buttons[(action_count * 2) - i - 1] = va_arg(actions, GCallback); |
583 buttons[(action_count * 2) - i - 1] = va_arg(actions, GCallback); |
| 635 } |
584 } |
| 636 |
585 |
| 637 /* Create the dialog. */ |
586 /* Create the dialog. */ |
| 638 data->dialog = dialog = gtk_dialog_new(); |
587 data->dialog = dialog = gtk_dialog_new(); |
| 639 gtk_window_set_transient_for(GTK_WINDOW(dialog), |
|
| 640 get_request_parent(ui_hint, conv ? PIDGIN_CONVERSATION(conv) : NULL)); |
|
| 641 |
588 |
| 642 #if GTK_CHECK_VERSION(2,10,0) |
589 #if GTK_CHECK_VERSION(2,10,0) |
| 643 gtk_window_set_deletable(GTK_WINDOW(data->dialog), FALSE); |
590 gtk_window_set_deletable(GTK_WINDOW(data->dialog), FALSE); |
| 644 #endif |
591 #endif |
| 645 |
592 |
| 1189 pidgin_request_fields(const char *title, const char *primary, |
1136 pidgin_request_fields(const char *title, const char *primary, |
| 1190 const char *secondary, PurpleRequestFields *fields, |
1137 const char *secondary, PurpleRequestFields *fields, |
| 1191 const char *ok_text, GCallback ok_cb, |
1138 const char *ok_text, GCallback ok_cb, |
| 1192 const char *cancel_text, GCallback cancel_cb, |
1139 const char *cancel_text, GCallback cancel_cb, |
| 1193 PurpleAccount *account, const char *who, PurpleConversation *conv, |
1140 PurpleAccount *account, const char *who, PurpleConversation *conv, |
| 1194 const char *ui_hint, void *user_data) |
1141 void *user_data) |
| 1195 { |
1142 { |
| 1196 PidginRequestData *data; |
1143 PidginRequestData *data; |
| 1197 GtkWidget *win; |
1144 GtkWidget *win; |
| 1198 GtkWidget *vbox; |
1145 GtkWidget *vbox; |
| 1199 GtkWidget *vbox2; |
1146 GtkWidget *vbox2; |
| 1230 #ifdef _WIN32 |
1177 #ifdef _WIN32 |
| 1231 data->dialog = win = pidgin_create_window(PIDGIN_ALERT_TITLE, PIDGIN_HIG_BORDER, "multifield", TRUE) ; |
1178 data->dialog = win = pidgin_create_window(PIDGIN_ALERT_TITLE, PIDGIN_HIG_BORDER, "multifield", TRUE) ; |
| 1232 #else /* !_WIN32 */ |
1179 #else /* !_WIN32 */ |
| 1233 data->dialog = win = pidgin_create_window(title, PIDGIN_HIG_BORDER, "multifield", TRUE) ; |
1180 data->dialog = win = pidgin_create_window(title, PIDGIN_HIG_BORDER, "multifield", TRUE) ; |
| 1234 #endif /* _WIN32 */ |
1181 #endif /* _WIN32 */ |
| 1235 gtk_window_set_transient_for(GTK_WINDOW(win), |
|
| 1236 get_request_parent(ui_hint, conv ? PIDGIN_CONVERSATION(conv) : NULL)); |
|
| 1237 |
1182 |
| 1238 g_signal_connect(G_OBJECT(win), "delete_event", |
1183 g_signal_connect(G_OBJECT(win), "delete_event", |
| 1239 G_CALLBACK(destroy_multifield_cb), data); |
1184 G_CALLBACK(destroy_multifield_cb), data); |
| 1240 |
1185 |
| 1241 /* Setup the main horizontal box */ |
1186 /* Setup the main horizontal box */ |
| 1646 |
1591 |
| 1647 #endif /* FILECHOOSER */ |
1592 #endif /* FILECHOOSER */ |
| 1648 |
1593 |
| 1649 if ((data->u.file.savedialog == TRUE) && |
1594 if ((data->u.file.savedialog == TRUE) && |
| 1650 (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) { |
1595 (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) { |
| 1651 purple_request_action_with_hint(data, NULL, _("That file already exists"), |
1596 purple_request_action(data, NULL, _("That file already exists"), |
| 1652 _("Would you like to overwrite it?"), 0, |
1597 _("Would you like to overwrite it?"), 0, |
| 1653 NULL, NULL, NULL, |
1598 NULL, NULL, NULL, |
| 1654 "pidgin-request-file", data, 2, |
1599 data, 2, |
| 1655 _("Overwrite"), G_CALLBACK(file_yes_no_cb), |
1600 _("Overwrite"), G_CALLBACK(file_yes_no_cb), |
| 1656 _("Choose New Name"), G_CALLBACK(file_yes_no_cb)); |
1601 _("Choose New Name"), G_CALLBACK(file_yes_no_cb)); |
| 1657 } else |
1602 } else |
| 1658 file_yes_no_cb(data, 1); |
1603 file_yes_no_cb(data, 1); |
| 1659 } |
1604 } |
| 1674 static void * |
1619 static void * |
| 1675 pidgin_request_file(const char *title, const char *filename, |
1620 pidgin_request_file(const char *title, const char *filename, |
| 1676 gboolean savedialog, |
1621 gboolean savedialog, |
| 1677 GCallback ok_cb, GCallback cancel_cb, |
1622 GCallback ok_cb, GCallback cancel_cb, |
| 1678 PurpleAccount *account, const char *who, PurpleConversation *conv, |
1623 PurpleAccount *account, const char *who, PurpleConversation *conv, |
| 1679 const char *ui_hint, void *user_data) |
1624 void *user_data) |
| 1680 { |
1625 { |
| 1681 PidginRequestData *data; |
1626 PidginRequestData *data; |
| 1682 GtkWidget *filesel; |
1627 GtkWidget *filesel; |
| 1683 const gchar *current_folder; |
1628 const gchar *current_folder; |
| 1684 #if GTK_CHECK_VERSION(2,4,0) |
1629 #if GTK_CHECK_VERSION(2,4,0) |
| 1762 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button), |
1707 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button), |
| 1763 "clicked", G_CALLBACK(file_cancel_cb), data); |
1708 "clicked", G_CALLBACK(file_cancel_cb), data); |
| 1764 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked", |
1709 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked", |
| 1765 G_CALLBACK(file_ok_check_if_exists_cb), data); |
1710 G_CALLBACK(file_ok_check_if_exists_cb), data); |
| 1766 #endif /* FILECHOOSER */ |
1711 #endif /* FILECHOOSER */ |
| 1767 gtk_window_set_role(GTK_WINDOW(filesel), "pidgin-request-file"); |
|
| 1768 gtk_window_set_transient_for(GTK_WINDOW(filesel), |
|
| 1769 get_request_parent(ui_hint, conv ? PIDGIN_CONVERSATION(conv) : NULL)); |
|
| 1770 |
1712 |
| 1771 data->dialog = filesel; |
1713 data->dialog = filesel; |
| 1772 gtk_widget_show(filesel); |
1714 gtk_widget_show(filesel); |
| 1773 |
1715 |
| 1774 return (void *)data; |
1716 return (void *)data; |
| 1776 |
1718 |
| 1777 static void * |
1719 static void * |
| 1778 pidgin_request_folder(const char *title, const char *dirname, |
1720 pidgin_request_folder(const char *title, const char *dirname, |
| 1779 GCallback ok_cb, GCallback cancel_cb, |
1721 GCallback ok_cb, GCallback cancel_cb, |
| 1780 PurpleAccount *account, const char *who, PurpleConversation *conv, |
1722 PurpleAccount *account, const char *who, PurpleConversation *conv, |
| 1781 const char *ui_hint, void *user_data) |
1723 void *user_data) |
| 1782 { |
1724 { |
| 1783 PidginRequestData *data; |
1725 PidginRequestData *data; |
| 1784 GtkWidget *dirsel; |
1726 GtkWidget *dirsel; |
| 1785 |
1727 |
| 1786 data = g_new0(PidginRequestData, 1); |
1728 data = g_new0(PidginRequestData, 1); |
| 1815 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(dirsel)->cancel_button), |
1757 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(dirsel)->cancel_button), |
| 1816 "clicked", G_CALLBACK(file_cancel_cb), data); |
1758 "clicked", G_CALLBACK(file_cancel_cb), data); |
| 1817 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dirsel)->ok_button), "clicked", |
1759 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dirsel)->ok_button), "clicked", |
| 1818 G_CALLBACK(file_ok_check_if_exists_cb), data); |
1760 G_CALLBACK(file_ok_check_if_exists_cb), data); |
| 1819 #endif |
1761 #endif |
| 1820 gtk_window_set_role(GTK_WINDOW(dirsel), "pidgin-request-dir"); |
|
| 1821 gtk_window_set_transient_for(GTK_WINDOW(dirsel), |
|
| 1822 get_request_parent(ui_hint, conv ? PIDGIN_CONVERSATION(conv) : NULL)); |
|
| 1823 |
1762 |
| 1824 data->dialog = dirsel; |
1763 data->dialog = dirsel; |
| 1825 gtk_widget_show(dirsel); |
1764 gtk_widget_show(dirsel); |
| 1826 |
1765 |
| 1827 return (void *)data; |
1766 return (void *)data; |