comparison pidgin/gtkrequest.c @ 21097:c5f9e1eb59d5

explicit merge of '2762c6075c0dc52a96098c5478c5bf68cfd890a3' and '638a81810eee15c031244d359e648f9e7722a8d1' to branch 'org.maemo.garage.pidgin.pidgin.request-with-ui-hint'
author Richard Laager <rlaager@wiktel.com>
date Sun, 14 Oct 2007 01:57:08 +0000
parents 285bb637a2b7
children 8c9aad9479c0 0b67d509a305
comparison
equal deleted inserted replaced
20921:b2b16843851b 21097:c5f9e1eb59d5
32 #include "gtkimhtml.h" 32 #include "gtkimhtml.h"
33 #include "gtkimhtmltoolbar.h" 33 #include "gtkimhtmltoolbar.h"
34 #include "gtkrequest.h" 34 #include "gtkrequest.h"
35 #include "gtkutils.h" 35 #include "gtkutils.h"
36 #include "pidginstock.h" 36 #include "pidginstock.h"
37 #include "gtkblist.h"
37 38
38 #include <gdk/gdkkeysyms.h> 39 #include <gdk/gdkkeysyms.h>
39 40
40 static GtkWidget * create_account_field(PurpleRequestField *field); 41 static GtkWidget * create_account_field(PurpleRequestField *field);
41 42
76 } file; 77 } file;
77 78
78 } u; 79 } u;
79 80
80 } PidginRequestData; 81 } PidginRequestData;
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, "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, "register-account"))
115 toplevel = find_toplevel(ll_toplevels, "account");
116 else
117 if (!strcmp(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 }
81 131
82 static void 132 static void
83 generic_response_start(PidginRequestData *data) 133 generic_response_start(PidginRequestData *data)
84 { 134 {
85 g_return_if_fail(data != NULL); 135 g_return_if_fail(data != NULL);
285 const char *secondary, const char *default_value, 335 const char *secondary, const char *default_value,
286 gboolean multiline, gboolean masked, gchar *hint, 336 gboolean multiline, gboolean masked, gchar *hint,
287 const char *ok_text, GCallback ok_cb, 337 const char *ok_text, GCallback ok_cb,
288 const char *cancel_text, GCallback cancel_cb, 338 const char *cancel_text, GCallback cancel_cb,
289 PurpleAccount *account, const char *who, PurpleConversation *conv, 339 PurpleAccount *account, const char *who, PurpleConversation *conv,
290 void *user_data) 340 const char *ui_hint, void *user_data)
291 { 341 {
292 PidginRequestData *data; 342 PidginRequestData *data;
293 GtkWidget *dialog; 343 GtkWidget *dialog;
294 GtkWidget *vbox; 344 GtkWidget *vbox;
295 GtkWidget *hbox; 345 GtkWidget *hbox;
310 data->cbs[0] = ok_cb; 360 data->cbs[0] = ok_cb;
311 data->cbs[1] = cancel_cb; 361 data->cbs[1] = cancel_cb;
312 362
313 /* Create the dialog. */ 363 /* Create the dialog. */
314 dialog = gtk_dialog_new_with_buttons(title ? title : PIDGIN_ALERT_TITLE, 364 dialog = gtk_dialog_new_with_buttons(title ? title : PIDGIN_ALERT_TITLE,
315 NULL, 0, 365 get_request_parent(ui_hint, conv ? PIDGIN_CONVERSATION(conv) : NULL), 0,
316 text_to_stock(cancel_text), 1, 366 text_to_stock(cancel_text), 1,
317 text_to_stock(ok_text), 0, 367 text_to_stock(ok_text), 0,
318 NULL); 368 NULL);
319 data->dialog = dialog; 369 data->dialog = dialog;
320 370
448 pidgin_request_choice(const char *title, const char *primary, 498 pidgin_request_choice(const char *title, const char *primary,
449 const char *secondary, int default_value, 499 const char *secondary, int default_value,
450 const char *ok_text, GCallback ok_cb, 500 const char *ok_text, GCallback ok_cb,
451 const char *cancel_text, GCallback cancel_cb, 501 const char *cancel_text, GCallback cancel_cb,
452 PurpleAccount *account, const char *who, PurpleConversation *conv, 502 PurpleAccount *account, const char *who, PurpleConversation *conv,
453 void *user_data, va_list args) 503 const char *ui_hint, void *user_data, va_list args)
454 { 504 {
455 PidginRequestData *data; 505 PidginRequestData *data;
456 GtkWidget *dialog; 506 GtkWidget *dialog;
457 GtkWidget *vbox, *vbox2; 507 GtkWidget *vbox, *vbox2;
458 GtkWidget *hbox; 508 GtkWidget *hbox;
472 data->cbs[0] = cancel_cb; 522 data->cbs[0] = cancel_cb;
473 data->cbs[1] = ok_cb; 523 data->cbs[1] = ok_cb;
474 524
475 /* Create the dialog. */ 525 /* Create the dialog. */
476 data->dialog = dialog = gtk_dialog_new(); 526 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));
477 529
478 if (title != NULL) 530 if (title != NULL)
479 gtk_window_set_title(GTK_WINDOW(dialog), title); 531 gtk_window_set_title(GTK_WINDOW(dialog), title);
480 #ifdef _WIN32 532 #ifdef _WIN32
481 gtk_window_set_title(GTK_WINDOW(dialog), PIDGIN_ALERT_TITLE); 533 gtk_window_set_title(GTK_WINDOW(dialog), PIDGIN_ALERT_TITLE);
552 604
553 static void * 605 static void *
554 pidgin_request_action(const char *title, const char *primary, 606 pidgin_request_action(const char *title, const char *primary,
555 const char *secondary, int default_action, 607 const char *secondary, int default_action,
556 PurpleAccount *account, const char *who, PurpleConversation *conv, 608 PurpleAccount *account, const char *who, PurpleConversation *conv,
557 void *user_data, size_t action_count, va_list actions) 609 const char *ui_hint, void *user_data, size_t action_count, va_list actions)
558 { 610 {
559 PidginRequestData *data; 611 PidginRequestData *data;
560 GtkWidget *dialog; 612 GtkWidget *dialog;
561 GtkWidget *vbox; 613 GtkWidget *vbox;
562 GtkWidget *hbox; 614 GtkWidget *hbox;
582 buttons[(action_count * 2) - i - 1] = va_arg(actions, GCallback); 634 buttons[(action_count * 2) - i - 1] = va_arg(actions, GCallback);
583 } 635 }
584 636
585 /* Create the dialog. */ 637 /* Create the dialog. */
586 data->dialog = dialog = gtk_dialog_new(); 638 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));
587 641
588 #if GTK_CHECK_VERSION(2,10,0) 642 #if GTK_CHECK_VERSION(2,10,0)
589 gtk_window_set_deletable(GTK_WINDOW(data->dialog), FALSE); 643 gtk_window_set_deletable(GTK_WINDOW(data->dialog), FALSE);
590 #endif 644 #endif
591 645
1049 pidgin_request_fields(const char *title, const char *primary, 1103 pidgin_request_fields(const char *title, const char *primary,
1050 const char *secondary, PurpleRequestFields *fields, 1104 const char *secondary, PurpleRequestFields *fields,
1051 const char *ok_text, GCallback ok_cb, 1105 const char *ok_text, GCallback ok_cb,
1052 const char *cancel_text, GCallback cancel_cb, 1106 const char *cancel_text, GCallback cancel_cb,
1053 PurpleAccount *account, const char *who, PurpleConversation *conv, 1107 PurpleAccount *account, const char *who, PurpleConversation *conv,
1054 void *user_data) 1108 const char *ui_hint, void *user_data)
1055 { 1109 {
1056 PidginRequestData *data; 1110 PidginRequestData *data;
1057 GtkWidget *win; 1111 GtkWidget *win;
1058 GtkWidget *vbox; 1112 GtkWidget *vbox;
1059 GtkWidget *vbox2; 1113 GtkWidget *vbox2;
1090 #ifdef _WIN32 1144 #ifdef _WIN32
1091 data->dialog = win = pidgin_create_window(PIDGIN_ALERT_TITLE, PIDGIN_HIG_BORDER, "multifield", TRUE) ; 1145 data->dialog = win = pidgin_create_window(PIDGIN_ALERT_TITLE, PIDGIN_HIG_BORDER, "multifield", TRUE) ;
1092 #else /* !_WIN32 */ 1146 #else /* !_WIN32 */
1093 data->dialog = win = pidgin_create_window(title, PIDGIN_HIG_BORDER, "multifield", TRUE) ; 1147 data->dialog = win = pidgin_create_window(title, PIDGIN_HIG_BORDER, "multifield", TRUE) ;
1094 #endif /* _WIN32 */ 1148 #endif /* _WIN32 */
1149 gtk_window_set_transient_for(GTK_WINDOW(win),
1150 get_request_parent(ui_hint, conv ? PIDGIN_CONVERSATION(conv) : NULL));
1095 1151
1096 g_signal_connect(G_OBJECT(win), "delete_event", 1152 g_signal_connect(G_OBJECT(win), "delete_event",
1097 G_CALLBACK(destroy_multifield_cb), data); 1153 G_CALLBACK(destroy_multifield_cb), data);
1098 1154
1099 /* Setup the main horizontal box */ 1155 /* Setup the main horizontal box */
1502 1558
1503 #endif /* FILECHOOSER */ 1559 #endif /* FILECHOOSER */
1504 1560
1505 if ((data->u.file.savedialog == TRUE) && 1561 if ((data->u.file.savedialog == TRUE) &&
1506 (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) { 1562 (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) {
1507 purple_request_action(data, NULL, _("That file already exists"), 1563 purple_request_action_with_hint(data, NULL, _("That file already exists"),
1508 _("Would you like to overwrite it?"), 0, 1564 _("Would you like to overwrite it?"), 0,
1509 NULL, NULL, NULL, 1565 NULL, NULL, NULL,
1510 data, 2, 1566 "pidgin-request-file", data, 2,
1511 _("Overwrite"), G_CALLBACK(file_yes_no_cb), 1567 _("Overwrite"), G_CALLBACK(file_yes_no_cb),
1512 _("Choose New Name"), G_CALLBACK(file_yes_no_cb)); 1568 _("Choose New Name"), G_CALLBACK(file_yes_no_cb));
1513 } else 1569 } else
1514 file_yes_no_cb(data, 1); 1570 file_yes_no_cb(data, 1);
1515 } 1571 }
1530 static void * 1586 static void *
1531 pidgin_request_file(const char *title, const char *filename, 1587 pidgin_request_file(const char *title, const char *filename,
1532 gboolean savedialog, 1588 gboolean savedialog,
1533 GCallback ok_cb, GCallback cancel_cb, 1589 GCallback ok_cb, GCallback cancel_cb,
1534 PurpleAccount *account, const char *who, PurpleConversation *conv, 1590 PurpleAccount *account, const char *who, PurpleConversation *conv,
1535 void *user_data) 1591 const char *ui_hint, void *user_data)
1536 { 1592 {
1537 PidginRequestData *data; 1593 PidginRequestData *data;
1538 GtkWidget *filesel; 1594 GtkWidget *filesel;
1539 const gchar *current_folder; 1595 const gchar *current_folder;
1540 #if GTK_CHECK_VERSION(2,4,0) 1596 #if GTK_CHECK_VERSION(2,4,0)
1618 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button), 1674 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button),
1619 "clicked", G_CALLBACK(file_cancel_cb), data); 1675 "clicked", G_CALLBACK(file_cancel_cb), data);
1620 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked", 1676 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked",
1621 G_CALLBACK(file_ok_check_if_exists_cb), data); 1677 G_CALLBACK(file_ok_check_if_exists_cb), data);
1622 #endif /* FILECHOOSER */ 1678 #endif /* FILECHOOSER */
1679 gtk_window_set_role(GTK_WINDOW(filesel), "pidgin-request-file");
1680 gtk_window_set_transient_for(GTK_WINDOW(filesel),
1681 get_request_parent(ui_hint, conv ? PIDGIN_CONVERSATION(conv) : NULL));
1623 1682
1624 data->dialog = filesel; 1683 data->dialog = filesel;
1625 gtk_widget_show(filesel); 1684 gtk_widget_show(filesel);
1626 1685
1627 return (void *)data; 1686 return (void *)data;
1629 1688
1630 static void * 1689 static void *
1631 pidgin_request_folder(const char *title, const char *dirname, 1690 pidgin_request_folder(const char *title, const char *dirname,
1632 GCallback ok_cb, GCallback cancel_cb, 1691 GCallback ok_cb, GCallback cancel_cb,
1633 PurpleAccount *account, const char *who, PurpleConversation *conv, 1692 PurpleAccount *account, const char *who, PurpleConversation *conv,
1634 void *user_data) 1693 const char *ui_hint, void *user_data)
1635 { 1694 {
1636 PidginRequestData *data; 1695 PidginRequestData *data;
1637 GtkWidget *dirsel; 1696 GtkWidget *dirsel;
1638 1697
1639 data = g_new0(PidginRequestData, 1); 1698 data = g_new0(PidginRequestData, 1);
1668 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(dirsel)->cancel_button), 1727 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(dirsel)->cancel_button),
1669 "clicked", G_CALLBACK(file_cancel_cb), data); 1728 "clicked", G_CALLBACK(file_cancel_cb), data);
1670 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dirsel)->ok_button), "clicked", 1729 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dirsel)->ok_button), "clicked",
1671 G_CALLBACK(file_ok_check_if_exists_cb), data); 1730 G_CALLBACK(file_ok_check_if_exists_cb), data);
1672 #endif 1731 #endif
1732 gtk_window_set_role(GTK_WINDOW(dirsel), "pidgin-request-dir");
1733 gtk_window_set_transient_for(GTK_WINDOW(dirsel),
1734 get_request_parent(ui_hint, conv ? PIDGIN_CONVERSATION(conv) : NULL));
1673 1735
1674 data->dialog = dirsel; 1736 data->dialog = dirsel;
1675 gtk_widget_show(dirsel); 1737 gtk_widget_show(dirsel);
1676 1738
1677 return (void *)data; 1739 return (void *)data;