Mercurial > pidgin
comparison pidgin/gtkutils.c @ 32672:3828a61c44da
A boring and large patch so I can merge heads.
author | Elliott Sales de Andrade <qulogic@pidgin.im> |
---|---|
date | Fri, 23 Dec 2011 08:21:58 +0000 |
parents | 698427ce5bbd |
children |
comparison
equal
deleted
inserted
replaced
32671:0e69949b3e61 | 32672:3828a61c44da |
---|---|
65 #include "gtkimhtml.h" | 65 #include "gtkimhtml.h" |
66 #include "gtkimhtmltoolbar.h" | 66 #include "gtkimhtmltoolbar.h" |
67 #include "pidginstock.h" | 67 #include "pidginstock.h" |
68 #include "gtkthemes.h" | 68 #include "gtkthemes.h" |
69 #include "gtkutils.h" | 69 #include "gtkutils.h" |
70 #include "gtkwebview.h" | |
70 #include "pidgin/minidialog.h" | 71 #include "pidgin/minidialog.h" |
72 | |
73 #if !GTK_CHECK_VERSION(2,18,0) | |
74 #define gtk_widget_get_visible(x) GTK_WIDGET_VISIBLE(x) | |
75 #define gtk_widget_is_sensitive(x) GTK_WIDGET_IS_SENSITIVE(x) | |
76 #endif | |
71 | 77 |
72 typedef struct { | 78 typedef struct { |
73 GtkTreeModel *model; | 79 GtkTreeModel *model; |
74 gint default_item; | 80 gint default_item; |
75 } AopMenu; | 81 } AopMenu; |
178 { | 184 { |
179 GtkWindow *wnd = NULL; | 185 GtkWindow *wnd = NULL; |
180 | 186 |
181 wnd = GTK_WINDOW(gtk_dialog_new()); | 187 wnd = GTK_WINDOW(gtk_dialog_new()); |
182 pidgin_window_init(wnd, title, border_width, role, resizable); | 188 pidgin_window_init(wnd, title, border_width, role, resizable); |
189 g_object_set(G_OBJECT(wnd), "has-separator", FALSE, NULL); | |
183 | 190 |
184 return GTK_WIDGET(wnd); | 191 return GTK_WIDGET(wnd); |
185 } | 192 } |
186 | 193 |
187 GtkWidget * | 194 GtkWidget * |
188 pidgin_dialog_get_vbox_with_properties(GtkDialog *dialog, gboolean homogeneous, gint spacing) | 195 pidgin_dialog_get_vbox_with_properties(GtkDialog *dialog, gboolean homogeneous, gint spacing) |
189 { | 196 { |
190 GtkBox *vbox = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); | 197 GtkBox *vbox = GTK_BOX(GTK_DIALOG(dialog)->vbox); |
191 gtk_box_set_homogeneous(vbox, homogeneous); | 198 gtk_box_set_homogeneous(vbox, homogeneous); |
192 gtk_box_set_spacing(vbox, spacing); | 199 gtk_box_set_spacing(vbox, spacing); |
193 return GTK_WIDGET(vbox); | 200 return GTK_WIDGET(vbox); |
194 } | 201 } |
195 | 202 |
196 GtkWidget *pidgin_dialog_get_vbox(GtkDialog *dialog) | 203 GtkWidget *pidgin_dialog_get_vbox(GtkDialog *dialog) |
197 { | 204 { |
198 return gtk_dialog_get_content_area(GTK_DIALOG(dialog)); | 205 return GTK_DIALOG(dialog)->vbox; |
199 } | 206 } |
200 | 207 |
201 GtkWidget *pidgin_dialog_get_action_area(GtkDialog *dialog) | 208 GtkWidget *pidgin_dialog_get_action_area(GtkDialog *dialog) |
202 { | 209 { |
203 return gtk_dialog_get_action_area(GTK_DIALOG(dialog)); | 210 return GTK_DIALOG(dialog)->action_area; |
204 } | 211 } |
205 | 212 |
206 GtkWidget *pidgin_dialog_add_button(GtkDialog *dialog, const char *label, | 213 GtkWidget *pidgin_dialog_add_button(GtkDialog *dialog, const char *label, |
207 GCallback callback, gpointer callbackdata) | 214 GCallback callback, gpointer callbackdata) |
208 { | 215 { |
273 *sw_ret = sw; | 280 *sw_ret = sw; |
274 | 281 |
275 return frame; | 282 return frame; |
276 } | 283 } |
277 | 284 |
285 GtkWidget * | |
286 pidgin_create_webview(gboolean editable, GtkWidget **webview_ret, GtkWidget **toolbar_ret, GtkWidget **sw_ret) | |
287 { | |
288 GtkWidget *frame; | |
289 GtkWidget *webview; | |
290 GtkWidget *sep; | |
291 GtkWidget *sw; | |
292 GtkWidget *toolbar = NULL; | |
293 GtkWidget *vbox; | |
294 | |
295 frame = gtk_frame_new(NULL); | |
296 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); | |
297 | |
298 vbox = gtk_vbox_new(FALSE, 0); | |
299 gtk_container_add(GTK_CONTAINER(frame), vbox); | |
300 gtk_widget_show(vbox); | |
301 | |
302 if (editable) { | |
303 toolbar = gtk_imhtmltoolbar_new(); | |
304 gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); | |
305 gtk_widget_show(toolbar); | |
306 | |
307 sep = gtk_hseparator_new(); | |
308 gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); | |
309 g_signal_connect_swapped(G_OBJECT(toolbar), "show", G_CALLBACK(gtk_widget_show), sep); | |
310 g_signal_connect_swapped(G_OBJECT(toolbar), "hide", G_CALLBACK(gtk_widget_hide), sep); | |
311 gtk_widget_show(sep); | |
312 } | |
313 | |
314 webview = gtk_webview_new(); | |
315 #if 0 | |
316 /* TODO WEBKIT: Don't have editable webview yet. */ | |
317 gtk_webview_set_editable(GTK_WEBVIEW(webview), editable); | |
318 #endif /* if 0 */ | |
319 #ifdef USE_GTKSPELL | |
320 if (editable && purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/spellcheck")) | |
321 pidgin_setup_gtkspell(GTK_TEXT_VIEW(webview)); | |
322 #endif | |
323 gtk_widget_show(webview); | |
324 | |
325 if (editable) { | |
326 gtk_imhtmltoolbar_attach(GTK_IMHTMLTOOLBAR(toolbar), webview); | |
327 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(toolbar), "default"); | |
328 } | |
329 | |
330 sw = pidgin_make_scrollable(webview, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC, GTK_SHADOW_NONE, -1, -1); | |
331 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); | |
332 | |
333 gtk_webview_set_vadjustment(GTK_WEBVIEW(webview), | |
334 gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(sw))); | |
335 | |
336 if (webview_ret != NULL) | |
337 *webview_ret = webview; | |
338 | |
339 if (editable && (toolbar_ret != NULL)) | |
340 *toolbar_ret = toolbar; | |
341 | |
342 if (sw_ret != NULL) | |
343 *sw_ret = sw; | |
344 | |
345 return frame; | |
346 } | |
347 | |
278 void | 348 void |
279 pidgin_set_sensitive_if_input(GtkWidget *entry, GtkWidget *dialog) | 349 pidgin_set_sensitive_if_input(GtkWidget *entry, GtkWidget *dialog) |
280 { | 350 { |
281 const char *text = gtk_entry_get_text(GTK_ENTRY(entry)); | 351 const char *text = gtk_entry_get_text(GTK_ENTRY(entry)); |
282 gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK, | 352 gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK, |
289 gboolean sensitivity; | 359 gboolean sensitivity; |
290 | 360 |
291 if (to_toggle == NULL) | 361 if (to_toggle == NULL) |
292 return; | 362 return; |
293 | 363 |
294 sensitivity = gtk_widget_get_sensitive(to_toggle); | 364 sensitivity = gtk_widget_is_sensitive(to_toggle); |
295 | 365 |
296 gtk_widget_set_sensitive(to_toggle, !sensitivity); | 366 gtk_widget_set_sensitive(to_toggle, !sensitivity); |
297 } | 367 } |
298 | 368 |
299 void | 369 void |
306 for (i=0; i < data->len; i++) { | 376 for (i=0; i < data->len; i++) { |
307 element = g_ptr_array_index(data,i); | 377 element = g_ptr_array_index(data,i); |
308 if (element == NULL) | 378 if (element == NULL) |
309 continue; | 379 continue; |
310 | 380 |
311 sensitivity = gtk_widget_get_sensitive(element); | 381 sensitivity = gtk_widget_is_sensitive(element); |
312 | 382 |
313 gtk_widget_set_sensitive(element, !sensitivity); | 383 gtk_widget_set_sensitive(element, !sensitivity); |
314 } | 384 } |
315 } | 385 } |
316 | 386 |
674 } | 744 } |
675 | 745 |
676 if (facebook_name && strcmp(facebook_name, plugin->info->name) < 0) { | 746 if (facebook_name && strcmp(facebook_name, plugin->info->name) < 0) { |
677 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", | 747 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", |
678 "16", "facebook.png", NULL); | 748 "16", "facebook.png", NULL); |
749 | |
679 pixbuf = pidgin_pixbuf_new_from_file(filename); | 750 pixbuf = pidgin_pixbuf_new_from_file(filename); |
680 g_free(filename); | 751 g_free(filename); |
681 | 752 |
682 gtk_list_store_append(ls, &iter); | 753 gtk_list_store_append(ls, &iter); |
683 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, facebook_name, 2, "prpl-jabber", -1); | 754 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, facebook_name, 2, "prpl-jabber", -1); |
950 if (chat < 0) { | 1021 if (chat < 0) { |
951 pidgin_retrieve_user_info(conn, name); | 1022 pidgin_retrieve_user_info(conn, name); |
952 return; | 1023 return; |
953 } | 1024 } |
954 | 1025 |
955 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(conn->prpl); | 1026 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(conn)); |
956 if (prpl_info != NULL && prpl_info->get_cb_real_name) | 1027 if (prpl_info != NULL && prpl_info->get_cb_real_name) |
957 who = prpl_info->get_cb_real_name(conn, chat, name); | 1028 who = prpl_info->get_cb_real_name(conn, chat, name); |
958 if (prpl_info == NULL || prpl_info->get_cb_info == NULL) { | 1029 if (prpl_info == NULL || prpl_info->get_cb_info == NULL) { |
959 pidgin_retrieve_user_info(conn, who ? who : name); | 1030 pidgin_retrieve_user_info(conn, who ? who : name); |
960 g_free(who); | 1031 g_free(who); |
1076 else | 1147 else |
1077 { | 1148 { |
1078 gc = (PurpleConnection *)l->data; | 1149 gc = (PurpleConnection *)l->data; |
1079 account = purple_connection_get_account(gc); | 1150 account = purple_connection_get_account(gc); |
1080 | 1151 |
1081 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); | 1152 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); |
1082 } | 1153 } |
1083 | 1154 |
1084 protoname = prpl_info->list_icon(account, NULL); | 1155 protoname = prpl_info->list_icon(account, NULL); |
1085 | 1156 |
1086 if (!strcmp(protoname, protocol)) | 1157 if (!strcmp(protoname, protocol)) |
1118 else | 1189 else |
1119 { | 1190 { |
1120 gc = (PurpleConnection *)l->data; | 1191 gc = (PurpleConnection *)l->data; |
1121 account = purple_connection_get_account(gc); | 1192 account = purple_connection_get_account(gc); |
1122 | 1193 |
1123 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); | 1194 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); |
1124 } | 1195 } |
1125 | 1196 |
1126 protoname = prpl_info->list_icon(account, NULL); | 1197 protoname = prpl_info->list_icon(account, NULL); |
1127 | 1198 |
1128 if (!strcmp(protoname, "aim") || !strcmp(protoname, "icq")) | 1199 if (!strcmp(protoname, "aim") || !strcmp(protoname, "icq")) |
1221 | 1292 |
1222 g_return_if_fail(GTK_IS_MENU(menu)); | 1293 g_return_if_fail(GTK_IS_MENU(menu)); |
1223 | 1294 |
1224 widget = GTK_WIDGET(menu); | 1295 widget = GTK_WIDGET(menu); |
1225 screen = gtk_widget_get_screen(widget); | 1296 screen = gtk_widget_get_screen(widget); |
1226 xthickness = gtk_widget_get_style(widget)->xthickness; | 1297 xthickness = widget->style->xthickness; |
1227 ythickness = gtk_widget_get_style(widget)->ythickness; | 1298 ythickness = widget->style->ythickness; |
1228 rtl = (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL); | 1299 rtl = (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL); |
1229 | 1300 |
1230 /* | 1301 /* |
1231 * We need the requisition to figure out the right place to | 1302 * We need the requisition to figure out the right place to |
1232 * popup the menu. In fact, we always need to ask here, since | 1303 * popup the menu. In fact, we always need to ask here, since |
1360 GtkWidget *widget = GTK_WIDGET(data); | 1431 GtkWidget *widget = GTK_WIDGET(data); |
1361 GtkTreeView *tv = GTK_TREE_VIEW(data); | 1432 GtkTreeView *tv = GTK_TREE_VIEW(data); |
1362 GtkTreePath *path; | 1433 GtkTreePath *path; |
1363 GtkTreeViewColumn *col; | 1434 GtkTreeViewColumn *col; |
1364 GdkRectangle rect; | 1435 GdkRectangle rect; |
1365 gint ythickness = gtk_widget_get_style(GTK_WIDGET(menu))->ythickness; | 1436 gint ythickness = GTK_WIDGET(menu)->style->ythickness; |
1366 | 1437 |
1367 gdk_window_get_origin (gtk_widget_get_window(widget), x, y); | 1438 gdk_window_get_origin (widget->window, x, y); |
1368 gtk_tree_view_get_cursor (tv, &path, &col); | 1439 gtk_tree_view_get_cursor (tv, &path, &col); |
1369 gtk_tree_view_get_cell_area (tv, path, col, &rect); | 1440 gtk_tree_view_get_cell_area (tv, path, col, &rect); |
1370 | 1441 |
1371 *x += rect.x+rect.width; | 1442 *x += rect.x+rect.width; |
1372 *y += rect.y+rect.height+ythickness; | 1443 *y += rect.y+rect.height+ythickness; |
1479 | 1550 |
1480 void | 1551 void |
1481 pidgin_dnd_file_manage(GtkSelectionData *sd, PurpleAccount *account, const char *who) | 1552 pidgin_dnd_file_manage(GtkSelectionData *sd, PurpleAccount *account, const char *who) |
1482 { | 1553 { |
1483 GdkPixbuf *pb; | 1554 GdkPixbuf *pb; |
1484 GList *files = purple_uri_list_extract_filenames((const gchar *) gtk_selection_data_get_data(sd)); | 1555 GList *files = purple_uri_list_extract_filenames((const gchar *)sd->data); |
1485 PurpleConnection *gc = purple_account_get_connection(account); | 1556 PurpleConnection *gc = purple_account_get_connection(account); |
1486 PurplePluginProtocolInfo *prpl_info = NULL; | 1557 PurplePluginProtocolInfo *prpl_info = NULL; |
1487 #ifndef _WIN32 | 1558 #ifndef _WIN32 |
1488 PurpleDesktopItem *item; | 1559 PurpleDesktopItem *item; |
1489 #endif | 1560 #endif |
1530 data->who = g_strdup(who); | 1601 data->who = g_strdup(who); |
1531 data->filename = g_strdup(filename); | 1602 data->filename = g_strdup(filename); |
1532 data->account = account; | 1603 data->account = account; |
1533 | 1604 |
1534 if (gc) | 1605 if (gc) |
1535 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); | 1606 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); |
1536 | 1607 |
1537 if (prpl_info && prpl_info->options & OPT_PROTO_IM_IMAGE) | 1608 if (prpl_info && prpl_info->options & OPT_PROTO_IM_IMAGE) |
1538 im = TRUE; | 1609 im = TRUE; |
1539 | 1610 |
1540 if (prpl_info && prpl_info->can_receive_file) | 1611 if (prpl_info && prpl_info->can_receive_file) |
1761 GtkWidget * | 1832 GtkWidget * |
1762 pidgin_append_menu_action(GtkWidget *menu, PurpleMenuAction *act, | 1833 pidgin_append_menu_action(GtkWidget *menu, PurpleMenuAction *act, |
1763 gpointer object) | 1834 gpointer object) |
1764 { | 1835 { |
1765 GtkWidget *menuitem; | 1836 GtkWidget *menuitem; |
1837 GList *list; | |
1766 | 1838 |
1767 if (act == NULL) { | 1839 if (act == NULL) { |
1768 return pidgin_separator(menu); | 1840 return pidgin_separator(menu); |
1769 } | 1841 } |
1770 | 1842 |
1771 if (act->children == NULL) { | 1843 list = purple_menu_action_get_children(act); |
1772 menuitem = gtk_menu_item_new_with_mnemonic(act->label); | 1844 menuitem = gtk_menu_item_new_with_mnemonic(purple_menu_action_get_label(act)); |
1773 | 1845 |
1774 if (act->callback != NULL) { | 1846 if (list == NULL) { |
1847 PurpleCallback callback; | |
1848 | |
1849 callback = purple_menu_action_get_callback(act); | |
1850 | |
1851 if (callback != NULL) { | |
1775 g_object_set_data(G_OBJECT(menuitem), | 1852 g_object_set_data(G_OBJECT(menuitem), |
1776 "purplecallback", | 1853 "purplecallback", |
1777 act->callback); | 1854 callback); |
1778 g_object_set_data(G_OBJECT(menuitem), | 1855 g_object_set_data(G_OBJECT(menuitem), |
1779 "purplecallbackdata", | 1856 "purplecallbackdata", |
1780 act->data); | 1857 purple_menu_action_get_data(act)); |
1781 g_signal_connect(G_OBJECT(menuitem), "activate", | 1858 g_signal_connect(G_OBJECT(menuitem), "activate", |
1782 G_CALLBACK(menu_action_cb), | 1859 G_CALLBACK(menu_action_cb), |
1783 object); | 1860 object); |
1784 } else { | 1861 } else { |
1785 gtk_widget_set_sensitive(menuitem, FALSE); | 1862 gtk_widget_set_sensitive(menuitem, FALSE); |
1789 } else { | 1866 } else { |
1790 GList *l = NULL; | 1867 GList *l = NULL; |
1791 GtkWidget *submenu = NULL; | 1868 GtkWidget *submenu = NULL; |
1792 GtkAccelGroup *group; | 1869 GtkAccelGroup *group; |
1793 | 1870 |
1794 menuitem = gtk_menu_item_new_with_mnemonic(act->label); | |
1795 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); | 1871 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
1796 | 1872 |
1797 submenu = gtk_menu_new(); | 1873 submenu = gtk_menu_new(); |
1798 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); | 1874 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); |
1799 | 1875 |
1800 group = gtk_menu_get_accel_group(GTK_MENU(menu)); | 1876 group = gtk_menu_get_accel_group(GTK_MENU(menu)); |
1801 if (group) { | 1877 if (group) { |
1802 char *path = g_strdup_printf("%s/%s", | 1878 char *path = g_strdup_printf("%s/%s", GTK_MENU_ITEM(menuitem)->accel_path, |
1803 gtk_menu_item_get_accel_path(GTK_MENU_ITEM(menuitem)), | 1879 purple_menu_action_get_label(act)); |
1804 act->label); | |
1805 gtk_menu_set_accel_path(GTK_MENU(submenu), path); | 1880 gtk_menu_set_accel_path(GTK_MENU(submenu), path); |
1806 g_free(path); | 1881 g_free(path); |
1807 gtk_menu_set_accel_group(GTK_MENU(submenu), group); | 1882 gtk_menu_set_accel_group(GTK_MENU(submenu), group); |
1808 } | 1883 } |
1809 | 1884 |
1810 for (l = act->children; l; l = l->next) { | 1885 for (l = list; l; l = l->next) { |
1811 PurpleMenuAction *act = (PurpleMenuAction *)l->data; | 1886 PurpleMenuAction *act = (PurpleMenuAction *)l->data; |
1812 | 1887 |
1813 pidgin_append_menu_action(submenu, act, object); | 1888 pidgin_append_menu_action(submenu, act, object); |
1814 } | 1889 } |
1815 g_list_free(act->children); | 1890 g_list_free(list); |
1816 act->children = NULL; | 1891 purple_menu_action_set_children(act, NULL); |
1817 } | 1892 } |
1818 purple_menu_action_free(act); | 1893 purple_menu_action_free(act); |
1819 return menuitem; | 1894 return menuitem; |
1820 } | 1895 } |
1821 | 1896 |
2011 | 2086 |
2012 if (filter_func(&entry, user_data)) { | 2087 if (filter_func(&entry, user_data)) { |
2013 add_buddyname_autocomplete_entry(data->store, | 2088 add_buddyname_autocomplete_entry(data->store, |
2014 ((PurpleContact *)cnode)->alias, | 2089 ((PurpleContact *)cnode)->alias, |
2015 purple_buddy_get_contact_alias(entry.entry.buddy), | 2090 purple_buddy_get_contact_alias(entry.entry.buddy), |
2016 entry.entry.buddy->account, | 2091 purple_buddy_get_account(entry.entry.buddy), |
2017 entry.entry.buddy->name | 2092 purple_buddy_get_name(entry.entry.buddy) |
2018 ); | 2093 ); |
2019 } | 2094 } |
2020 } | 2095 } |
2021 } | 2096 } |
2022 } | 2097 } |
2104 gboolean | 2179 gboolean |
2105 pidgin_screenname_autocomplete_default_filter(const PidginBuddyCompletionEntry *completion_entry, gpointer all_accounts) { | 2180 pidgin_screenname_autocomplete_default_filter(const PidginBuddyCompletionEntry *completion_entry, gpointer all_accounts) { |
2106 gboolean all = GPOINTER_TO_INT(all_accounts); | 2181 gboolean all = GPOINTER_TO_INT(all_accounts); |
2107 | 2182 |
2108 if (completion_entry->is_buddy) { | 2183 if (completion_entry->is_buddy) { |
2109 return all || purple_account_is_connected(completion_entry->entry.buddy->account); | 2184 return all || purple_account_is_connected(purple_buddy_get_account(completion_entry->entry.buddy)); |
2110 } else { | 2185 } else { |
2111 return all || (completion_entry->entry.logged_buddy->account != NULL && purple_account_is_connected(completion_entry->entry.logged_buddy->account)); | 2186 return all || (completion_entry->entry.logged_buddy->account != NULL && purple_account_is_connected(completion_entry->entry.logged_buddy->account)); |
2112 } | 2187 } |
2113 } | 2188 } |
2114 | 2189 |
2115 void pidgin_set_cursor(GtkWidget *widget, GdkCursorType cursor_type) | 2190 void pidgin_set_cursor(GtkWidget *widget, GdkCursorType cursor_type) |
2116 { | 2191 { |
2117 GdkCursor *cursor; | 2192 GdkCursor *cursor; |
2118 | 2193 |
2119 g_return_if_fail(widget != NULL); | 2194 g_return_if_fail(widget != NULL); |
2120 if (gtk_widget_get_window(widget) == NULL) | 2195 if (widget->window == NULL) |
2121 return; | 2196 return; |
2122 | 2197 |
2123 cursor = gdk_cursor_new(cursor_type); | 2198 cursor = gdk_cursor_new(cursor_type); |
2124 gdk_window_set_cursor(gtk_widget_get_window(widget), cursor); | 2199 gdk_window_set_cursor(widget->window, cursor); |
2125 gdk_cursor_unref(cursor); | 2200 gdk_cursor_unref(cursor); |
2126 | 2201 |
2127 gdk_display_flush(gdk_window_get_display(gtk_widget_get_window(widget))); | 2202 gdk_display_flush(gdk_drawable_get_display(GDK_DRAWABLE(widget->window))); |
2128 } | 2203 } |
2129 | 2204 |
2130 void pidgin_clear_cursor(GtkWidget *widget) | 2205 void pidgin_clear_cursor(GtkWidget *widget) |
2131 { | 2206 { |
2132 g_return_if_fail(widget != NULL); | 2207 g_return_if_fail(widget != NULL); |
2133 if (gtk_widget_get_window(widget) == NULL) | 2208 if (widget->window == NULL) |
2134 return; | 2209 return; |
2135 | 2210 |
2136 gdk_window_set_cursor(gtk_widget_get_window(widget), NULL); | 2211 gdk_window_set_cursor(widget->window, NULL); |
2137 } | 2212 } |
2138 | 2213 |
2139 struct _icon_chooser { | 2214 struct _icon_chooser { |
2140 GtkWidget *icon_filesel; | 2215 GtkWidget *icon_filesel; |
2141 GtkWidget *icon_preview; | 2216 GtkWidget *icon_preview; |
2172 if (dialog->callback) | 2247 if (dialog->callback) |
2173 dialog->callback(filename, dialog->data); | 2248 dialog->callback(filename, dialog->data); |
2174 gtk_widget_destroy(dialog->icon_filesel); | 2249 gtk_widget_destroy(dialog->icon_filesel); |
2175 g_free(filename); | 2250 g_free(filename); |
2176 g_free(dialog); | 2251 g_free(dialog); |
2177 } | 2252 } |
2178 | 2253 |
2179 | 2254 |
2180 static void | 2255 static void |
2181 icon_preview_change_cb(GtkFileChooser *widget, struct _icon_chooser *dialog) | 2256 icon_preview_change_cb(GtkFileChooser *widget, struct _icon_chooser *dialog) |
2182 { | 2257 { |
2410 /* We were able to save the image as this image type and | 2485 /* We were able to save the image as this image type and |
2411 have it be within the size constraints. Great! Return | 2486 have it be within the size constraints. Great! Return |
2412 the image. */ | 2487 the image. */ |
2413 purple_debug_info("buddyicon", "Converted image from " | 2488 purple_debug_info("buddyicon", "Converted image from " |
2414 "%dx%d to %dx%d, format=%s, quality=%u, " | 2489 "%dx%d to %dx%d, format=%s, quality=%u, " |
2415 "filesize=%zu\n", orig_width, orig_height, | 2490 "filesize=%" G_GSIZE_FORMAT "\n", |
2416 new_width, new_height, prpl_formats[i], quality, | 2491 orig_width, orig_height, new_width, new_height, |
2417 length); | 2492 prpl_formats[i], quality, length); |
2418 if (len) | 2493 if (len) |
2419 *len = length; | 2494 *len = length; |
2420 g_strfreev(prpl_formats); | 2495 g_strfreev(prpl_formats); |
2421 g_object_unref(G_OBJECT(pixbuf)); | 2496 g_object_unref(G_OBJECT(pixbuf)); |
2422 g_object_unref(G_OBJECT(original)); | 2497 g_object_unref(G_OBJECT(original)); |
2791 GtkStyle *style; | 2866 GtkStyle *style; |
2792 | 2867 |
2793 if (!widget) | 2868 if (!widget) |
2794 return "dim grey"; | 2869 return "dim grey"; |
2795 | 2870 |
2796 style = gtk_widget_get_style(widget); | 2871 style = gtk_widget_get_style(widget); |
2797 if (!style) | 2872 if (!style) |
2798 return "dim grey"; | 2873 return "dim grey"; |
2799 | 2874 |
2800 snprintf(dim_grey_string, sizeof(dim_grey_string), "#%02x%02x%02x", | 2875 snprintf(dim_grey_string, sizeof(dim_grey_string), "#%02x%02x%02x", |
2801 style->text_aa[GTK_STATE_NORMAL].red >> 8, | 2876 style->text_aa[GTK_STATE_NORMAL].red >> 8, |
2803 style->text_aa[GTK_STATE_NORMAL].blue >> 8); | 2878 style->text_aa[GTK_STATE_NORMAL].blue >> 8); |
2804 return dim_grey_string; | 2879 return dim_grey_string; |
2805 } | 2880 } |
2806 | 2881 |
2807 static void | 2882 static void |
2808 combo_box_changed_cb(GtkComboBoxText *combo_box, GtkEntry *entry) | 2883 combo_box_changed_cb(GtkComboBox *combo_box, GtkEntry *entry) |
2809 { | 2884 { |
2810 char *text = gtk_combo_box_text_get_active_text(combo_box); | 2885 char *text = gtk_combo_box_get_active_text(combo_box); |
2811 gtk_entry_set_text(entry, text ? text : ""); | 2886 gtk_entry_set_text(entry, text ? text : ""); |
2812 g_free(text); | 2887 g_free(text); |
2813 } | 2888 } |
2814 | 2889 |
2815 static gboolean | 2890 static gboolean |
2816 entry_key_pressed_cb(GtkWidget *entry, GdkEventKey *key, GtkComboBoxText *combo) | 2891 entry_key_pressed_cb(GtkWidget *entry, GdkEventKey *key, GtkComboBox *combo) |
2817 { | 2892 { |
2818 if (key->keyval == GDK_KEY_Down || key->keyval == GDK_KEY_Up) { | 2893 if (key->keyval == GDK_Down || key->keyval == GDK_Up) { |
2819 gtk_combo_box_popup(GTK_COMBO_BOX(combo)); | 2894 gtk_combo_box_popup(combo); |
2820 return TRUE; | 2895 return TRUE; |
2821 } | 2896 } |
2822 return FALSE; | 2897 return FALSE; |
2823 } | 2898 } |
2824 | 2899 |
2825 GtkWidget * | 2900 GtkWidget * |
2826 pidgin_text_combo_box_entry_new(const char *default_item, GList *items) | 2901 pidgin_text_combo_box_entry_new(const char *default_item, GList *items) |
2827 { | 2902 { |
2828 GtkComboBoxText *ret = NULL; | 2903 GtkComboBox *ret = NULL; |
2829 GtkWidget *the_entry = NULL; | 2904 GtkWidget *the_entry = NULL; |
2830 | 2905 |
2831 ret = GTK_COMBO_BOX_TEXT(gtk_combo_box_text_new_with_entry()); | 2906 ret = GTK_COMBO_BOX(gtk_combo_box_entry_new_text()); |
2832 the_entry = gtk_entry_new(); | 2907 the_entry = gtk_entry_new(); |
2833 gtk_container_add(GTK_CONTAINER(ret), the_entry); | 2908 gtk_container_add(GTK_CONTAINER(ret), the_entry); |
2834 | 2909 |
2835 if (default_item) | 2910 if (default_item) |
2836 gtk_entry_set_text(GTK_ENTRY(the_entry), default_item); | 2911 gtk_entry_set_text(GTK_ENTRY(the_entry), default_item); |
2837 | 2912 |
2838 for (; items != NULL ; items = items->next) { | 2913 for (; items != NULL ; items = items->next) { |
2839 char *text = items->data; | 2914 char *text = items->data; |
2840 if (text && *text) | 2915 if (text && *text) |
2841 gtk_combo_box_text_append_text(ret, text); | 2916 gtk_combo_box_append_text(ret, text); |
2842 } | 2917 } |
2843 | 2918 |
2844 g_signal_connect(G_OBJECT(ret), "changed", (GCallback)combo_box_changed_cb, the_entry); | 2919 g_signal_connect(G_OBJECT(ret), "changed", (GCallback)combo_box_changed_cb, the_entry); |
2845 g_signal_connect_after(G_OBJECT(the_entry), "key-press-event", G_CALLBACK(entry_key_pressed_cb), ret); | 2920 g_signal_connect_after(G_OBJECT(the_entry), "key-press-event", G_CALLBACK(entry_key_pressed_cb), ret); |
2846 | 2921 |
2847 return GTK_WIDGET(ret); | 2922 return GTK_WIDGET(ret); |
2848 } | 2923 } |
2849 | 2924 |
2850 const char *pidgin_text_combo_box_entry_get_text(GtkWidget *widget) | 2925 const char *pidgin_text_combo_box_entry_get_text(GtkWidget *widget) |
2851 { | 2926 { |
2852 return gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((widget))))); | 2927 return gtk_entry_get_text(GTK_ENTRY(GTK_BIN((widget))->child)); |
2853 } | 2928 } |
2854 | 2929 |
2855 void pidgin_text_combo_box_entry_set_text(GtkWidget *widget, const char *text) | 2930 void pidgin_text_combo_box_entry_set_text(GtkWidget *widget, const char *text) |
2856 { | 2931 { |
2857 gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((widget)))), (text)); | 2932 gtk_entry_set_text(GTK_ENTRY(GTK_BIN((widget))->child), (text)); |
2858 } | 2933 } |
2859 | 2934 |
2860 GtkWidget * | 2935 GtkWidget * |
2861 pidgin_add_widget_to_vbox(GtkBox *vbox, const char *widget_label, GtkSizeGroup *sg, GtkWidget *widget, gboolean expand, GtkWidget **p_label) | 2936 pidgin_add_widget_to_vbox(GtkBox *vbox, const char *widget_label, GtkSizeGroup *sg, GtkWidget *widget, gboolean expand, GtkWidget **p_label) |
2862 { | 2937 { |
2919 time_t value; | 2994 time_t value; |
2920 | 2995 |
2921 windows = g_list_delete_link(windows, windows); | 2996 windows = g_list_delete_link(windows, windows); |
2922 | 2997 |
2923 if (window == widget || | 2998 if (window == widget || |
2924 !GTK_WIDGET_VISIBLE(window)) | 2999 !gtk_widget_get_visible(window)) |
2925 continue; | 3000 continue; |
2926 | 3001 |
2927 if (!gdk_property_get(window->window, _WindowTime, _Cardinal, 0, sizeof(time_t), FALSE, | 3002 if (!gdk_property_get(window->window, _WindowTime, _Cardinal, 0, sizeof(time_t), FALSE, |
2928 NULL, NULL, &al, &data)) | 3003 NULL, NULL, &al, &data)) |
2929 continue; | 3004 continue; |
2978 !gtk_widget_get_visible(window)) { | 3053 !gtk_widget_get_visible(window)) { |
2979 continue; | 3054 continue; |
2980 } | 3055 } |
2981 | 3056 |
2982 if (gtk_window_has_toplevel_focus(GTK_WINDOW(window)) || | 3057 if (gtk_window_has_toplevel_focus(GTK_WINDOW(window)) || |
2983 (menu && menu == gtk_widget_get_window(window))) { | 3058 (menu && menu == window->window)) { |
2984 parent = window; | 3059 parent = window; |
2985 break; | 3060 break; |
2986 } | 3061 } |
2987 } | 3062 } |
2988 if (windows) | 3063 if (windows) |
3003 | 3078 |
3004 loader = gdk_pixbuf_loader_new(); | 3079 loader = gdk_pixbuf_loader_new(); |
3005 | 3080 |
3006 if (!gdk_pixbuf_loader_write(loader, buf, count, &error) || error) { | 3081 if (!gdk_pixbuf_loader_write(loader, buf, count, &error) || error) { |
3007 purple_debug_warning("gtkutils", "gdk_pixbuf_loader_write() " | 3082 purple_debug_warning("gtkutils", "gdk_pixbuf_loader_write() " |
3008 "failed with size=%zu: %s\n", count, | 3083 "failed with size=%" G_GSIZE_FORMAT ": %s\n", count, |
3009 error ? error->message : "(no error message)"); | 3084 error ? error->message : "(no error message)"); |
3010 if (error) | 3085 if (error) |
3011 g_error_free(error); | 3086 g_error_free(error); |
3012 g_object_unref(G_OBJECT(loader)); | 3087 g_object_unref(G_OBJECT(loader)); |
3013 return NULL; | 3088 return NULL; |
3014 } | 3089 } |
3015 | 3090 |
3016 if (!gdk_pixbuf_loader_close(loader, &error) || error) { | 3091 if (!gdk_pixbuf_loader_close(loader, &error) || error) { |
3017 purple_debug_warning("gtkutils", "gdk_pixbuf_loader_close() " | 3092 purple_debug_warning("gtkutils", "gdk_pixbuf_loader_close() " |
3018 "failed for image of size %zu: %s\n", count, | 3093 "failed for image of size %" G_GSIZE_FORMAT ": %s\n", count, |
3019 error ? error->message : "(no error message)"); | 3094 error ? error->message : "(no error message)"); |
3020 if (error) | 3095 if (error) |
3021 g_error_free(error); | 3096 g_error_free(error); |
3022 g_object_unref(G_OBJECT(loader)); | 3097 g_object_unref(G_OBJECT(loader)); |
3023 return NULL; | 3098 return NULL; |
3027 pixbuf = G_OBJECT(gdk_pixbuf_loader_get_animation(loader)); | 3102 pixbuf = G_OBJECT(gdk_pixbuf_loader_get_animation(loader)); |
3028 else | 3103 else |
3029 pixbuf = G_OBJECT(gdk_pixbuf_loader_get_pixbuf(loader)); | 3104 pixbuf = G_OBJECT(gdk_pixbuf_loader_get_pixbuf(loader)); |
3030 if (!pixbuf) { | 3105 if (!pixbuf) { |
3031 purple_debug_warning("gtkutils", "%s() returned NULL for image " | 3106 purple_debug_warning("gtkutils", "%s() returned NULL for image " |
3032 "of size %zu\n", | 3107 "of size %" G_GSIZE_FORMAT "\n", |
3033 animated ? "gdk_pixbuf_loader_get_animation" | 3108 animated ? "gdk_pixbuf_loader_get_animation" |
3034 : "gdk_pixbuf_loader_get_pixbuf", count); | 3109 : "gdk_pixbuf_loader_get_pixbuf", count); |
3035 g_object_unref(G_OBJECT(loader)); | 3110 g_object_unref(G_OBJECT(loader)); |
3036 return NULL; | 3111 return NULL; |
3037 } | 3112 } |
3193 int code; | 3268 int code; |
3194 if (purple_str_has_prefix(uri, "file://")) | 3269 if (purple_str_has_prefix(uri, "file://")) |
3195 { | 3270 { |
3196 gchar *escaped = g_shell_quote(uri); | 3271 gchar *escaped = g_shell_quote(uri); |
3197 gchar *param = g_strconcat("/select,\"", uri, "\"", NULL); | 3272 gchar *param = g_strconcat("/select,\"", uri, "\"", NULL); |
3198 gchar *wc_param = g_utf8_to_utf16(param, -1, NULL, NULL, NULL); | 3273 wchar_t *wc_param = g_utf8_to_utf16(param, -1, NULL, NULL, NULL); |
3199 | 3274 |
3200 code = (int)ShellExecuteW(NULL, "OPEN", L"explorer.exe", wc_param, NULL, SW_NORMAL); | 3275 code = (int)ShellExecuteW(NULL, L"OPEN", L"explorer.exe", wc_param, NULL, SW_NORMAL); |
3201 | 3276 |
3202 g_free(wc_param); | 3277 g_free(wc_param); |
3203 g_free(param); | 3278 g_free(param); |
3204 g_free(escaped); | 3279 g_free(escaped); |
3205 } else { | 3280 } else { |
3357 PidginConversation *conv = g_object_get_data(G_OBJECT(item), "gtkconv"); | 3432 PidginConversation *conv = g_object_get_data(G_OBJECT(item), "gtkconv"); |
3358 if (!conv) | 3433 if (!conv) |
3359 return TRUE; | 3434 return TRUE; |
3360 purple_request_file(conv->active_conv, _("Save File"), NULL, TRUE, | 3435 purple_request_file(conv->active_conv, _("Save File"), NULL, TRUE, |
3361 G_CALLBACK(savefile_write_cb), NULL, | 3436 G_CALLBACK(savefile_write_cb), NULL, |
3362 conv->active_conv->account, NULL, conv->active_conv, | 3437 purple_conversation_get_account(conv->active_conv), NULL, conv->active_conv, |
3363 (void *)url); | 3438 (void *)url); |
3364 return TRUE; | 3439 return TRUE; |
3365 } | 3440 } |
3366 | 3441 |
3367 static gboolean | 3442 static gboolean |
3539 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), hscrollbar_policy, vscrollbar_policy); | 3614 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), hscrollbar_policy, vscrollbar_policy); |
3540 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), shadow_type); | 3615 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), shadow_type); |
3541 if (width != -1 || height != -1) | 3616 if (width != -1 || height != -1) |
3542 gtk_widget_set_size_request(sw, width, height); | 3617 gtk_widget_set_size_request(sw, width, height); |
3543 if (child) { | 3618 if (child) { |
3544 if (GTK_IS_SCROLLABLE(child)) | 3619 if (GTK_WIDGET_GET_CLASS(child)->set_scroll_adjustments_signal) |
3545 gtk_container_add(GTK_CONTAINER(sw), child); | 3620 gtk_container_add(GTK_CONTAINER(sw), child); |
3546 else | 3621 else |
3547 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), child); | 3622 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), child); |
3548 } | 3623 } |
3549 return sw; | 3624 return sw; |
3614 gtk_imhtml_class_register_protocol("https://", NULL, NULL); | 3689 gtk_imhtml_class_register_protocol("https://", NULL, NULL); |
3615 gtk_imhtml_class_register_protocol("ftp://", NULL, NULL); | 3690 gtk_imhtml_class_register_protocol("ftp://", NULL, NULL); |
3616 gtk_imhtml_class_register_protocol("mailto:", NULL, NULL); | 3691 gtk_imhtml_class_register_protocol("mailto:", NULL, NULL); |
3617 gtk_imhtml_class_register_protocol("gopher://", NULL, NULL); | 3692 gtk_imhtml_class_register_protocol("gopher://", NULL, NULL); |
3618 } | 3693 } |
3619 |