comparison pidgin/gtkrequest.c @ 21560:665e04562de0

This merge has the effect of reverting the hinting code from trunk.
author Richard Laager <rlaager@wiktel.com>
date Sat, 17 Nov 2007 00:12:30 +0000
parents 283f8bf540b3 fcb848b2d669
children 1b174854bb80
comparison
equal deleted inserted replaced
21544:9b4d1af17ced 21560:665e04562de0
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;