| 264 sw = pidgin_make_scrollable(imhtml, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC, GTK_SHADOW_NONE, -1, -1); |
265 sw = pidgin_make_scrollable(imhtml, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC, GTK_SHADOW_NONE, -1, -1); |
| 265 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); |
266 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); |
| 266 |
267 |
| 267 if (imhtml_ret != NULL) |
268 if (imhtml_ret != NULL) |
| 268 *imhtml_ret = imhtml; |
269 *imhtml_ret = imhtml; |
| |
270 |
| |
271 if (editable && (toolbar_ret != NULL)) |
| |
272 *toolbar_ret = toolbar; |
| |
273 |
| |
274 if (sw_ret != NULL) |
| |
275 *sw_ret = sw; |
| |
276 |
| |
277 return frame; |
| |
278 } |
| |
279 |
| |
280 GtkWidget * |
| |
281 pidgin_create_webview(gboolean editable, GtkWidget **webview_ret, GtkWidget **toolbar_ret, GtkWidget **sw_ret) |
| |
282 { |
| |
283 GtkWidget *frame; |
| |
284 GtkWidget *webview; |
| |
285 GtkWidget *sep; |
| |
286 GtkWidget *sw; |
| |
287 GtkWidget *toolbar = NULL; |
| |
288 GtkWidget *vbox; |
| |
289 |
| |
290 frame = gtk_frame_new(NULL); |
| |
291 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); |
| |
292 |
| |
293 vbox = gtk_vbox_new(FALSE, 0); |
| |
294 gtk_container_add(GTK_CONTAINER(frame), vbox); |
| |
295 gtk_widget_show(vbox); |
| |
296 |
| |
297 if (editable) { |
| |
298 toolbar = gtk_imhtmltoolbar_new(); |
| |
299 gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); |
| |
300 gtk_widget_show(toolbar); |
| |
301 |
| |
302 sep = gtk_hseparator_new(); |
| |
303 gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); |
| |
304 g_signal_connect_swapped(G_OBJECT(toolbar), "show", G_CALLBACK(gtk_widget_show), sep); |
| |
305 g_signal_connect_swapped(G_OBJECT(toolbar), "hide", G_CALLBACK(gtk_widget_hide), sep); |
| |
306 gtk_widget_show(sep); |
| |
307 } |
| |
308 |
| |
309 webview = gtk_webview_new(); |
| |
310 #if 0 |
| |
311 /* TODO WEBKIT: Don't have editable webview yet. */ |
| |
312 gtk_webview_set_editable(GTK_WEBVIEW(webview), editable); |
| |
313 #endif /* if 0 */ |
| |
314 #ifdef USE_GTKSPELL |
| |
315 if (editable && purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/spellcheck")) |
| |
316 pidgin_setup_gtkspell(GTK_TEXT_VIEW(webview)); |
| |
317 #endif |
| |
318 gtk_widget_show(webview); |
| |
319 |
| |
320 if (editable) { |
| |
321 gtk_imhtmltoolbar_attach(GTK_IMHTMLTOOLBAR(toolbar), webview); |
| |
322 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(toolbar), "default"); |
| |
323 } |
| |
324 |
| |
325 sw = pidgin_make_scrollable(webview, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC, GTK_SHADOW_NONE, -1, -1); |
| |
326 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); |
| |
327 |
| |
328 gtk_webview_set_vadjustment(GTK_WEBVIEW(webview), |
| |
329 gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(sw))); |
| |
330 |
| |
331 if (webview_ret != NULL) |
| |
332 *webview_ret = webview; |
| 269 |
333 |
| 270 if (editable && (toolbar_ret != NULL)) |
334 if (editable && (toolbar_ret != NULL)) |
| 271 *toolbar_ret = toolbar; |
335 *toolbar_ret = toolbar; |
| 272 |
336 |
| 273 if (sw_ret != NULL) |
337 if (sw_ret != NULL) |
| 920 g_object_set_data(G_OBJECT(optmenu), "filter_func", filter_func); |
984 g_object_set_data(G_OBJECT(optmenu), "filter_func", filter_func); |
| 921 |
985 |
| 922 return optmenu; |
986 return optmenu; |
| 923 } |
987 } |
| 924 |
988 |
| 925 gboolean |
|
| 926 pidgin_check_if_dir(const char *path, GtkFileSelection *filesel) |
|
| 927 { |
|
| 928 char *dirname = NULL; |
|
| 929 |
|
| 930 if (g_file_test(path, G_FILE_TEST_IS_DIR)) { |
|
| 931 /* append a / if needed */ |
|
| 932 if (path[strlen(path) - 1] != G_DIR_SEPARATOR) { |
|
| 933 dirname = g_strconcat(path, G_DIR_SEPARATOR_S, NULL); |
|
| 934 } |
|
| 935 gtk_file_selection_set_filename(filesel, (dirname != NULL) ? dirname : path); |
|
| 936 g_free(dirname); |
|
| 937 return TRUE; |
|
| 938 } |
|
| 939 |
|
| 940 return FALSE; |
|
| 941 } |
|
| 942 |
|
| 943 void |
989 void |
| 944 pidgin_setup_gtkspell(GtkTextView *textview) |
990 pidgin_setup_gtkspell(GtkTextView *textview) |
| 945 { |
991 { |
| 946 #ifdef USE_GTKSPELL |
992 #ifdef USE_GTKSPELL |
| 947 GError *error = NULL; |
993 GError *error = NULL; |
| 1000 |
1046 |
| 1001 static void |
1047 static void |
| 1002 show_retrieveing_info(PurpleConnection *conn, const char *name) |
1048 show_retrieveing_info(PurpleConnection *conn, const char *name) |
| 1003 { |
1049 { |
| 1004 PurpleNotifyUserInfo *info = purple_notify_user_info_new(); |
1050 PurpleNotifyUserInfo *info = purple_notify_user_info_new(); |
| 1005 purple_notify_user_info_add_pair(info, _("Information"), _("Retrieving...")); |
1051 purple_notify_user_info_add_pair_plaintext(info, _("Information"), _("Retrieving...")); |
| 1006 purple_notify_userinfo(conn, name, info, NULL, NULL); |
1052 purple_notify_userinfo(conn, name, info, NULL, NULL); |
| 1007 purple_notify_user_info_destroy(info); |
1053 purple_notify_user_info_destroy(info); |
| 1008 } |
1054 } |
| 1009 |
1055 |
| 1010 void pidgin_retrieve_user_info(PurpleConnection *conn, const char *name) |
1056 void pidgin_retrieve_user_info(PurpleConnection *conn, const char *name) |
| 1021 if (chat < 0) { |
1067 if (chat < 0) { |
| 1022 pidgin_retrieve_user_info(conn, name); |
1068 pidgin_retrieve_user_info(conn, name); |
| 1023 return; |
1069 return; |
| 1024 } |
1070 } |
| 1025 |
1071 |
| 1026 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(conn->prpl); |
1072 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(conn)); |
| 1027 if (prpl_info != NULL && prpl_info->get_cb_real_name) |
1073 if (prpl_info != NULL && prpl_info->get_cb_real_name) |
| 1028 who = prpl_info->get_cb_real_name(conn, chat, name); |
1074 who = prpl_info->get_cb_real_name(conn, chat, name); |
| 1029 if (prpl_info == NULL || prpl_info->get_cb_info == NULL) { |
1075 if (prpl_info == NULL || prpl_info->get_cb_info == NULL) { |
| 1030 pidgin_retrieve_user_info(conn, who ? who : name); |
1076 pidgin_retrieve_user_info(conn, who ? who : name); |
| 1031 g_free(who); |
1077 g_free(who); |
| 1832 GtkWidget * |
1878 GtkWidget * |
| 1833 pidgin_append_menu_action(GtkWidget *menu, PurpleMenuAction *act, |
1879 pidgin_append_menu_action(GtkWidget *menu, PurpleMenuAction *act, |
| 1834 gpointer object) |
1880 gpointer object) |
| 1835 { |
1881 { |
| 1836 GtkWidget *menuitem; |
1882 GtkWidget *menuitem; |
| |
1883 GList *list; |
| 1837 |
1884 |
| 1838 if (act == NULL) { |
1885 if (act == NULL) { |
| 1839 return pidgin_separator(menu); |
1886 return pidgin_separator(menu); |
| 1840 } |
1887 } |
| 1841 |
1888 |
| 1842 if (act->children == NULL) { |
1889 list = purple_menu_action_get_children(act); |
| 1843 menuitem = gtk_menu_item_new_with_mnemonic(act->label); |
1890 menuitem = gtk_menu_item_new_with_mnemonic(purple_menu_action_get_label(act)); |
| 1844 |
1891 |
| 1845 if (act->callback != NULL) { |
1892 if (list == NULL) { |
| |
1893 PurpleCallback callback; |
| |
1894 |
| |
1895 callback = purple_menu_action_get_callback(act); |
| |
1896 |
| |
1897 if (callback != NULL) { |
| 1846 g_object_set_data(G_OBJECT(menuitem), |
1898 g_object_set_data(G_OBJECT(menuitem), |
| 1847 "purplecallback", |
1899 "purplecallback", |
| 1848 act->callback); |
1900 callback); |
| 1849 g_object_set_data(G_OBJECT(menuitem), |
1901 g_object_set_data(G_OBJECT(menuitem), |
| 1850 "purplecallbackdata", |
1902 "purplecallbackdata", |
| 1851 act->data); |
1903 purple_menu_action_get_data(act)); |
| 1852 g_signal_connect(G_OBJECT(menuitem), "activate", |
1904 g_signal_connect(G_OBJECT(menuitem), "activate", |
| 1853 G_CALLBACK(menu_action_cb), |
1905 G_CALLBACK(menu_action_cb), |
| 1854 object); |
1906 object); |
| 1855 } else { |
1907 } else { |
| 1856 gtk_widget_set_sensitive(menuitem, FALSE); |
1908 gtk_widget_set_sensitive(menuitem, FALSE); |
| 1860 } else { |
1912 } else { |
| 1861 GList *l = NULL; |
1913 GList *l = NULL; |
| 1862 GtkWidget *submenu = NULL; |
1914 GtkWidget *submenu = NULL; |
| 1863 GtkAccelGroup *group; |
1915 GtkAccelGroup *group; |
| 1864 |
1916 |
| 1865 menuitem = gtk_menu_item_new_with_mnemonic(act->label); |
|
| 1866 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
1917 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
| 1867 |
1918 |
| 1868 submenu = gtk_menu_new(); |
1919 submenu = gtk_menu_new(); |
| 1869 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); |
1920 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); |
| 1870 |
1921 |
| 1871 group = gtk_menu_get_accel_group(GTK_MENU(menu)); |
1922 group = gtk_menu_get_accel_group(GTK_MENU(menu)); |
| 1872 if (group) { |
1923 if (group) { |
| 1873 char *path = g_strdup_printf("%s/%s", GTK_MENU_ITEM(menuitem)->accel_path, act->label); |
1924 char *path = g_strdup_printf("%s/%s", GTK_MENU_ITEM(menuitem)->accel_path, |
| |
1925 purple_menu_action_get_label(act)); |
| 1874 gtk_menu_set_accel_path(GTK_MENU(submenu), path); |
1926 gtk_menu_set_accel_path(GTK_MENU(submenu), path); |
| 1875 g_free(path); |
1927 g_free(path); |
| 1876 gtk_menu_set_accel_group(GTK_MENU(submenu), group); |
1928 gtk_menu_set_accel_group(GTK_MENU(submenu), group); |
| 1877 } |
1929 } |
| 1878 |
1930 |
| 1879 for (l = act->children; l; l = l->next) { |
1931 for (l = list; l; l = l->next) { |
| 1880 PurpleMenuAction *act = (PurpleMenuAction *)l->data; |
1932 PurpleMenuAction *act = (PurpleMenuAction *)l->data; |
| 1881 |
1933 |
| 1882 pidgin_append_menu_action(submenu, act, object); |
1934 pidgin_append_menu_action(submenu, act, object); |
| 1883 } |
1935 } |
| 1884 g_list_free(act->children); |
1936 g_list_free(list); |
| 1885 act->children = NULL; |
1937 purple_menu_action_set_children(act, NULL); |
| 1886 } |
1938 } |
| 1887 purple_menu_action_free(act); |
1939 purple_menu_action_free(act); |
| 1888 return menuitem; |
1940 return menuitem; |
| 1889 } |
1941 } |
| 1890 |
1942 |
| 2080 |
2132 |
| 2081 if (filter_func(&entry, user_data)) { |
2133 if (filter_func(&entry, user_data)) { |
| 2082 add_buddyname_autocomplete_entry(data->store, |
2134 add_buddyname_autocomplete_entry(data->store, |
| 2083 ((PurpleContact *)cnode)->alias, |
2135 ((PurpleContact *)cnode)->alias, |
| 2084 purple_buddy_get_contact_alias(entry.entry.buddy), |
2136 purple_buddy_get_contact_alias(entry.entry.buddy), |
| 2085 entry.entry.buddy->account, |
2137 purple_buddy_get_account(entry.entry.buddy), |
| 2086 entry.entry.buddy->name |
2138 purple_buddy_get_name(entry.entry.buddy) |
| 2087 ); |
2139 ); |
| 2088 } |
2140 } |
| 2089 } |
2141 } |
| 2090 } |
2142 } |
| 2091 } |
2143 } |
| 2173 gboolean |
2225 gboolean |
| 2174 pidgin_screenname_autocomplete_default_filter(const PidginBuddyCompletionEntry *completion_entry, gpointer all_accounts) { |
2226 pidgin_screenname_autocomplete_default_filter(const PidginBuddyCompletionEntry *completion_entry, gpointer all_accounts) { |
| 2175 gboolean all = GPOINTER_TO_INT(all_accounts); |
2227 gboolean all = GPOINTER_TO_INT(all_accounts); |
| 2176 |
2228 |
| 2177 if (completion_entry->is_buddy) { |
2229 if (completion_entry->is_buddy) { |
| 2178 return all || purple_account_is_connected(completion_entry->entry.buddy->account); |
2230 return all || purple_account_is_connected(purple_buddy_get_account(completion_entry->entry.buddy)); |
| 2179 } else { |
2231 } else { |
| 2180 return all || (completion_entry->entry.logged_buddy->account != NULL && purple_account_is_connected(completion_entry->entry.logged_buddy->account)); |
2232 return all || (completion_entry->entry.logged_buddy->account != NULL && purple_account_is_connected(completion_entry->entry.logged_buddy->account)); |
| 2181 } |
2233 } |
| 2182 } |
2234 } |
| 2183 |
|
| 2184 void |
|
| 2185 pidgin_setup_screenname_autocomplete(GtkWidget *entry, GtkWidget *accountopt, gboolean all) { |
|
| 2186 pidgin_setup_screenname_autocomplete_with_filter(entry, accountopt, pidgin_screenname_autocomplete_default_filter, GINT_TO_POINTER(all)); |
|
| 2187 } |
|
| 2188 |
|
| 2189 |
|
| 2190 |
2235 |
| 2191 void pidgin_set_cursor(GtkWidget *widget, GdkCursorType cursor_type) |
2236 void pidgin_set_cursor(GtkWidget *widget, GdkCursorType cursor_type) |
| 2192 { |
2237 { |
| 2193 GdkCursor *cursor; |
2238 GdkCursor *cursor; |
| 2194 |
2239 |
| 2529 path, plugin->info->name); |
2574 path, plugin->info->name); |
| 2530 purple_notify_error(NULL, _("Icon Error"), _("Could not set icon"), tmp); |
2575 purple_notify_error(NULL, _("Icon Error"), _("Could not set icon"), tmp); |
| 2531 g_free(tmp); |
2576 g_free(tmp); |
| 2532 |
2577 |
| 2533 return NULL; |
2578 return NULL; |
| 2534 } |
|
| 2535 |
|
| 2536 void pidgin_set_custom_buddy_icon(PurpleAccount *account, const char *who, const char *filename) |
|
| 2537 { |
|
| 2538 PurpleBuddy *buddy; |
|
| 2539 PurpleContact *contact; |
|
| 2540 |
|
| 2541 buddy = purple_find_buddy(account, who); |
|
| 2542 if (!buddy) { |
|
| 2543 purple_debug_info("custom-icon", "You can only set custom icon for someone in your buddylist.\n"); |
|
| 2544 return; |
|
| 2545 } |
|
| 2546 |
|
| 2547 contact = purple_buddy_get_contact(buddy); |
|
| 2548 purple_buddy_icons_node_set_custom_icon_from_file((PurpleBlistNode*)contact, filename); |
|
| 2549 } |
2579 } |
| 2550 |
2580 |
| 2551 char *pidgin_make_pretty_arrows(const char *str) |
2581 char *pidgin_make_pretty_arrows(const char *str) |
| 2552 { |
2582 { |
| 2553 char *ret; |
2583 char *ret; |
| 3448 PidginConversation *conv = g_object_get_data(G_OBJECT(item), "gtkconv"); |
3478 PidginConversation *conv = g_object_get_data(G_OBJECT(item), "gtkconv"); |
| 3449 if (!conv) |
3479 if (!conv) |
| 3450 return TRUE; |
3480 return TRUE; |
| 3451 purple_request_file(conv->active_conv, _("Save File"), NULL, TRUE, |
3481 purple_request_file(conv->active_conv, _("Save File"), NULL, TRUE, |
| 3452 G_CALLBACK(savefile_write_cb), NULL, |
3482 G_CALLBACK(savefile_write_cb), NULL, |
| 3453 conv->active_conv->account, NULL, conv->active_conv, |
3483 purple_conversation_get_account(conv->active_conv), NULL, conv->active_conv, |
| 3454 (void *)url); |
3484 (void *)url); |
| 3455 return TRUE; |
3485 return TRUE; |
| 3456 } |
3486 } |
| 3457 |
3487 |
| 3458 static gboolean |
3488 static gboolean |