comparison pidgin/gtkconv.c @ 18119:59aec2d6ec43

propagate from branch 'im.pidgin.pidgin.2.1.0' (head 86fd5e0d8b80a9da3103e850c97f1e04a2333961) to branch 'im.pidgin.pidgin' (head 999df812d342023b977c17afda10ed0238f1f80d)
author Richard Laager <rlaager@wiktel.com>
date Sat, 16 Jun 2007 19:48:23 +0000
parents 873ee0038752 40d51793f2d7
children 9b9e202eb449
comparison
equal deleted inserted replaced
18118:ab6d2763b8d8 18119:59aec2d6ec43
47 #include "log.h" 47 #include "log.h"
48 #include "notify.h" 48 #include "notify.h"
49 #include "prpl.h" 49 #include "prpl.h"
50 #include "request.h" 50 #include "request.h"
51 #include "util.h" 51 #include "util.h"
52 #include "version.h"
52 53
53 #include "gtkdnd-hints.h" 54 #include "gtkdnd-hints.h"
54 #include "gtkblist.h" 55 #include "gtkblist.h"
55 #include "gtkconv.h" 56 #include "gtkconv.h"
56 #include "gtkconvwin.h" 57 #include "gtkconvwin.h"
1819 switch (event->keyval) { 1820 switch (event->keyval) {
1820 case GDK_Up: 1821 case GDK_Up:
1821 if (!gtkconv->send_history) 1822 if (!gtkconv->send_history)
1822 break; 1823 break;
1823 1824
1825 if (gtkconv->entry != entry)
1826 break;
1827
1824 if (!gtkconv->send_history->prev) { 1828 if (!gtkconv->send_history->prev) {
1825 GtkTextIter start, end; 1829 GtkTextIter start, end;
1826 1830
1827 g_free(gtkconv->send_history->data); 1831 g_free(gtkconv->send_history->data);
1828 1832
1865 return TRUE; 1869 return TRUE;
1866 break; 1870 break;
1867 1871
1868 case GDK_Down: 1872 case GDK_Down:
1869 if (!gtkconv->send_history) 1873 if (!gtkconv->send_history)
1874 break;
1875
1876 if (gtkconv->entry != entry)
1870 break; 1877 break;
1871 1878
1872 if (gtkconv->send_history->prev && gtkconv->send_history->prev->data) { 1879 if (gtkconv->send_history->prev && gtkconv->send_history->prev->data) {
1873 GObject *object; 1880 GObject *object;
1874 GtkTextIter iter; 1881 GtkTextIter iter;
1970 else 1977 else
1971 { 1978 {
1972 switch (event->keyval) 1979 switch (event->keyval)
1973 { 1980 {
1974 case GDK_Tab: 1981 case GDK_Tab:
1982 if (gtkconv->entry != entry)
1983 break;
1975 return tab_complete(conv); 1984 return tab_complete(conv);
1976 break; 1985 break;
1977 1986
1978 case GDK_Page_Up: 1987 case GDK_Page_Up:
1979 gtk_imhtml_page_up(GTK_IMHTML(gtkconv->imhtml)); 1988 gtk_imhtml_page_up(GTK_IMHTML(gtkconv->imhtml));
2046 gtk_widget_event(gtkconv->entry, (GdkEvent *)event); 2055 gtk_widget_event(gtkconv->entry, (GdkEvent *)event);
2047 2056
2048 return TRUE; 2057 return TRUE;
2049 } 2058 }
2050 2059
2060 static void
2061 regenerate_options_items(PidginWindow *win);
2062
2051 void 2063 void
2052 pidgin_conv_switch_active_conversation(PurpleConversation *conv) 2064 pidgin_conv_switch_active_conversation(PurpleConversation *conv)
2053 { 2065 {
2054 PidginConversation *gtkconv; 2066 PidginConversation *gtkconv;
2055 PurpleConversation *old_conv; 2067 PurpleConversation *old_conv;
2146 2158
2147 purple_signal_emit(pidgin_conversations_get_handle(), "conversation-switched", conv); 2159 purple_signal_emit(pidgin_conversations_get_handle(), "conversation-switched", conv);
2148 2160
2149 gray_stuff_out(gtkconv); 2161 gray_stuff_out(gtkconv);
2150 update_typing_icon(gtkconv); 2162 update_typing_icon(gtkconv);
2163 g_object_set_data(G_OBJECT(entry), "transient_buddy", NULL);
2164 regenerate_options_items(gtkconv->win);
2151 2165
2152 gtk_window_set_title(GTK_WINDOW(gtkconv->win->window), 2166 gtk_window_set_title(GTK_WINDOW(gtkconv->win->window),
2153 gtk_label_get_text(GTK_LABEL(gtkconv->tab_label))); 2167 gtk_label_get_text(GTK_LABEL(gtkconv->tab_label)));
2154 } 2168 }
2155 2169
2892 gtkconv = pidgin_conv_window_get_active_gtkconv(win); 2906 gtkconv = pidgin_conv_window_get_active_gtkconv(win);
2893 conv = gtkconv->active_conv; 2907 conv = gtkconv->active_conv;
2894 2908
2895 menu = gtk_item_factory_get_widget(win->menu.item_factory, N_("/Conversation/More")); 2909 menu = gtk_item_factory_get_widget(win->menu.item_factory, N_("/Conversation/More"));
2896 2910
2897 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) 2911 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) {
2898 chat = purple_blist_find_chat(conv->account, conv->name); 2912 chat = purple_blist_find_chat(conv->account, conv->name);
2899 else 2913
2914 if ((chat == NULL) && (gtkconv->imhtml != NULL)) {
2915 chat = g_object_get_data(G_OBJECT(gtkconv->imhtml), "transient_chat");
2916 }
2917
2918 if ((chat == NULL) && (gtkconv->imhtml != NULL)) {
2919 GHashTable *components;
2920 components = g_hash_table_new_full(g_str_hash, g_str_equal,
2921 g_free, g_free);
2922 g_hash_table_replace(components, g_strdup("channel"),
2923 g_strdup(conv->name));
2924 chat = purple_chat_new(conv->account, NULL, components);
2925 purple_blist_node_set_flags((PurpleBlistNode *)chat,
2926 PURPLE_BLIST_NODE_FLAG_NO_SAVE);
2927 g_object_set_data_full(G_OBJECT(gtkconv->imhtml), "transient_chat",
2928 chat, (GDestroyNotify)purple_blist_remove_chat);
2929 }
2930 } else {
2900 buddy = purple_find_buddy(conv->account, conv->name); 2931 buddy = purple_find_buddy(conv->account, conv->name);
2932
2933 /* gotta remain bug-compatible :( libpurple < 2.0.2 didn't handle
2934 * removing "isolated" buddy nodes well */
2935 if (purple_version_check(2, 0, 2) == NULL) {
2936 if ((buddy == NULL) && (gtkconv->imhtml != NULL)) {
2937 buddy = g_object_get_data(G_OBJECT(gtkconv->imhtml), "transient_buddy");
2938 }
2939
2940 if ((buddy == NULL) && (gtkconv->imhtml != NULL)) {
2941 buddy = purple_buddy_new(conv->account, conv->name, NULL);
2942 purple_blist_node_set_flags((PurpleBlistNode *)buddy,
2943 PURPLE_BLIST_NODE_FLAG_NO_SAVE);
2944 g_object_set_data_full(G_OBJECT(gtkconv->imhtml), "transient_buddy",
2945 buddy, (GDestroyNotify)purple_blist_remove_buddy);
2946 }
2947 }
2948 }
2901 2949
2902 if (chat) 2950 if (chat)
2903 node = (PurpleBlistNode *)chat; 2951 node = (PurpleBlistNode *)chat;
2904 else if (buddy) 2952 else if (buddy)
2905 node = (PurpleBlistNode *)buddy; 2953 node = (PurpleBlistNode *)buddy;
4228 G_CALLBACK(topic_callback), gtkconv); 4276 G_CALLBACK(topic_callback), gtkconv);
4229 } 4277 }
4230 4278
4231 gtk_box_pack_start(GTK_BOX(hbox), gtkchat->topic_text, TRUE, TRUE, 0); 4279 gtk_box_pack_start(GTK_BOX(hbox), gtkchat->topic_text, TRUE, TRUE, 0);
4232 gtk_widget_show(gtkchat->topic_text); 4280 gtk_widget_show(gtkchat->topic_text);
4281 g_signal_connect(G_OBJECT(gtkchat->topic_text), "key_press_event",
4282 G_CALLBACK(entry_key_press_cb), gtkconv);
4233 } 4283 }
4234 } 4284 }
4235 4285
4236 static void 4286 static void
4237 setup_chat_userlist(PidginConversation *gtkconv, GtkWidget *hpaned) 4287 setup_chat_userlist(PidginConversation *gtkconv, GtkWidget *hpaned)