Mercurial > pidgin.yaz
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) |