| 32798:8b3b9ddcd0bd | 33127:02a3db370988 |
|---|---|
| 196 static void pidgin_conv_updated(PurpleConversation *conv, PurpleConvUpdateType type); | 196 static void pidgin_conv_updated(PurpleConversation *conv, PurpleConvUpdateType type); |
| 197 static void conv_set_unseen(PurpleConversation *gtkconv, PidginUnseenState state); | 197 static void conv_set_unseen(PurpleConversation *gtkconv, PidginUnseenState state); |
| 198 static void gtkconv_set_unseen(PidginConversation *gtkconv, PidginUnseenState state); | 198 static void gtkconv_set_unseen(PidginConversation *gtkconv, PidginUnseenState state); |
| 199 static void update_typing_icon(PidginConversation *gtkconv); | 199 static void update_typing_icon(PidginConversation *gtkconv); |
| 200 static void update_typing_message(PidginConversation *gtkconv, const char *message); | 200 static void update_typing_message(PidginConversation *gtkconv, const char *message); |
| 201 static const char *item_factory_translate_func (const char *path, gpointer func_data); | |
| 202 gboolean pidgin_conv_has_focus(PurpleConversation *conv); | 201 gboolean pidgin_conv_has_focus(PurpleConversation *conv); |
| 203 static GdkColor* generate_nick_colors(guint *numcolors, GdkColor background); | 202 static GdkColor* generate_nick_colors(guint *numcolors, GdkColor background); |
| 204 static gboolean color_is_visible(GdkColor foreground, GdkColor background, int color_contrast, int brightness_contrast); | 203 static gboolean color_is_visible(GdkColor foreground, GdkColor background, int color_contrast, int brightness_contrast); |
| 205 static GtkTextTag *get_buddy_tag(PurpleConversation *conv, const char *who, PurpleMessageFlags flag, gboolean create); | 204 static GtkTextTag *get_buddy_tag(PurpleConversation *conv, const char *who, PurpleMessageFlags flag, gboolean create); |
| 206 static void pidgin_conv_update_fields(PurpleConversation *conv, PidginConvFields fields); | 205 static void pidgin_conv_update_fields(PurpleConversation *conv, PidginConvFields fields); |
| 839 GtkSelectionData *sd, guint inf, guint t, gpointer data) | 838 GtkSelectionData *sd, guint inf, guint t, gpointer data) |
| 840 { | 839 { |
| 841 InviteBuddyInfo *info = (InviteBuddyInfo *)data; | 840 InviteBuddyInfo *info = (InviteBuddyInfo *)data; |
| 842 const char *convprotocol; | 841 const char *convprotocol; |
| 843 gboolean success = TRUE; | 842 gboolean success = TRUE; |
| 843 GdkAtom target = gtk_selection_data_get_target(sd); | |
| 844 | 844 |
| 845 convprotocol = purple_account_get_protocol_id(purple_conversation_get_account(info->conv)); | 845 convprotocol = purple_account_get_protocol_id(purple_conversation_get_account(info->conv)); |
| 846 | 846 |
| 847 if (sd->target == gdk_atom_intern("PURPLE_BLIST_NODE", FALSE)) | 847 if (target == gdk_atom_intern("PURPLE_BLIST_NODE", FALSE)) |
| 848 { | 848 { |
| 849 PurpleBlistNode *node = NULL; | 849 PurpleBlistNode *node = NULL; |
| 850 PurpleBuddy *buddy; | 850 PurpleBuddy *buddy; |
| 851 | 851 const guchar *data = gtk_selection_data_get_data(sd); |
| 852 memcpy(&node, sd->data, sizeof(node)); | 852 |
| 853 memcpy(&node, data, sizeof(node)); | |
| 853 | 854 |
| 854 if (PURPLE_BLIST_NODE_IS_CONTACT(node)) | 855 if (PURPLE_BLIST_NODE_IS_CONTACT(node)) |
| 855 buddy = purple_contact_get_priority_buddy((PurpleContact *)node); | 856 buddy = purple_contact_get_priority_buddy((PurpleContact *)node); |
| 856 else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) | 857 else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) |
| 857 buddy = (PurpleBuddy *)node; | 858 buddy = (PurpleBuddy *)node; |
| 866 success = FALSE; | 867 success = FALSE; |
| 867 } | 868 } |
| 868 else | 869 else |
| 869 gtk_entry_set_text(GTK_ENTRY(info->entry), purple_buddy_get_name(buddy)); | 870 gtk_entry_set_text(GTK_ENTRY(info->entry), purple_buddy_get_name(buddy)); |
| 870 | 871 |
| 871 gtk_drag_finish(dc, success, (dc->action == GDK_ACTION_MOVE), t); | 872 gtk_drag_finish(dc, success, |
| 872 } | 873 gdk_drag_context_get_actions(dc) == GDK_ACTION_MOVE, t); |
| 873 else if (sd->target == gdk_atom_intern("application/x-im-contact", FALSE)) | 874 } |
| 875 else if (target == gdk_atom_intern("application/x-im-contact", FALSE)) | |
| 874 { | 876 { |
| 875 char *protocol = NULL; | 877 char *protocol = NULL; |
| 876 char *username = NULL; | 878 char *username = NULL; |
| 877 PurpleAccount *account; | 879 PurpleAccount *account; |
| 878 | 880 |
| 879 if (pidgin_parse_x_im_contact((const char *)sd->data, FALSE, &account, | 881 if (pidgin_parse_x_im_contact((const char *) data, FALSE, &account, |
| 880 &protocol, &username, NULL)) | 882 &protocol, &username, NULL)) |
| 881 { | 883 { |
| 882 if (account == NULL) | 884 if (account == NULL) |
| 883 { | 885 { |
| 884 purple_notify_error(PIDGIN_CONVERSATION(info->conv), NULL, | 886 purple_notify_error(PIDGIN_CONVERSATION(info->conv), NULL, |
| 899 } | 901 } |
| 900 | 902 |
| 901 g_free(username); | 903 g_free(username); |
| 902 g_free(protocol); | 904 g_free(protocol); |
| 903 | 905 |
| 904 gtk_drag_finish(dc, success, (dc->action == GDK_ACTION_MOVE), t); | 906 gtk_drag_finish(dc, success, |
| 907 gdk_drag_context_get_actions(dc) == GDK_ACTION_MOVE, t); | |
| 905 } | 908 } |
| 906 } | 909 } |
| 907 | 910 |
| 908 static const GtkTargetEntry dnd_targets[] = | 911 static const GtkTargetEntry dnd_targets[] = |
| 909 { | 912 { |
| 941 | 944 |
| 942 gtk_dialog_set_default_response(GTK_DIALOG(invite_dialog), | 945 gtk_dialog_set_default_response(GTK_DIALOG(invite_dialog), |
| 943 GTK_RESPONSE_OK); | 946 GTK_RESPONSE_OK); |
| 944 gtk_container_set_border_width(GTK_CONTAINER(invite_dialog), PIDGIN_HIG_BOX_SPACE); | 947 gtk_container_set_border_width(GTK_CONTAINER(invite_dialog), PIDGIN_HIG_BOX_SPACE); |
| 945 gtk_window_set_resizable(GTK_WINDOW(invite_dialog), FALSE); | 948 gtk_window_set_resizable(GTK_WINDOW(invite_dialog), FALSE); |
| 949 /* TODO: set no separator using GTK+ 3.0 */ | |
| 950 #if 0 | |
| 946 gtk_dialog_set_has_separator(GTK_DIALOG(invite_dialog), FALSE); | 951 gtk_dialog_set_has_separator(GTK_DIALOG(invite_dialog), FALSE); |
| 952 #endif | |
| 947 | 953 |
| 948 info->window = GTK_WIDGET(invite_dialog); | 954 info->window = GTK_WIDGET(invite_dialog); |
| 949 | 955 |
| 950 /* Setup the outside spacing. */ | 956 /* Setup the outside spacing. */ |
| 951 vbox = GTK_DIALOG(invite_dialog)->vbox; | 957 vbox = gtk_dialog_get_content_area(GTK_DIALOG(invite_dialog)); |
| 952 | 958 |
| 953 gtk_box_set_spacing(GTK_BOX(vbox), PIDGIN_HIG_BORDER); | 959 gtk_box_set_spacing(GTK_BOX(vbox), PIDGIN_HIG_BORDER); |
| 954 gtk_container_set_border_width(GTK_CONTAINER(vbox), PIDGIN_HIG_BOX_SPACE); | 960 gtk_container_set_border_width(GTK_CONTAINER(vbox), PIDGIN_HIG_BOX_SPACE); |
| 955 | 961 |
| 956 /* Setup the inner hbox and put the dialog's icon in it. */ | 962 /* Setup the inner hbox and put the dialog's icon in it. */ |
| 1038 if (info != NULL) | 1044 if (info != NULL) |
| 1039 gtk_widget_grab_focus(info->entry); | 1045 gtk_widget_grab_focus(info->entry); |
| 1040 } | 1046 } |
| 1041 | 1047 |
| 1042 static void | 1048 static void |
| 1043 menu_new_conv_cb(gpointer data, guint action, GtkWidget *widget) | 1049 menu_new_conv_cb(GtkAction *action, gpointer data) |
| 1044 { | 1050 { |
| 1045 pidgin_dialogs_im(); | 1051 pidgin_dialogs_im(); |
| 1046 } | 1052 } |
| 1047 | 1053 |
| 1048 static void | 1054 static void |
| 1088 /* | 1094 /* |
| 1089 * It would be kinda cool if this gave the option of saving a | 1095 * It would be kinda cool if this gave the option of saving a |
| 1090 * plaintext v. HTML file. | 1096 * plaintext v. HTML file. |
| 1091 */ | 1097 */ |
| 1092 static void | 1098 static void |
| 1093 menu_save_as_cb(gpointer data, guint action, GtkWidget *widget) | 1099 menu_save_as_cb(GtkAction *action, gpointer data) |
| 1094 { | 1100 { |
| 1095 PidginWindow *win = data; | 1101 PidginWindow *win = data; |
| 1096 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); | 1102 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); |
| 1097 PurpleAccount *account = purple_conversation_get_account(conv); | 1103 PurpleAccount *account = purple_conversation_get_account(conv); |
| 1098 PurpleBuddy *buddy = purple_find_buddy(account, purple_conversation_get_name(conv)); | 1104 PurpleBuddy *buddy = purple_find_buddy(account, purple_conversation_get_name(conv)); |
| 1119 | 1125 |
| 1120 g_free(buf); | 1126 g_free(buf); |
| 1121 } | 1127 } |
| 1122 | 1128 |
| 1123 static void | 1129 static void |
| 1124 menu_view_log_cb(gpointer data, guint action, GtkWidget *widget) | 1130 menu_view_log_cb(GtkAction *action, gpointer data) |
| 1125 { | 1131 { |
| 1126 PidginWindow *win = data; | 1132 PidginWindow *win = data; |
| 1127 PurpleConversation *conv; | 1133 PurpleConversation *conv; |
| 1128 PurpleLogType type; | 1134 PurpleLogType type; |
| 1129 PidginBuddyList *gtkblist; | 1135 PidginBuddyList *gtkblist; |
| 1143 return; | 1149 return; |
| 1144 | 1150 |
| 1145 gtkblist = pidgin_blist_get_default_gtk_blist(); | 1151 gtkblist = pidgin_blist_get_default_gtk_blist(); |
| 1146 | 1152 |
| 1147 cursor = gdk_cursor_new(GDK_WATCH); | 1153 cursor = gdk_cursor_new(GDK_WATCH); |
| 1148 gdk_window_set_cursor(gtkblist->window->window, cursor); | 1154 gdk_window_set_cursor(gtk_widget_get_window(gtkblist->window), cursor); |
| 1149 gdk_window_set_cursor(win->window->window, cursor); | 1155 gdk_window_set_cursor(gtk_widget_get_window(win->window), cursor); |
| 1150 gdk_cursor_unref(cursor); | 1156 gdk_cursor_unref(cursor); |
| 1157 #if GTK_CHECK_VERSION(2,4,0) && !GTK_CHECK_VERSION(2,6,0) //FIXME: What? | |
| 1151 gdk_display_flush(gdk_drawable_get_display(GDK_DRAWABLE(widget->window))); | 1158 gdk_display_flush(gdk_drawable_get_display(GDK_DRAWABLE(widget->window))); |
| 1159 #endif | |
| 1152 | 1160 |
| 1153 name = purple_conversation_get_name(conv); | 1161 name = purple_conversation_get_name(conv); |
| 1154 account = purple_conversation_get_account(conv); | 1162 account = purple_conversation_get_account(conv); |
| 1155 | 1163 |
| 1156 buddies = purple_find_buddies(account, name); | 1164 buddies = purple_find_buddies(account, name); |
| 1159 PurpleBlistNode *node = cur->data; | 1167 PurpleBlistNode *node = cur->data; |
| 1160 if ((node != NULL) && ((node->prev != NULL) || (node->next != NULL))) | 1168 if ((node != NULL) && ((node->prev != NULL) || (node->next != NULL))) |
| 1161 { | 1169 { |
| 1162 pidgin_log_show_contact((PurpleContact *)node->parent); | 1170 pidgin_log_show_contact((PurpleContact *)node->parent); |
| 1163 g_slist_free(buddies); | 1171 g_slist_free(buddies); |
| 1164 gdk_window_set_cursor(gtkblist->window->window, NULL); | 1172 gdk_window_set_cursor(gtk_widget_get_window(gtkblist->window), NULL); |
| 1165 gdk_window_set_cursor(win->window->window, NULL); | 1173 gdk_window_set_cursor(gtk_widget_get_window(win->window), NULL); |
| 1166 return; | 1174 return; |
| 1167 } | 1175 } |
| 1168 } | 1176 } |
| 1169 g_slist_free(buddies); | 1177 g_slist_free(buddies); |
| 1170 | 1178 |
| 1171 pidgin_log_show(type, name, account); | 1179 pidgin_log_show(type, name, account); |
| 1172 | 1180 |
| 1173 gdk_window_set_cursor(gtkblist->window->window, NULL); | 1181 gdk_window_set_cursor(gtk_widget_get_window(gtkblist->window), NULL); |
| 1174 gdk_window_set_cursor(win->window->window, NULL); | 1182 gdk_window_set_cursor(gtk_widget_get_window(win->window), NULL); |
| 1175 } | 1183 } |
| 1176 | 1184 |
| 1177 static void | 1185 static void |
| 1178 menu_clear_cb(gpointer data, guint action, GtkWidget *widget) | 1186 menu_clear_cb(GtkAction *action, gpointer data) |
| 1179 { | 1187 { |
| 1180 PidginWindow *win = data; | 1188 PidginWindow *win = data; |
| 1181 PurpleConversation *conv; | 1189 PurpleConversation *conv; |
| 1182 | 1190 |
| 1183 conv = pidgin_conv_window_get_active_conversation(win); | 1191 conv = pidgin_conv_window_get_active_conversation(win); |
| 1184 purple_conversation_clear_message_history(conv); | 1192 purple_conversation_clear_message_history(conv); |
| 1185 } | 1193 } |
| 1186 | 1194 |
| 1187 static void | 1195 static void |
| 1188 menu_find_cb(gpointer data, guint action, GtkWidget *widget) | 1196 menu_find_cb(GtkAction *action, gpointer data) |
| 1189 { | 1197 { |
| 1190 PidginWindow *gtkwin = data; | 1198 PidginWindow *gtkwin = data; |
| 1191 PidginConversation *gtkconv = pidgin_conv_window_get_active_gtkconv(gtkwin); | 1199 PidginConversation *gtkconv = pidgin_conv_window_get_active_gtkconv(gtkwin); |
| 1192 gtk_widget_show_all(gtkconv->quickfind.container); | 1200 gtk_widget_show_all(gtkconv->quickfind.container); |
| 1193 gtk_widget_grab_focus(gtkconv->quickfind.entry); | 1201 gtk_widget_grab_focus(gtkconv->quickfind.entry); |
| 1194 } | 1202 } |
| 1195 | 1203 |
| 1196 #ifdef USE_VV | 1204 #ifdef USE_VV |
| 1197 static void | 1205 static void |
| 1198 menu_initiate_media_call_cb(gpointer data, guint action, GtkWidget *widget) | 1206 menu_initiate_media_call_cb(GtkAction *action, gpointer data) |
| 1199 { | 1207 { |
| 1200 PidginWindow *win = (PidginWindow *)data; | 1208 PidginWindow *win = (PidginWindow *)data; |
| 1201 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); | 1209 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); |
| 1202 PurpleAccount *account = purple_conversation_get_account(conv); | 1210 PurpleAccount *account = purple_conversation_get_account(conv); |
| 1203 | 1211 |
| 1204 purple_prpl_initiate_media(account, | 1212 purple_prpl_initiate_media(account, |
| 1205 purple_conversation_get_name(conv), | 1213 purple_conversation_get_name(conv), |
| 1206 action == 0 ? PURPLE_MEDIA_AUDIO : | 1214 action == win->audio_call ? PURPLE_MEDIA_AUDIO : |
| 1207 action == 1 ? PURPLE_MEDIA_VIDEO : | 1215 action == win->video_call ? PURPLE_MEDIA_VIDEO : |
| 1208 action == 2 ? PURPLE_MEDIA_AUDIO | | 1216 action == win->audio_video_call ? PURPLE_MEDIA_AUDIO | |
| 1209 PURPLE_MEDIA_VIDEO : PURPLE_MEDIA_NONE); | 1217 PURPLE_MEDIA_VIDEO : PURPLE_MEDIA_NONE); |
| 1210 } | 1218 } |
| 1211 #endif | 1219 #endif |
| 1212 | 1220 |
| 1213 static void | 1221 static void |
| 1214 menu_send_file_cb(gpointer data, guint action, GtkWidget *widget) | 1222 menu_send_file_cb(GtkAction *action, gpointer data) |
| 1215 { | 1223 { |
| 1216 PidginWindow *win = data; | 1224 PidginWindow *win = data; |
| 1217 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); | 1225 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); |
| 1218 | 1226 |
| 1219 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { | 1227 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { |
| 1221 } | 1229 } |
| 1222 | 1230 |
| 1223 } | 1231 } |
| 1224 | 1232 |
| 1225 static void | 1233 static void |
| 1226 menu_get_attention_cb(gpointer data, guint action, GtkWidget *widget) | 1234 menu_get_attention_cb(GObject *obj, gpointer data) |
| 1227 { | 1235 { |
| 1228 PidginWindow *win = data; | 1236 PidginWindow *win = data; |
| 1229 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); | 1237 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); |
| 1230 | 1238 |
| 1231 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { | 1239 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { |
| 1232 int index; | 1240 int index; |
| 1233 if (widget == win->menu.get_attention) | 1241 if ((GtkAction *)obj == win->menu.get_attention) |
| 1234 index = 0; | 1242 index = 0; |
| 1235 else | 1243 else |
| 1236 index = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "index")); | 1244 index = GPOINTER_TO_INT(g_object_get_data(obj, "index")); |
| 1237 purple_prpl_send_attention(purple_conversation_get_connection(conv), | 1245 purple_prpl_send_attention(purple_conversation_get_connection(conv), |
| 1238 purple_conversation_get_name(conv), index); | 1246 purple_conversation_get_name(conv), index); |
| 1239 } | 1247 } |
| 1240 } | 1248 } |
| 1241 | 1249 |
| 1242 static void | 1250 static void |
| 1243 menu_add_pounce_cb(gpointer data, guint action, GtkWidget *widget) | 1251 menu_add_pounce_cb(GtkAction *action, gpointer data) |
| 1244 { | 1252 { |
| 1245 PidginWindow *win = data; | 1253 PidginWindow *win = data; |
| 1246 PurpleConversation *conv; | 1254 PurpleConversation *conv; |
| 1247 | 1255 |
| 1248 conv = pidgin_conv_window_get_active_gtkconv(win)->active_conv; | 1256 conv = pidgin_conv_window_get_active_gtkconv(win)->active_conv; |
| 1250 pidgin_pounce_editor_show(purple_conversation_get_account(conv), | 1258 pidgin_pounce_editor_show(purple_conversation_get_account(conv), |
| 1251 purple_conversation_get_name(conv), NULL); | 1259 purple_conversation_get_name(conv), NULL); |
| 1252 } | 1260 } |
| 1253 | 1261 |
| 1254 static void | 1262 static void |
| 1255 menu_insert_link_cb(gpointer data, guint action, GtkWidget *widget) | 1263 menu_insert_link_cb(GtkAction *action, gpointer data) |
| 1256 { | 1264 { |
| 1257 PidginWindow *win = data; | 1265 PidginWindow *win = data; |
| 1258 PidginConversation *gtkconv; | 1266 PidginConversation *gtkconv; |
| 1259 GtkIMHtmlToolbar *toolbar; | 1267 GtkIMHtmlToolbar *toolbar; |
| 1260 | 1268 |
| 1264 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->link), | 1272 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->link), |
| 1265 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->link))); | 1273 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->link))); |
| 1266 } | 1274 } |
| 1267 | 1275 |
| 1268 static void | 1276 static void |
| 1269 menu_insert_image_cb(gpointer data, guint action, GtkWidget *widget) | 1277 menu_insert_image_cb(GtkAction *action, gpointer data) |
| 1270 { | 1278 { |
| 1271 PidginWindow *win = data; | 1279 PidginWindow *win = data; |
| 1272 PidginConversation *gtkconv; | 1280 PidginConversation *gtkconv; |
| 1273 GtkIMHtmlToolbar *toolbar; | 1281 GtkIMHtmlToolbar *toolbar; |
| 1274 | 1282 |
| 1279 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->image))); | 1287 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->image))); |
| 1280 } | 1288 } |
| 1281 | 1289 |
| 1282 | 1290 |
| 1283 static void | 1291 static void |
| 1284 menu_alias_cb(gpointer data, guint action, GtkWidget *widget) | 1292 menu_alias_cb(GtkAction *action, gpointer data) |
| 1285 { | 1293 { |
| 1286 PidginWindow *win = data; | 1294 PidginWindow *win = data; |
| 1287 PurpleConversation *conv; | 1295 PurpleConversation *conv; |
| 1288 PurpleAccount *account; | 1296 PurpleAccount *account; |
| 1289 const char *name; | 1297 const char *name; |
| 1306 pidgin_dialogs_alias_chat(c); | 1314 pidgin_dialogs_alias_chat(c); |
| 1307 } | 1315 } |
| 1308 } | 1316 } |
| 1309 | 1317 |
| 1310 static void | 1318 static void |
| 1311 menu_get_info_cb(gpointer data, guint action, GtkWidget *widget) | 1319 menu_get_info_cb(GtkAction *action, gpointer data) |
| 1312 { | 1320 { |
| 1313 PidginWindow *win = data; | 1321 PidginWindow *win = data; |
| 1314 PurpleConversation *conv; | 1322 PurpleConversation *conv; |
| 1315 | 1323 |
| 1316 conv = pidgin_conv_window_get_active_conversation(win); | 1324 conv = pidgin_conv_window_get_active_conversation(win); |
| 1317 | 1325 |
| 1318 info_cb(NULL, PIDGIN_CONVERSATION(conv)); | 1326 info_cb(NULL, PIDGIN_CONVERSATION(conv)); |
| 1319 } | 1327 } |
| 1320 | 1328 |
| 1321 static void | 1329 static void |
| 1322 menu_invite_cb(gpointer data, guint action, GtkWidget *widget) | 1330 menu_invite_cb(GtkAction *action, gpointer data) |
| 1323 { | 1331 { |
| 1324 PidginWindow *win = data; | 1332 PidginWindow *win = data; |
| 1325 PurpleConversation *conv; | 1333 PurpleConversation *conv; |
| 1326 | 1334 |
| 1327 conv = pidgin_conv_window_get_active_conversation(win); | 1335 conv = pidgin_conv_window_get_active_conversation(win); |
| 1328 | 1336 |
| 1329 invite_cb(NULL, PIDGIN_CONVERSATION(conv)); | 1337 invite_cb(NULL, PIDGIN_CONVERSATION(conv)); |
| 1330 } | 1338 } |
| 1331 | 1339 |
| 1332 static void | 1340 static void |
| 1333 menu_block_cb(gpointer data, guint action, GtkWidget *widget) | 1341 menu_block_cb(GtkAction *action, gpointer data) |
| 1334 { | 1342 { |
| 1335 PidginWindow *win = data; | 1343 PidginWindow *win = data; |
| 1336 PurpleConversation *conv; | 1344 PurpleConversation *conv; |
| 1337 | 1345 |
| 1338 conv = pidgin_conv_window_get_active_conversation(win); | 1346 conv = pidgin_conv_window_get_active_conversation(win); |
| 1339 | 1347 |
| 1340 block_cb(NULL, PIDGIN_CONVERSATION(conv)); | 1348 block_cb(NULL, PIDGIN_CONVERSATION(conv)); |
| 1341 } | 1349 } |
| 1342 | 1350 |
| 1343 static void | 1351 static void |
| 1344 menu_unblock_cb(gpointer data, guint action, GtkWidget *widget) | 1352 menu_unblock_cb(GtkAction *action, gpointer data) |
| 1345 { | 1353 { |
| 1346 PidginWindow *win = data; | 1354 PidginWindow *win = data; |
| 1347 PurpleConversation *conv; | 1355 PurpleConversation *conv; |
| 1348 | 1356 |
| 1349 conv = pidgin_conv_window_get_active_conversation(win); | 1357 conv = pidgin_conv_window_get_active_conversation(win); |
| 1350 | 1358 |
| 1351 unblock_cb(NULL, PIDGIN_CONVERSATION(conv)); | 1359 unblock_cb(NULL, PIDGIN_CONVERSATION(conv)); |
| 1352 } | 1360 } |
| 1353 | 1361 |
| 1354 static void | 1362 static void |
| 1355 menu_add_remove_cb(gpointer data, guint action, GtkWidget *widget) | 1363 menu_add_remove_cb(GtkAction *action, gpointer data) |
| 1356 { | 1364 { |
| 1357 PidginWindow *win = data; | 1365 PidginWindow *win = data; |
| 1358 PurpleConversation *conv; | 1366 PurpleConversation *conv; |
| 1359 | 1367 |
| 1360 conv = pidgin_conv_window_get_active_conversation(win); | 1368 conv = pidgin_conv_window_get_active_conversation(win); |
| 1395 #endif | 1403 #endif |
| 1396 } | 1404 } |
| 1397 } | 1405 } |
| 1398 | 1406 |
| 1399 static void | 1407 static void |
| 1400 menu_close_conv_cb(gpointer data, guint action, GtkWidget *widget) | 1408 menu_close_conv_cb(GtkAction *action, gpointer data) |
| 1401 { | 1409 { |
| 1402 PidginWindow *win = data; | 1410 PidginWindow *win = data; |
| 1403 | 1411 |
| 1404 close_conv_cb(NULL, PIDGIN_CONVERSATION(pidgin_conv_window_get_active_conversation(win))); | 1412 close_conv_cb(NULL, PIDGIN_CONVERSATION(pidgin_conv_window_get_active_conversation(win))); |
| 1405 } | 1413 } |
| 1406 | 1414 |
| 1407 static void | 1415 static void |
| 1408 menu_logging_cb(gpointer data, guint action, GtkWidget *widget) | 1416 menu_logging_cb(GtkAction *action, gpointer data) |
| 1409 { | 1417 { |
| 1410 PidginWindow *win = data; | 1418 PidginWindow *win = data; |
| 1411 PurpleConversation *conv; | 1419 PurpleConversation *conv; |
| 1412 gboolean logging; | 1420 gboolean logging; |
| 1413 PurpleBlistNode *node; | 1421 PurpleBlistNode *node; |
| 1415 conv = pidgin_conv_window_get_active_conversation(win); | 1423 conv = pidgin_conv_window_get_active_conversation(win); |
| 1416 | 1424 |
| 1417 if (conv == NULL) | 1425 if (conv == NULL) |
| 1418 return; | 1426 return; |
| 1419 | 1427 |
| 1420 logging = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); | 1428 logging = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)); |
| 1421 | 1429 |
| 1422 if (logging == purple_conversation_is_logging(conv)) | 1430 if (logging == purple_conversation_is_logging(conv)) |
| 1423 return; | 1431 return; |
| 1424 | 1432 |
| 1425 node = get_conversation_blist_node(conv); | 1433 node = get_conversation_blist_node(conv); |
| 1466 break; | 1474 break; |
| 1467 } | 1475 } |
| 1468 } | 1476 } |
| 1469 | 1477 |
| 1470 static void | 1478 static void |
| 1471 menu_toolbar_cb(gpointer data, guint action, GtkWidget *widget) | 1479 menu_toolbar_cb(GtkAction *action, gpointer data) |
| 1472 { | 1480 { |
| 1473 purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/conversations/show_formatting_toolbar", | 1481 purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/conversations/show_formatting_toolbar", |
| 1474 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))); | 1482 gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action))); |
| 1475 } | 1483 } |
| 1476 | 1484 |
| 1477 static void | 1485 static void |
| 1478 menu_sounds_cb(gpointer data, guint action, GtkWidget *widget) | 1486 menu_sounds_cb(GtkAction *action, gpointer data) |
| 1479 { | 1487 { |
| 1480 PidginWindow *win = data; | 1488 PidginWindow *win = data; |
| 1481 PurpleConversation *conv; | 1489 PurpleConversation *conv; |
| 1482 PidginConversation *gtkconv; | 1490 PidginConversation *gtkconv; |
| 1483 PurpleBlistNode *node; | 1491 PurpleBlistNode *node; |
| 1488 return; | 1496 return; |
| 1489 | 1497 |
| 1490 gtkconv = PIDGIN_CONVERSATION(conv); | 1498 gtkconv = PIDGIN_CONVERSATION(conv); |
| 1491 | 1499 |
| 1492 gtkconv->make_sound = | 1500 gtkconv->make_sound = |
| 1493 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); | 1501 gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)); |
| 1494 node = get_conversation_blist_node(conv); | 1502 node = get_conversation_blist_node(conv); |
| 1495 if (node) | 1503 if (node) |
| 1496 purple_blist_node_set_bool(node, "gtk-mute-sound", !gtkconv->make_sound); | 1504 purple_blist_node_set_bool(node, "gtk-mute-sound", !gtkconv->make_sound); |
| 1497 } | 1505 } |
| 1498 | 1506 |
| 1499 static void | 1507 static void |
| 1500 menu_timestamps_cb(gpointer data, guint action, GtkWidget *widget) | 1508 menu_timestamps_cb(GtkAction *action, gpointer data) |
| 1501 { | 1509 { |
| 1502 purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/conversations/show_timestamps", | 1510 purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/conversations/show_timestamps", |
| 1503 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))); | 1511 gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action))); |
| 1504 } | 1512 } |
| 1505 | 1513 |
| 1506 static void | 1514 static void |
| 1507 chat_do_im(PidginConversation *gtkconv, const char *who) | 1515 chat_do_im(PidginConversation *gtkconv, const char *who) |
| 1508 { | 1516 { |
| 1966 pidgin_tooltip_destroy(); | 1974 pidgin_tooltip_destroy(); |
| 1967 | 1975 |
| 1968 /* If CTRL was held down... */ | 1976 /* If CTRL was held down... */ |
| 1969 if (event->state & GDK_CONTROL_MASK) { | 1977 if (event->state & GDK_CONTROL_MASK) { |
| 1970 switch (event->keyval) { | 1978 switch (event->keyval) { |
| 1971 case GDK_Page_Down: | 1979 case GDK_KEY_Page_Down: |
| 1972 case GDK_KP_Page_Down: | 1980 case GDK_KEY_KP_Page_Down: |
| 1973 case ']': | 1981 case ']': |
| 1974 if (!pidgin_conv_window_get_gtkconv_at_index(win, curconv + 1)) | 1982 if (!pidgin_conv_window_get_gtkconv_at_index(win, curconv + 1)) |
| 1975 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0); | 1983 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0); |
| 1976 else | 1984 else |
| 1977 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), curconv + 1); | 1985 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), curconv + 1); |
| 1978 return TRUE; | 1986 return TRUE; |
| 1979 break; | 1987 break; |
| 1980 | 1988 |
| 1981 case GDK_Page_Up: | 1989 case GDK_KEY_Page_Up: |
| 1982 case GDK_KP_Page_Up: | 1990 case GDK_KEY_KP_Page_Up: |
| 1983 case '[': | 1991 case '[': |
| 1984 if (!pidgin_conv_window_get_gtkconv_at_index(win, curconv - 1)) | 1992 if (!pidgin_conv_window_get_gtkconv_at_index(win, curconv - 1)) |
| 1985 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), -1); | 1993 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), -1); |
| 1986 else | 1994 else |
| 1987 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), curconv - 1); | 1995 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), curconv - 1); |
| 1988 return TRUE; | 1996 return TRUE; |
| 1989 break; | 1997 break; |
| 1990 | 1998 |
| 1991 case GDK_Tab: | 1999 case GDK_KEY_Tab: |
| 1992 case GDK_KP_Tab: | 2000 case GDK_KEY_KP_Tab: |
| 1993 case GDK_ISO_Left_Tab: | 2001 case GDK_KEY_ISO_Left_Tab: |
| 1994 if (event->state & GDK_SHIFT_MASK) { | 2002 if (event->state & GDK_SHIFT_MASK) { |
| 1995 move_to_next_unread_tab(gtkconv, FALSE); | 2003 move_to_next_unread_tab(gtkconv, FALSE); |
| 1996 } else { | 2004 } else { |
| 1997 move_to_next_unread_tab(gtkconv, TRUE); | 2005 move_to_next_unread_tab(gtkconv, TRUE); |
| 1998 } | 2006 } |
| 1999 | 2007 |
| 2000 return TRUE; | 2008 return TRUE; |
| 2001 break; | 2009 break; |
| 2002 | 2010 |
| 2003 case GDK_comma: | 2011 case GDK_KEY_comma: |
| 2004 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook), | 2012 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook), |
| 2005 gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), curconv), | 2013 gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), curconv), |
| 2006 curconv - 1); | 2014 curconv - 1); |
| 2007 return TRUE; | 2015 return TRUE; |
| 2008 break; | 2016 break; |
| 2009 | 2017 |
| 2010 case GDK_period: | 2018 case GDK_KEY_period: |
| 2011 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook), | 2019 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook), |
| 2012 gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), curconv), | 2020 gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), curconv), |
| 2013 (curconv + 1) % gtk_notebook_get_n_pages(GTK_NOTEBOOK(win->notebook))); | 2021 (curconv + 1) % gtk_notebook_get_n_pages(GTK_NOTEBOOK(win->notebook))); |
| 2014 return TRUE; | 2022 return TRUE; |
| 2015 break; | 2023 break; |
| 2016 case GDK_F6: | 2024 case GDK_KEY_F6: |
| 2017 if (gtkconv_cycle_focus(gtkconv, event->state & GDK_SHIFT_MASK ? GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD)) | 2025 if (gtkconv_cycle_focus(gtkconv, event->state & GDK_SHIFT_MASK ? GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD)) |
| 2018 return TRUE; | 2026 return TRUE; |
| 2019 break; | 2027 break; |
| 2020 } /* End of switch */ | 2028 } /* End of switch */ |
| 2021 } | 2029 } |
| 2035 | 2043 |
| 2036 /* If neither CTRL nor ALT were held down... */ | 2044 /* If neither CTRL nor ALT were held down... */ |
| 2037 else | 2045 else |
| 2038 { | 2046 { |
| 2039 switch (event->keyval) { | 2047 switch (event->keyval) { |
| 2040 case GDK_F2: | 2048 case GDK_KEY_F2: |
| 2041 if (gtk_widget_is_focus(GTK_WIDGET(win->notebook))) { | 2049 if (gtk_widget_is_focus(GTK_WIDGET(win->notebook))) { |
| 2042 infopane_entry_activate(gtkconv); | 2050 infopane_entry_activate(gtkconv); |
| 2043 return TRUE; | 2051 return TRUE; |
| 2044 } | 2052 } |
| 2045 break; | 2053 break; |
| 2046 case GDK_F6: | 2054 case GDK_KEY_F6: |
| 2047 if (gtkconv_cycle_focus(gtkconv, event->state & GDK_SHIFT_MASK ? GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD)) | 2055 if (gtkconv_cycle_focus(gtkconv, event->state & GDK_SHIFT_MASK ? GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD)) |
| 2048 return TRUE; | 2056 return TRUE; |
| 2049 break; | 2057 break; |
| 2050 } | 2058 } |
| 2051 } | 2059 } |
| 2065 return TRUE; | 2073 return TRUE; |
| 2066 | 2074 |
| 2067 /* If CTRL was held down... */ | 2075 /* If CTRL was held down... */ |
| 2068 if (event->state & GDK_CONTROL_MASK) { | 2076 if (event->state & GDK_CONTROL_MASK) { |
| 2069 switch (event->keyval) { | 2077 switch (event->keyval) { |
| 2070 case GDK_Up: | 2078 case GDK_KEY_Up: |
| 2071 if (!gtkconv->send_history) | 2079 if (!gtkconv->send_history) |
| 2072 break; | 2080 break; |
| 2073 | 2081 |
| 2074 if (gtkconv->entry != entry) | 2082 if (gtkconv->entry != entry) |
| 2075 break; | 2083 break; |
| 2116 } | 2124 } |
| 2117 | 2125 |
| 2118 return TRUE; | 2126 return TRUE; |
| 2119 break; | 2127 break; |
| 2120 | 2128 |
| 2121 case GDK_Down: | 2129 case GDK_KEY_Down: |
| 2122 if (!gtkconv->send_history) | 2130 if (!gtkconv->send_history) |
| 2123 break; | 2131 break; |
| 2124 | 2132 |
| 2125 if (gtkconv->entry != entry) | 2133 if (gtkconv->entry != entry) |
| 2126 break; | 2134 break; |
| 2169 } | 2177 } |
| 2170 | 2178 |
| 2171 /* If neither CTRL nor ALT were held down... */ | 2179 /* If neither CTRL nor ALT were held down... */ |
| 2172 else { | 2180 else { |
| 2173 switch (event->keyval) { | 2181 switch (event->keyval) { |
| 2174 case GDK_Tab: | 2182 case GDK_KEY_Tab: |
| 2175 case GDK_KP_Tab: | 2183 case GDK_KEY_KP_Tab: |
| 2176 case GDK_ISO_Left_Tab: | 2184 case GDK_KEY_ISO_Left_Tab: |
| 2177 if (gtkconv->entry != entry) | 2185 if (gtkconv->entry != entry) |
| 2178 break; | 2186 break; |
| 2179 { | 2187 { |
| 2180 gint plugin_return; | 2188 gint plugin_return; |
| 2181 plugin_return = GPOINTER_TO_INT(purple_signal_emit_return_1( | 2189 plugin_return = GPOINTER_TO_INT(purple_signal_emit_return_1( |
| 2183 conv, event->state & GDK_SHIFT_MASK)); | 2191 conv, event->state & GDK_SHIFT_MASK)); |
| 2184 return plugin_return ? TRUE : tab_complete(conv); | 2192 return plugin_return ? TRUE : tab_complete(conv); |
| 2185 } | 2193 } |
| 2186 break; | 2194 break; |
| 2187 | 2195 |
| 2188 case GDK_Page_Up: | 2196 case GDK_KEY_Page_Up: |
| 2189 case GDK_KP_Page_Up: | 2197 case GDK_KEY_KP_Page_Up: |
| 2190 gtk_webview_page_up(GTK_WEBVIEW(gtkconv->webview)); | 2198 gtk_webview_page_up(GTK_WEBVIEW(gtkconv->webview)); |
| 2191 return TRUE; | 2199 return TRUE; |
| 2192 break; | 2200 break; |
| 2193 | 2201 |
| 2194 case GDK_Page_Down: | 2202 case GDK_KEY_Page_Down: |
| 2195 case GDK_KP_Page_Down: | 2203 case GDK_KEY_KP_Page_Down: |
| 2196 gtk_webview_page_down(GTK_WEBVIEW(gtkconv->webview)); | 2204 gtk_webview_page_down(GTK_WEBVIEW(gtkconv->webview)); |
| 2197 return TRUE; | 2205 return TRUE; |
| 2198 break; | 2206 break; |
| 2199 | 2207 |
| 2200 } | 2208 } |
| 2234 { | 2242 { |
| 2235 PidginConversation *gtkconv = data; | 2243 PidginConversation *gtkconv = data; |
| 2236 | 2244 |
| 2237 /* If we have a valid key for the conversation display, then exit */ | 2245 /* If we have a valid key for the conversation display, then exit */ |
| 2238 if ((event->state & GDK_CONTROL_MASK) || | 2246 if ((event->state & GDK_CONTROL_MASK) || |
| 2239 (event->keyval == GDK_F6) || | 2247 (event->keyval == GDK_KEY_F6) || |
| 2240 (event->keyval == GDK_F10) || | 2248 (event->keyval == GDK_KEY_F10) || |
| 2241 (event->keyval == GDK_Shift_L) || | 2249 (event->keyval == GDK_KEY_Shift_L) || |
| 2242 (event->keyval == GDK_Shift_R) || | 2250 (event->keyval == GDK_KEY_Shift_R) || |
| 2243 (event->keyval == GDK_Control_L) || | 2251 (event->keyval == GDK_KEY_Control_L) || |
| 2244 (event->keyval == GDK_Control_R) || | 2252 (event->keyval == GDK_KEY_Control_R) || |
| 2245 (event->keyval == GDK_Escape) || | 2253 (event->keyval == GDK_KEY_Escape) || |
| 2246 (event->keyval == GDK_Up) || | 2254 (event->keyval == GDK_KEY_Up) || |
| 2247 (event->keyval == GDK_Down) || | 2255 (event->keyval == GDK_KEY_Down) || |
| 2248 (event->keyval == GDK_Left) || | 2256 (event->keyval == GDK_KEY_Left) || |
| 2249 (event->keyval == GDK_Right) || | 2257 (event->keyval == GDK_KEY_Right) || |
| 2250 (event->keyval == GDK_Page_Up) || | 2258 (event->keyval == GDK_KEY_Page_Up) || |
| 2251 (event->keyval == GDK_KP_Page_Up) || | 2259 (event->keyval == GDK_KEY_KP_Page_Up) || |
| 2252 (event->keyval == GDK_Page_Down) || | 2260 (event->keyval == GDK_KEY_Page_Down) || |
| 2253 (event->keyval == GDK_KP_Page_Down) || | 2261 (event->keyval == GDK_KEY_KP_Page_Down) || |
| 2254 (event->keyval == GDK_Home) || | 2262 (event->keyval == GDK_KEY_Home) || |
| 2255 (event->keyval == GDK_End) || | 2263 (event->keyval == GDK_KEY_End) || |
| 2256 (event->keyval == GDK_Tab) || | 2264 (event->keyval == GDK_KEY_Tab) || |
| 2257 (event->keyval == GDK_KP_Tab) || | 2265 (event->keyval == GDK_KEY_KP_Tab) || |
| 2258 (event->keyval == GDK_ISO_Left_Tab)) | 2266 (event->keyval == GDK_KEY_ISO_Left_Tab)) |
| 2259 { | 2267 { |
| 2260 if (event->type == GDK_KEY_PRESS) | 2268 if (event->type == GDK_KEY_PRESS) |
| 2261 return conv_keypress_common(gtkconv, event); | 2269 return conv_keypress_common(gtkconv, event); |
| 2262 return FALSE; | 2270 return FALSE; |
| 2263 } | 2271 } |
| 2297 | 2305 |
| 2298 purple_conversation_close_logs(old_conv); | 2306 purple_conversation_close_logs(old_conv); |
| 2299 gtkconv->active_conv = conv; | 2307 gtkconv->active_conv = conv; |
| 2300 | 2308 |
| 2301 purple_conversation_set_logging(conv, | 2309 purple_conversation_set_logging(conv, |
| 2302 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(gtkconv->win->menu.logging))); | 2310 gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(gtkconv->win->menu.logging))); |
| 2303 | 2311 |
| 2304 entry = GTK_IMHTML(gtkconv->entry); | 2312 entry = GTK_IMHTML(gtkconv->entry); |
| 2305 protocol_name = purple_account_get_protocol_name(purple_conversation_get_account(conv)); | 2313 protocol_name = purple_account_get_protocol_name(purple_conversation_get_account(conv)); |
| 2306 gtk_imhtml_set_protocol_name(entry, protocol_name); | 2314 gtk_imhtml_set_protocol_name(entry, protocol_name); |
| 2307 /* TODO WEBKIT: gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->imhtml), protocol_name); */ | 2315 /* TODO WEBKIT: gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->imhtml), protocol_name); */ |
| 2486 | 2494 |
| 2487 /* Use the buddy icon, if possible */ | 2495 /* Use the buddy icon, if possible */ |
| 2488 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { | 2496 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { |
| 2489 PurpleBuddy *b = purple_find_buddy(account, name); | 2497 PurpleBuddy *b = purple_find_buddy(account, name); |
| 2490 if (b != NULL) { | 2498 if (b != NULL) { |
| 2491 PurplePresence *p; | 2499 PurplePresence *p = purple_buddy_get_presence(b); |
| 2492 p = purple_buddy_get_presence(b); | |
| 2493 if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_AWAY)) | 2500 if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_AWAY)) |
| 2494 return away_list; | 2501 return away_list; |
| 2495 if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_UNAVAILABLE)) | 2502 if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_UNAVAILABLE)) |
| 2496 return busy_list; | 2503 return busy_list; |
| 2497 if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_EXTENDED_AWAY)) | 2504 if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_EXTENDED_AWAY)) |
| 2723 | 2730 |
| 2724 return FALSE; | 2731 return FALSE; |
| 2725 } | 2732 } |
| 2726 | 2733 |
| 2727 static void | 2734 static void |
| 2728 start_anim(GtkObject *obj, PidginConversation *gtkconv) | 2735 start_anim(GtkWidget *widget, PidginConversation *gtkconv) |
| 2729 { | 2736 { |
| 2730 int delay; | 2737 int delay; |
| 2731 | 2738 |
| 2732 if (gtkconv->u.im->anim == NULL) | 2739 if (gtkconv->u.im->anim == NULL) |
| 2733 return; | 2740 return; |
| 2896 | 2903 |
| 2897 g_free(buf); | 2904 g_free(buf); |
| 2898 } | 2905 } |
| 2899 | 2906 |
| 2900 static void | 2907 static void |
| 2901 stop_anim(GtkObject *obj, PidginConversation *gtkconv) | 2908 stop_anim(GtkWidget *widget, PidginConversation *gtkconv) |
| 2902 { | 2909 { |
| 2903 if (gtkconv->u.im->icon_timer != 0) | 2910 if (gtkconv->u.im->icon_timer != 0) |
| 2904 g_source_remove(gtkconv->u.im->icon_timer); | 2911 g_source_remove(gtkconv->u.im->icon_timer); |
| 2905 | 2912 |
| 2906 gtkconv->u.im->icon_timer = 0; | 2913 gtkconv->u.im->icon_timer = 0; |
| 2918 else | 2925 else |
| 2919 stop_anim(NULL, gtkconv); | 2926 stop_anim(NULL, gtkconv); |
| 2920 } | 2927 } |
| 2921 | 2928 |
| 2922 static gboolean | 2929 static gboolean |
| 2923 icon_menu(GtkObject *obj, GdkEventButton *e, PidginConversation *gtkconv) | 2930 icon_menu(GtkWidget *widget, GdkEventButton *e, PidginConversation *gtkconv) |
| 2924 { | 2931 { |
| 2925 static GtkWidget *menu = NULL; | 2932 static GtkWidget *menu = NULL; |
| 2926 PurpleConversation *conv; | 2933 PurpleConversation *conv; |
| 2927 PurpleBuddy *buddy; | 2934 PurpleBuddy *buddy; |
| 2928 | 2935 |
| 3112 { | 3119 { |
| 3113 g_return_val_if_fail(gtkconv != NULL, NULL); | 3120 g_return_val_if_fail(gtkconv != NULL, NULL); |
| 3114 return gtkconv->win; | 3121 return gtkconv->win; |
| 3115 } | 3122 } |
| 3116 | 3123 |
| 3124 #if 1 | |
| 3125 | |
| 3126 static GtkActionEntry menu_entries[] = | |
| 3127 /* TODO: fill out tooltips... */ | |
| 3128 { | |
| 3129 /* Conversation menu */ | |
| 3130 { "ConversationMenu", NULL, N_("_Conversation"), NULL, NULL, NULL }, | |
| 3131 { "NewInstantMessage", PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW, N_("New Instant _Message..."), "<control>M", NULL, G_CALLBACK(menu_new_conv_cb) }, | |
| 3132 { "Find", GTK_STOCK_FIND, N_("_Find..."), NULL, NULL, G_CALLBACK(menu_find_cb) }, | |
| 3133 { "ViewLog", NULL, N_("View _Log"), NULL, NULL, G_CALLBACK(menu_view_log_cb) }, | |
| 3134 { "SaveAs", GTK_STOCK_SAVE_AS, N_("_Save As..."), NULL, NULL, G_CALLBACK(menu_save_as_cb) }, | |
| 3135 { "ClearScrollback", GTK_STOCK_CLEAR, N_("Clea_r Scrollback"), "<control>L", NULL, G_CALLBACK(menu_clear_cb) }, | |
| 3136 | |
| 3137 #ifdef USE_VV | |
| 3138 { "MediaMenu", NULL, N_("M_edia"), NULL, NULL, NULL }, | |
| 3139 { "AudioCall", PIDGIN_STOCK_TOOLBAR_AUDIO_CALL, N_("_Audio Call"), NULL, NULL, G_CALLBACK(menu_initiate_media_call_cb) }, | |
| 3140 { "VideoCall", PIDGIN_STOCK_TOOLBAR_VIDEO_CALL, N_("_Video Call"), NULL, NULL, G_CALLBACK(menu_initiate_media_call_cb) }, | |
| 3141 { "AudioVideoCall", PIDGIN_STOCK_TOOLBAR_VIDEO_CALL, N_("Audio/Video _Call"), NULL, NULL, G_CALLBACK(menu_initiate_media_call_cb) }, | |
| 3142 #endif | |
| 3143 | |
| 3144 { "SendFile", PIDGIN_STOCK_TOOLBAR_SEND_FILE, N_("Se_nd File..."), NULL, NULL, G_CALLBACK(menu_send_file_cb) }, | |
| 3145 { "GetAttention", PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION, N_("Get _Attention"), NULL, NULL, G_CALLBACK(menu_get_attention_cb) }, | |
| 3146 { "AddBuddyPounce", NULL, N_("Add Buddy _Pounce..."), NULL, NULL, G_CALLBACK(menu_add_pounce_cb) }, | |
| 3147 { "GetInfo", PIDGIN_STOCK_TOOLBAR_USER_INFO, N_("_Get Info"), "<control>O", NULL, G_CALLBACK(menu_get_info_cb) }, | |
| 3148 { "Invite", NULL, N_("In_vite..."), NULL, NULL, G_CALLBACK(menu_invite_cb) }, | |
| 3149 { "MoreMenu", NULL, N_("M_ore"), NULL, NULL, NULL }, | |
| 3150 { "Alias", NULL, N_("Al_ias..."), NULL, NULL, G_CALLBACK(menu_alias_cb) }, | |
| 3151 { "Block", PIDGIN_STOCK_TOOLBAR_BLOCK, N_("_Block..."), NULL, NULL, G_CALLBACK(menu_block_cb) }, | |
| 3152 { "Unblock", PIDGIN_STOCK_TOOLBAR_UNBLOCK, N_("_Unblock..."), NULL, NULL, G_CALLBACK(menu_unblock_cb) }, | |
| 3153 { "Add", GTK_STOCK_ADD, N_("_Add..."), NULL, NULL, G_CALLBACK(menu_add_remove_cb) }, | |
| 3154 { "Remove", GTK_STOCK_REMOVE, N_("_Remove..."), NULL, NULL, G_CALLBACK(menu_add_remove_cb) }, | |
| 3155 { "InsertLink", PIDGIN_STOCK_TOOLBAR_INSERT_LINK, N_("Insert Lin_k..."), NULL, NULL, G_CALLBACK(menu_insert_link_cb) }, | |
| 3156 { "InsertImage", PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE, N_("Insert Imag_e..."), NULL, NULL, G_CALLBACK(menu_insert_image_cb) }, | |
| 3157 { "Close", GTK_STOCK_CLOSE, N_("_Close"), NULL, NULL, G_CALLBACK(menu_close_conv_cb) }, | |
| 3158 | |
| 3159 /* Options */ | |
| 3160 { "OptionsMenu", NULL, N_("_Options"), NULL, NULL, NULL }, | |
| 3161 }; | |
| 3162 | |
| 3163 /* Toggle items */ | |
| 3164 static const GtkToggleActionEntry menu_toggle_entries[] = { | |
| 3165 { "EnableLogging", NULL, N_("Enable _Logging"), NULL, NULL, G_CALLBACK(menu_logging_cb), FALSE }, | |
| 3166 { "EnableSounds", NULL, N_("Enable _Sounds"), NULL, NULL, G_CALLBACK(menu_sounds_cb), FALSE }, | |
| 3167 { "ShowFormattingToolbars", NULL, N_("Show Formatting _Toolbars"), NULL, NULL, G_CALLBACK(menu_toolbar_cb), FALSE }, | |
| 3168 { "ShowTimestamps", NULL, N_("Show Ti_mestamps"), NULL, NULL, G_CALLBACK(menu_timestamps_cb), FALSE }, | |
| 3169 }; | |
| 3170 | |
| 3171 static const char *conversation_menu = | |
| 3172 "<ui>" | |
| 3173 "<menubar name='Conversation'>" | |
| 3174 "<menu action='ConversationMenu'>" | |
| 3175 "<menuitem action='NewInstantMessage'/>" | |
| 3176 "<separator/>" | |
| 3177 "<menuitem action='Find'/>" | |
| 3178 "<menuitem action='ViewLog'/>" | |
| 3179 "<menuitem action='SaveAs'/>" | |
| 3180 "<menuitem action='ClearScrollback'/>" | |
| 3181 "<separator/>" | |
| 3182 #ifdef USE_VV | |
| 3183 "<menu action='MediaMenu'>" | |
| 3184 "<menuitem action='AudioCall'/>" | |
| 3185 "<menuitem action='VideoCall'/>" | |
| 3186 "<menuitem action='AudioVideoCall'/>" | |
| 3187 "</menu>" | |
| 3188 #endif | |
| 3189 "<menuitem action='SendFile'/>" | |
| 3190 "<menuitem action='GetAttention'/>" | |
| 3191 "<menuitem action='AddBuddyPounce'/>" | |
| 3192 "<menuitem action='GetInfo'/>" | |
| 3193 "<menuitem action='Invite'/>" | |
| 3194 "<menu action='MoreMenu'/>" | |
| 3195 "<separator/>" | |
| 3196 "<menuitem action='Alias'/>" | |
| 3197 "<menuitem action='Block'/>" | |
| 3198 "<menuitem action='Unblock'/>" | |
| 3199 "<menuitem action='Add'/>" | |
| 3200 "<menuitem action='Remove'/>" | |
| 3201 "<separator/>" | |
| 3202 "<menuitem action='InsertLink'/>" | |
| 3203 "<menuitem action='InsertImage'/>" | |
| 3204 "<separator/>" | |
| 3205 "<menuitem action='Close'/>" | |
| 3206 "</menu>" | |
| 3207 "<menu action='OptionsMenu'>" | |
| 3208 "<menuitem action='EnableLogging'/>" | |
| 3209 "<menuitem action='EnableSounds'/>" | |
| 3210 "<separator/>" | |
| 3211 "<menuitem action='ShowFormattingToolbars'/>" | |
| 3212 "<menuitem action='ShowTimestamps'/>" | |
| 3213 "</menu>" | |
| 3214 "</menubar>" | |
| 3215 "</ui>"; | |
| 3216 | |
| 3217 #else | |
| 3218 | |
| 3117 static GtkItemFactoryEntry menu_items[] = | 3219 static GtkItemFactoryEntry menu_items[] = |
| 3118 { | 3220 { |
| 3119 /* Conversation menu */ | 3221 /* Conversation menu */ |
| 3120 { N_("/_Conversation"), NULL, NULL, 0, "<Branch>", NULL }, | 3222 { N_("/_Conversation"), NULL, NULL, 0, "<Branch>", NULL }, |
| 3121 | 3223 |
| 3188 { N_("/Options/Enable _Sounds"), NULL, menu_sounds_cb, 0, "<CheckItem>", NULL }, | 3290 { N_("/Options/Enable _Sounds"), NULL, menu_sounds_cb, 0, "<CheckItem>", NULL }, |
| 3189 { "/Options/sep0", NULL, NULL, 0, "<Separator>", NULL }, | 3291 { "/Options/sep0", NULL, NULL, 0, "<Separator>", NULL }, |
| 3190 { N_("/Options/Show Formatting _Toolbars"), NULL, menu_toolbar_cb, 0, "<CheckItem>", NULL }, | 3292 { N_("/Options/Show Formatting _Toolbars"), NULL, menu_toolbar_cb, 0, "<CheckItem>", NULL }, |
| 3191 { N_("/Options/Show Ti_mestamps"), NULL, menu_timestamps_cb, 0, "<CheckItem>", NULL }, | 3293 { N_("/Options/Show Ti_mestamps"), NULL, menu_timestamps_cb, 0, "<CheckItem>", NULL }, |
| 3192 }; | 3294 }; |
| 3193 | 3295 #endif |
| 3194 static const int menu_item_count = | |
| 3195 sizeof(menu_items) / sizeof(*menu_items); | |
| 3196 | |
| 3197 static const char * | |
| 3198 item_factory_translate_func (const char *path, gpointer func_data) | |
| 3199 { | |
| 3200 return _(path); | |
| 3201 } | |
| 3202 | 3296 |
| 3203 static void | 3297 static void |
| 3204 sound_method_pref_changed_cb(const char *name, PurplePrefType type, | 3298 sound_method_pref_changed_cb(const char *name, PurplePrefType type, |
| 3205 gconstpointer value, gpointer data) | 3299 gconstpointer value, gpointer data) |
| 3206 { | 3300 { |
| 3207 PidginWindow *win = data; | 3301 PidginWindow *win = data; |
| 3208 const char *method = value; | 3302 const char *method = value; |
| 3209 | 3303 |
| 3210 if (!strcmp(method, "none")) | 3304 if (!strcmp(method, "none")) |
| 3211 { | 3305 { |
| 3212 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.sounds), | 3306 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(win->menu.sounds), |
| 3213 FALSE); | 3307 FALSE); |
| 3214 gtk_widget_set_sensitive(win->menu.sounds, FALSE); | 3308 gtk_action_set_sensitive(win->menu.sounds, FALSE); |
| 3215 } | 3309 } |
| 3216 else | 3310 else |
| 3217 { | 3311 { |
| 3218 PidginConversation *gtkconv = pidgin_conv_window_get_active_gtkconv(win); | 3312 PidginConversation *gtkconv = pidgin_conv_window_get_active_gtkconv(win); |
| 3219 | 3313 |
| 3220 if (gtkconv != NULL) | 3314 if (gtkconv != NULL) |
| 3221 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.sounds), | 3315 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(win->menu.sounds), |
| 3222 gtkconv->make_sound); | 3316 gtkconv->make_sound); |
| 3223 gtk_widget_set_sensitive(win->menu.sounds, TRUE); | 3317 gtk_action_set_sensitive(win->menu.sounds, TRUE); |
| 3224 | |
| 3225 } | 3318 } |
| 3226 } | 3319 } |
| 3227 | 3320 |
| 3228 /* Returns TRUE if some items were added to the menu, FALSE otherwise */ | 3321 /* Returns TRUE if some items were added to the menu, FALSE otherwise */ |
| 3229 static gboolean | 3322 static gboolean |
| 3349 == PURPLE_CONV_TYPE_IM) { | 3442 == PURPLE_CONV_TYPE_IM) { |
| 3350 PurpleMediaCaps caps = | 3443 PurpleMediaCaps caps = |
| 3351 purple_prpl_get_media_caps(account, | 3444 purple_prpl_get_media_caps(account, |
| 3352 purple_conversation_get_name(conv)); | 3445 purple_conversation_get_name(conv)); |
| 3353 | 3446 |
| 3354 gtk_widget_set_sensitive(win->audio_call, | 3447 gtk_action_set_sensitive(win->audio_call, |
| 3355 caps & PURPLE_MEDIA_CAPS_AUDIO | 3448 caps & PURPLE_MEDIA_CAPS_AUDIO |
| 3356 ? TRUE : FALSE); | 3449 ? TRUE : FALSE); |
| 3357 gtk_widget_set_sensitive(win->video_call, | 3450 gtk_action_set_sensitive(win->video_call, |
| 3358 caps & PURPLE_MEDIA_CAPS_VIDEO | 3451 caps & PURPLE_MEDIA_CAPS_VIDEO |
| 3359 ? TRUE : FALSE); | 3452 ? TRUE : FALSE); |
| 3360 gtk_widget_set_sensitive(win->audio_video_call, | 3453 gtk_action_set_sensitive(win->audio_video_call, |
| 3361 caps & PURPLE_MEDIA_CAPS_AUDIO_VIDEO | 3454 caps & PURPLE_MEDIA_CAPS_AUDIO_VIDEO |
| 3362 ? TRUE : FALSE); | 3455 ? TRUE : FALSE); |
| 3363 } else if (purple_conversation_get_type(conv) | 3456 } else if (purple_conversation_get_type(conv) |
| 3364 == PURPLE_CONV_TYPE_CHAT) { | 3457 == PURPLE_CONV_TYPE_CHAT) { |
| 3365 /* for now, don't care about chats... */ | 3458 /* for now, don't care about chats... */ |
| 3366 gtk_widget_set_sensitive(win->audio_call, FALSE); | 3459 gtk_action_set_sensitive(win->audio_call, FALSE); |
| 3367 gtk_widget_set_sensitive(win->video_call, FALSE); | 3460 gtk_action_set_sensitive(win->video_call, FALSE); |
| 3368 gtk_widget_set_sensitive(win->audio_video_call, FALSE); | 3461 gtk_action_set_sensitive(win->audio_video_call, FALSE); |
| 3369 } else { | 3462 } else { |
| 3370 gtk_widget_set_sensitive(win->audio_call, FALSE); | 3463 gtk_action_set_sensitive(win->audio_call, FALSE); |
| 3371 gtk_widget_set_sensitive(win->video_call, FALSE); | 3464 gtk_action_set_sensitive(win->video_call, FALSE); |
| 3372 gtk_widget_set_sensitive(win->audio_video_call, FALSE); | 3465 gtk_action_set_sensitive(win->audio_video_call, FALSE); |
| 3373 } | 3466 } |
| 3374 #endif | 3467 #endif |
| 3375 } | 3468 } |
| 3376 | 3469 |
| 3377 static void | 3470 static void |
| 3432 regenerate_options_items(PidginWindow *win) | 3525 regenerate_options_items(PidginWindow *win) |
| 3433 { | 3526 { |
| 3434 GtkWidget *menu; | 3527 GtkWidget *menu; |
| 3435 PidginConversation *gtkconv; | 3528 PidginConversation *gtkconv; |
| 3436 GList *list; | 3529 GList *list; |
| 3437 | 3530 #if GTK_CHECK_VERSION(2,6,0) |
| 3531 GtkWidget *more_menu; | |
| 3532 | |
| 3533 gtkconv = pidgin_conv_window_get_active_gtkconv(win); | |
| 3534 more_menu = gtk_ui_manager_get_widget(win->menu.ui, | |
| 3535 "/Conversation/ConversationMenu/MoreMenu"); | |
| 3536 gtk_widget_show(more_menu); | |
| 3537 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(more_menu)); | |
| 3538 #else | |
| 3438 gtkconv = pidgin_conv_window_get_active_gtkconv(win); | 3539 gtkconv = pidgin_conv_window_get_active_gtkconv(win); |
| 3439 menu = gtk_item_factory_get_widget(win->menu.item_factory, N_("/Conversation/More")); | 3540 menu = gtk_item_factory_get_widget(win->menu.item_factory, N_("/Conversation/More")); |
| 3541 #endif | |
| 3440 | 3542 |
| 3441 /* Remove the previous entries */ | 3543 /* Remove the previous entries */ |
| 3442 for (list = gtk_container_get_children(GTK_CONTAINER(menu)); list; ) | 3544 for (list = gtk_container_get_children(GTK_CONTAINER(menu)); list; ) |
| 3443 { | 3545 { |
| 3444 GtkWidget *w = list->data; | 3546 GtkWidget *w = list->data; |
| 3490 G_CALLBACK(remove_from_list), win); | 3592 G_CALLBACK(remove_from_list), win); |
| 3491 gtk_widget_destroy(action_items->data); | 3593 gtk_widget_destroy(action_items->data); |
| 3492 action_items = g_list_delete_link(action_items, action_items); | 3594 action_items = g_list_delete_link(action_items, action_items); |
| 3493 } | 3595 } |
| 3494 | 3596 |
| 3597 #if GTK_CHECK_VERSION(2,6,0) | |
| 3598 item = gtk_ui_manager_get_widget(win->menu.ui, "/Conversation/OptionsMenu"); | |
| 3599 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(item)); | |
| 3600 #else | |
| 3495 menu = gtk_item_factory_get_widget(win->menu.item_factory, N_("/Options")); | 3601 menu = gtk_item_factory_get_widget(win->menu.item_factory, N_("/Options")); |
| 3602 #endif | |
| 3496 | 3603 |
| 3497 list = purple_conversation_get_extended_menu(conv); | 3604 list = purple_conversation_get_extended_menu(conv); |
| 3498 if (list) { | 3605 if (list) { |
| 3499 action_items = g_list_prepend(NULL, (item = pidgin_separator(menu))); | 3606 action_items = g_list_prepend(NULL, (item = pidgin_separator(menu))); |
| 3500 g_signal_connect(G_OBJECT(item), "destroy", G_CALLBACK(remove_from_list), win); | 3607 g_signal_connect(G_OBJECT(item), "destroy", G_CALLBACK(remove_from_list), win); |
| 3527 static void | 3634 static void |
| 3528 focus_out_from_menubar(GtkWidget *wid, PidginWindow *win) | 3635 focus_out_from_menubar(GtkWidget *wid, PidginWindow *win) |
| 3529 { | 3636 { |
| 3530 /* The menubar has been deactivated. Make sure the 'More' submenu is regenerated next time | 3637 /* The menubar has been deactivated. Make sure the 'More' submenu is regenerated next time |
| 3531 * the 'Conversation' menu pops up. */ | 3638 * the 'Conversation' menu pops up. */ |
| 3532 GtkWidget *menuitem = gtk_item_factory_get_item(win->menu.item_factory, N_("/Conversation")); | 3639 GtkWidget *menuitem = gtk_ui_manager_get_widget(win->menu.ui, "/Conversation/ConversationMenu"); |
| 3533 g_signal_handlers_unblock_by_func(G_OBJECT(menuitem), G_CALLBACK(menubar_activated), win); | 3640 g_signal_handlers_unblock_by_func(G_OBJECT(menuitem), G_CALLBACK(menubar_activated), win); |
| 3534 g_signal_handlers_disconnect_by_func(G_OBJECT(win->menu.menubar), | 3641 g_signal_handlers_disconnect_by_func(G_OBJECT(win->menu.menubar), |
| 3535 G_CALLBACK(focus_out_from_menubar), win); | 3642 G_CALLBACK(focus_out_from_menubar), win); |
| 3536 } | 3643 } |
| 3537 | 3644 |
| 3538 static GtkWidget * | 3645 static GtkWidget * |
| 3539 setup_menubar(PidginWindow *win) | 3646 setup_menubar(PidginWindow *win) |
| 3540 { | 3647 { |
| 3541 GtkAccelGroup *accel_group; | 3648 GtkAccelGroup *accel_group; |
| 3542 const char *method; | 3649 const char *method; |
| 3650 GtkActionGroup *action_group; | |
| 3651 GError *error; | |
| 3543 GtkWidget *menuitem; | 3652 GtkWidget *menuitem; |
| 3544 | 3653 |
| 3545 accel_group = gtk_accel_group_new (); | 3654 action_group = gtk_action_group_new("ConversationActions"); |
| 3655 gtk_action_group_add_actions(action_group, | |
| 3656 menu_entries, | |
| 3657 G_N_ELEMENTS(menu_entries), | |
| 3658 win); | |
| 3659 gtk_action_group_add_toggle_actions(action_group, | |
| 3660 menu_toggle_entries, | |
| 3661 G_N_ELEMENTS(menu_toggle_entries), | |
| 3662 win); | |
| 3663 #ifdef ENABLE_NLS | |
| 3664 gtk_action_group_set_translation_domain(action_group, | |
| 3665 PACKAGE); | |
| 3666 #endif | |
| 3667 | |
| 3668 win->menu.ui = gtk_ui_manager_new(); | |
| 3669 gtk_ui_manager_insert_action_group(win->menu.ui, action_group, 0); | |
| 3670 | |
| 3671 accel_group = gtk_ui_manager_get_accel_group(win->menu.ui); | |
| 3546 gtk_window_add_accel_group(GTK_WINDOW(win->window), accel_group); | 3672 gtk_window_add_accel_group(GTK_WINDOW(win->window), accel_group); |
| 3547 g_object_unref(accel_group); | |
| 3548 | |
| 3549 win->menu.item_factory = | |
| 3550 gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", accel_group); | |
| 3551 | |
| 3552 gtk_item_factory_set_translate_func(win->menu.item_factory, | |
| 3553 (GtkTranslateFunc)item_factory_translate_func, | |
| 3554 NULL, NULL); | |
| 3555 | |
| 3556 gtk_item_factory_create_items(win->menu.item_factory, menu_item_count, | |
| 3557 menu_items, win); | |
| 3558 g_signal_connect(G_OBJECT(accel_group), "accel-changed", | 3673 g_signal_connect(G_OBJECT(accel_group), "accel-changed", |
| 3559 G_CALLBACK(pidgin_save_accels_cb), NULL); | 3674 G_CALLBACK(pidgin_save_accels_cb), NULL); |
| 3560 | 3675 |
| 3561 /* Make sure the 'Conversation -> More' menuitems are regenerated whenever | 3676 error = NULL; |
| 3562 * the 'Conversation' menu pops up because the entries can change after the | 3677 if (!gtk_ui_manager_add_ui_from_string(win->menu.ui, conversation_menu, -1, &error)) |
| 3563 * conversation is created. */ | 3678 { |
| 3564 menuitem = gtk_item_factory_get_item(win->menu.item_factory, N_("/Conversation")); | 3679 g_message("building menus failed: %s", error->message); |
| 3680 g_error_free(error); | |
| 3681 exit(EXIT_FAILURE); | |
| 3682 } | |
| 3683 | |
| 3684 win->menu.menubar = | |
| 3685 gtk_ui_manager_get_widget(win->menu.ui, "/Conversation"); | |
| 3686 | |
| 3687 menuitem = gtk_ui_manager_get_widget(win->menu.ui, "/Conversation/ConversationMenu"); | |
| 3565 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(menubar_activated), win); | 3688 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(menubar_activated), win); |
| 3566 | 3689 |
| 3567 win->menu.menubar = | |
| 3568 gtk_item_factory_get_widget(win->menu.item_factory, "<main>"); | |
| 3569 | |
| 3570 win->menu.view_log = | 3690 win->menu.view_log = |
| 3571 gtk_item_factory_get_widget(win->menu.item_factory, | 3691 gtk_ui_manager_get_action(win->menu.ui, |
| 3572 N_("/Conversation/View Log")); | 3692 "/Conversation/ConversationMenu/ViewLog"); |
| 3573 | 3693 |
| 3574 #ifdef USE_VV | 3694 #ifdef USE_VV |
| 3575 win->audio_call = | 3695 win->audio_call = |
| 3576 gtk_item_factory_get_widget(win->menu.item_factory, | 3696 gtk_ui_manager_get_action(win->menu.ui, |
| 3577 N_("/Conversation/Media/Audio Call")); | 3697 "/Conversation/ConversationMenu/MediaMenu/AudioCall"); |
| 3578 win->video_call = | 3698 win->video_call = |
| 3579 gtk_item_factory_get_widget(win->menu.item_factory, | 3699 gtk_ui_manager_get_action(win->menu.ui, |
| 3580 N_("/Conversation/Media/Video Call")); | 3700 "/Conversation/ConversationMenu/MediaMenu/VideoCall"); |
| 3581 win->audio_video_call = | 3701 win->audio_video_call = |
| 3582 gtk_item_factory_get_widget(win->menu.item_factory, | 3702 gtk_ui_manager_get_action(win->menu.ui, |
| 3583 N_("/Conversation/Media/Audio\\/Video Call")); | 3703 "/Conversation/ConversationMenu/MediaMenu/AudioVideoCall"); |
| 3584 #endif | 3704 #endif |
| 3585 | 3705 |
| 3586 /* --- */ | 3706 /* --- */ |
| 3587 | 3707 |
| 3588 win->menu.send_file = | 3708 win->menu.send_file = |
| 3589 gtk_item_factory_get_widget(win->menu.item_factory, | 3709 gtk_ui_manager_get_action(win->menu.ui, |
| 3590 N_("/Conversation/Send File...")); | 3710 "/Conversation/ConversationMenu/SendFile"); |
| 3591 | 3711 |
| 3592 win->menu.get_attention = | 3712 win->menu.get_attention = |
| 3593 gtk_item_factory_get_widget(win->menu.item_factory, | 3713 gtk_ui_manager_get_action(win->menu.ui, |
| 3594 N_("/Conversation/Get Attention")); | 3714 "/Conversation/ConversationMenu/GetAttention"); |
| 3595 | 3715 |
| 3596 win->menu.add_pounce = | 3716 win->menu.add_pounce = |
| 3597 gtk_item_factory_get_widget(win->menu.item_factory, | 3717 gtk_ui_manager_get_action(win->menu.ui, |
| 3598 N_("/Conversation/Add Buddy Pounce...")); | 3718 "/Conversation/ConversationMenu/AddBuddyPounce"); |
| 3599 | 3719 |
| 3600 /* --- */ | 3720 /* --- */ |
| 3601 | 3721 |
| 3602 win->menu.get_info = | 3722 win->menu.get_info = |
| 3603 gtk_item_factory_get_widget(win->menu.item_factory, | 3723 gtk_ui_manager_get_action(win->menu.ui, |
| 3604 N_("/Conversation/Get Info")); | 3724 "/Conversation/ConversationMenu/GetInfo"); |
| 3605 | 3725 |
| 3606 win->menu.invite = | 3726 win->menu.invite = |
| 3607 gtk_item_factory_get_widget(win->menu.item_factory, | 3727 gtk_ui_manager_get_action(win->menu.ui, |
| 3608 N_("/Conversation/Invite...")); | 3728 "/Conversation/ConversationMenu/Invite"); |
| 3609 | 3729 |
| 3610 /* --- */ | 3730 /* --- */ |
| 3611 | 3731 |
| 3612 win->menu.alias = | 3732 win->menu.alias = |
| 3613 gtk_item_factory_get_widget(win->menu.item_factory, | 3733 gtk_ui_manager_get_action(win->menu.ui, |
| 3614 N_("/Conversation/Alias...")); | 3734 "/Conversation/ConversationMenu/Alias"); |
| 3615 | 3735 |
| 3616 win->menu.block = | 3736 win->menu.block = |
| 3617 gtk_item_factory_get_widget(win->menu.item_factory, | 3737 gtk_ui_manager_get_action(win->menu.ui, |
| 3618 N_("/Conversation/Block...")); | 3738 "/Conversation/ConversationMenu/Block"); |
| 3619 | 3739 |
| 3620 win->menu.unblock = | 3740 win->menu.unblock = |
| 3621 gtk_item_factory_get_widget(win->menu.item_factory, | 3741 gtk_ui_manager_get_action(win->menu.ui, |
| 3622 N_("/Conversation/Unblock...")); | 3742 "/Conversation/ConversationMenu/Unblock"); |
| 3623 | 3743 |
| 3624 win->menu.add = | 3744 win->menu.add = |
| 3625 gtk_item_factory_get_widget(win->menu.item_factory, | 3745 gtk_ui_manager_get_action(win->menu.ui, |
| 3626 N_("/Conversation/Add...")); | 3746 "/Conversation/ConversationMenu/Add"); |
| 3627 | 3747 |
| 3628 win->menu.remove = | 3748 win->menu.remove = |
| 3629 gtk_item_factory_get_widget(win->menu.item_factory, | 3749 gtk_ui_manager_get_action(win->menu.ui, |
| 3630 N_("/Conversation/Remove...")); | 3750 "/Conversation/ConversationMenu/Remove"); |
| 3631 | 3751 |
| 3632 /* --- */ | 3752 /* --- */ |
| 3633 | 3753 |
| 3634 win->menu.insert_link = | 3754 win->menu.insert_link = |
| 3635 gtk_item_factory_get_widget(win->menu.item_factory, | 3755 gtk_ui_manager_get_action(win->menu.ui, |
| 3636 N_("/Conversation/Insert Link...")); | 3756 "/Conversation/ConversationMenu/InsertLink"); |
| 3637 | 3757 |
| 3638 win->menu.insert_image = | 3758 win->menu.insert_image = |
| 3639 gtk_item_factory_get_widget(win->menu.item_factory, | 3759 gtk_ui_manager_get_action(win->menu.ui, |
| 3640 N_("/Conversation/Insert Image...")); | 3760 "/Conversation/ConversationMenu/InsertImage"); |
| 3641 | 3761 |
| 3642 /* --- */ | 3762 /* --- */ |
| 3643 | 3763 |
| 3644 win->menu.logging = | 3764 win->menu.logging = |
| 3645 gtk_item_factory_get_widget(win->menu.item_factory, | 3765 gtk_ui_manager_get_action(win->menu.ui, |
| 3646 N_("/Options/Enable Logging")); | 3766 "/Conversation/OptionsMenu/EnableLogging"); |
| 3647 win->menu.sounds = | 3767 win->menu.sounds = |
| 3648 gtk_item_factory_get_widget(win->menu.item_factory, | 3768 gtk_ui_manager_get_action(win->menu.ui, |
| 3649 N_("/Options/Enable Sounds")); | 3769 "/Conversation/OptionsMenu/EnableSounds"); |
| 3650 method = purple_prefs_get_string(PIDGIN_PREFS_ROOT "/sound/method"); | 3770 method = purple_prefs_get_string(PIDGIN_PREFS_ROOT "/sound/method"); |
| 3651 if (method != NULL && !strcmp(method, "none")) | 3771 if (method != NULL && !strcmp(method, "none")) |
| 3652 { | 3772 { |
| 3653 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.sounds), | 3773 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(win->menu.sounds), |
| 3654 FALSE); | 3774 FALSE); |
| 3655 gtk_widget_set_sensitive(win->menu.sounds, FALSE); | 3775 gtk_action_set_sensitive(win->menu.sounds, FALSE); |
| 3656 } | 3776 } |
| 3657 purple_prefs_connect_callback(win, PIDGIN_PREFS_ROOT "/sound/method", | 3777 purple_prefs_connect_callback(win, PIDGIN_PREFS_ROOT "/sound/method", |
| 3658 sound_method_pref_changed_cb, win); | 3778 sound_method_pref_changed_cb, win); |
| 3659 | 3779 |
| 3660 win->menu.show_formatting_toolbar = | 3780 win->menu.show_formatting_toolbar = |
| 3661 gtk_item_factory_get_widget(win->menu.item_factory, | 3781 gtk_ui_manager_get_action(win->menu.ui, |
| 3662 N_("/Options/Show Formatting Toolbars")); | 3782 "/Conversation/OptionsMenu/ShowFormattingToolbars"); |
| 3663 win->menu.show_timestamps = | 3783 win->menu.show_timestamps = |
| 3664 gtk_item_factory_get_widget(win->menu.item_factory, | 3784 gtk_ui_manager_get_action(win->menu.ui, |
| 3665 N_("/Options/Show Timestamps")); | 3785 "/Conversation/OptionsMenu/ShowTimestamps"); |
| 3666 win->menu.show_icon = NULL; | 3786 win->menu.show_icon = NULL; |
| 3667 | 3787 |
| 3668 win->menu.tray = pidgin_menu_tray_new(); | 3788 win->menu.tray = pidgin_menu_tray_new(); |
| 3669 gtk_menu_shell_append(GTK_MENU_SHELL(win->menu.menubar), | 3789 gtk_menu_shell_append(GTK_MENU_SHELL(win->menu.menubar), |
| 3670 win->menu.tray); | 3790 win->menu.tray); |
| 3735 case 4: | 3855 case 4: |
| 3736 stock_id = PIDGIN_STOCK_ANIMATION_TYPING4; | 3856 stock_id = PIDGIN_STOCK_ANIMATION_TYPING4; |
| 3737 break; | 3857 break; |
| 3738 } | 3858 } |
| 3739 if (gtkwin->menu.typing_icon == NULL) { | 3859 if (gtkwin->menu.typing_icon == NULL) { |
| 3740 gtkwin->menu.typing_icon = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU); | 3860 gtkwin->menu.typing_icon = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU); |
| 3741 pidgin_menu_tray_append(PIDGIN_MENU_TRAY(gtkwin->menu.tray), | 3861 pidgin_menu_tray_append(PIDGIN_MENU_TRAY(gtkwin->menu.tray), |
| 3742 gtkwin->menu.typing_icon, | 3862 gtkwin->menu.typing_icon, |
| 3743 _("User is typing...")); | 3863 _("User is typing...")); |
| 3744 } else { | 3864 } else { |
| 3745 gtk_image_set_from_stock(GTK_IMAGE(gtkwin->menu.typing_icon), stock_id, GTK_ICON_SIZE_MENU); | 3865 gtk_image_set_from_stock(GTK_IMAGE(gtkwin->menu.typing_icon), stock_id, GTK_ICON_SIZE_MENU); |
| 3746 } | 3866 } |
| 3747 gtk_widget_show(gtkwin->menu.typing_icon); | 3867 gtk_widget_show(gtkwin->menu.typing_icon); |
| 3748 return TRUE; | 3868 return TRUE; |
| 3844 return FALSE; | 3964 return FALSE; |
| 3845 | 3965 |
| 3846 if (!(b = purple_find_buddy(account, purple_conversation_get_name(conv)))) | 3966 if (!(b = purple_find_buddy(account, purple_conversation_get_name(conv)))) |
| 3847 return FALSE; | 3967 return FALSE; |
| 3848 | 3968 |
| 3849 | 3969 #if 0 /* TODO */ |
| 3850 gtk_widget_show(win->menu.send_to); | 3970 gtk_widget_show(win->menu.send_to); |
| 3851 | 3971 |
| 3852 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(win->menu.send_to)); | 3972 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(win->menu.send_to)); |
| 3853 | 3973 |
| 3854 for (child = gtk_container_get_children(GTK_CONTAINER(menu)); | 3974 for (child = gtk_container_get_children(GTK_CONTAINER(menu)); |
| 3866 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE); | 3986 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE); |
| 3867 g_list_free(child); | 3987 g_list_free(child); |
| 3868 break; | 3988 break; |
| 3869 } | 3989 } |
| 3870 } | 3990 } |
| 3991 #endif | |
| 3871 | 3992 |
| 3872 return FALSE; | 3993 return FALSE; |
| 3873 } | 3994 } |
| 3874 | 3995 |
| 3875 static gboolean | 3996 static gboolean |
| 3975 } | 4096 } |
| 3976 | 4097 |
| 3977 static void | 4098 static void |
| 3978 generate_send_to_items(PidginWindow *win) | 4099 generate_send_to_items(PidginWindow *win) |
| 3979 { | 4100 { |
| 4101 #if 0 /* TODO */ | |
| 3980 GtkWidget *menu; | 4102 GtkWidget *menu; |
| 3981 GSList *group = NULL; | 4103 GSList *group = NULL; |
| 3982 GtkSizeGroup *sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); | 4104 GtkSizeGroup *sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
| 3983 PidginConversation *gtkconv; | 4105 PidginConversation *gtkconv; |
| 3984 GSList *l, *buds; | 4106 GSList *l, *buds; |
| 4060 gtk_widget_show(win->menu.send_to); | 4182 gtk_widget_show(win->menu.send_to); |
| 4061 /* TODO: This should never be insensitive. Possibly hidden or not. */ | 4183 /* TODO: This should never be insensitive. Possibly hidden or not. */ |
| 4062 if (!group) | 4184 if (!group) |
| 4063 gtk_widget_set_sensitive(win->menu.send_to, FALSE); | 4185 gtk_widget_set_sensitive(win->menu.send_to, FALSE); |
| 4064 update_send_to_selection(win); | 4186 update_send_to_selection(win); |
| 4187 #endif | |
| 4065 } | 4188 } |
| 4066 | 4189 |
| 4067 static const char * | 4190 static const char * |
| 4068 get_chat_buddy_status_icon(PurpleConvChat *chat, const char *name, PurpleConvChatBuddyFlags flags) | 4191 get_chat_buddy_status_icon(PurpleConvChat *chat, const char *name, PurpleConvChatBuddyFlags flags) |
| 4069 { | 4192 { |
| 4712 GtkTextIter iter; | 4835 GtkTextIter iter; |
| 4713 int lines; | 4836 int lines; |
| 4714 GdkRectangle oneline; | 4837 GdkRectangle oneline; |
| 4715 int height, diff; | 4838 int height, diff; |
| 4716 int pad_top, pad_inside, pad_bottom; | 4839 int pad_top, pad_inside, pad_bottom; |
| 4717 int total_height = (gtkconv->webview->allocation.height + gtkconv->entry->allocation.height); | 4840 int total_height; |
| 4718 int max_height = total_height / 2; | 4841 int max_height; |
| 4719 int min_lines = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/minimum_entry_lines"); | 4842 int min_lines = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/minimum_entry_lines"); |
| 4720 int min_height; | 4843 int min_height; |
| 4721 gboolean interior_focus; | 4844 gboolean interior_focus; |
| 4722 int focus_width; | 4845 int focus_width; |
| 4846 GtkAllocation webview_allocation; | |
| 4847 GtkAllocation entry_allocation; | |
| 4848 GtkAllocation lower_hbox_allocation; | |
| 4849 | |
| 4850 gtk_widget_get_allocation(gtkconv->webview, &webview_allocation); | |
| 4851 gtk_widget_get_allocation(gtkconv->entry, &entry_allocation); | |
| 4852 gtk_widget_get_allocation(gtkconv->lower_hbox, &lower_hbox_allocation); | |
| 4853 total_height = webview_allocation.height + entry_allocation.height; | |
| 4854 max_height = total_height / 2; | |
| 4723 | 4855 |
| 4724 pad_top = gtk_text_view_get_pixels_above_lines(GTK_TEXT_VIEW(gtkconv->entry)); | 4856 pad_top = gtk_text_view_get_pixels_above_lines(GTK_TEXT_VIEW(gtkconv->entry)); |
| 4725 pad_bottom = gtk_text_view_get_pixels_below_lines(GTK_TEXT_VIEW(gtkconv->entry)); | 4857 pad_bottom = gtk_text_view_get_pixels_below_lines(GTK_TEXT_VIEW(gtkconv->entry)); |
| 4726 pad_inside = gtk_text_view_get_pixels_inside_wrap(GTK_TEXT_VIEW(gtkconv->entry)); | 4858 pad_inside = gtk_text_view_get_pixels_inside_wrap(GTK_TEXT_VIEW(gtkconv->entry)); |
| 4727 | 4859 |
| 4751 "focus-line-width", &focus_width, | 4883 "focus-line-width", &focus_width, |
| 4752 NULL); | 4884 NULL); |
| 4753 if (!interior_focus) | 4885 if (!interior_focus) |
| 4754 height += 2 * focus_width; | 4886 height += 2 * focus_width; |
| 4755 | 4887 |
| 4756 diff = height - gtkconv->entry->allocation.height; | 4888 diff = height - entry_allocation.height; |
| 4757 if (ABS(diff) < oneline.height / 2) | 4889 if (ABS(diff) < oneline.height / 2) |
| 4758 return FALSE; | 4890 return FALSE; |
| 4759 | 4891 |
| 4892 purple_debug_info("pidgin", "resizing to %d, %d lines, diff %d\n", | |
| 4893 diff + lower_hbox_allocation.height, min_lines, diff); | |
| 4894 | |
| 4760 gtk_widget_set_size_request(gtkconv->lower_hbox, -1, | 4895 gtk_widget_set_size_request(gtkconv->lower_hbox, -1, |
| 4761 diff + gtkconv->lower_hbox->allocation.height); | 4896 diff + lower_hbox_allocation.height); |
| 4762 | 4897 |
| 4763 return FALSE; | 4898 return FALSE; |
| 4764 } | 4899 } |
| 4765 | 4900 |
| 4766 static void | 4901 static void |
| 4803 gtk_widget_set_size_request(gtkchat->topic_text, -1, BUDDYICON_SIZE_MIN); | 4938 gtk_widget_set_size_request(gtkchat->topic_text, -1, BUDDYICON_SIZE_MIN); |
| 4804 | 4939 |
| 4805 if(prpl_info->set_chat_topic == NULL) { | 4940 if(prpl_info->set_chat_topic == NULL) { |
| 4806 gtk_editable_set_editable(GTK_EDITABLE(gtkchat->topic_text), FALSE); | 4941 gtk_editable_set_editable(GTK_EDITABLE(gtkchat->topic_text), FALSE); |
| 4807 } else { | 4942 } else { |
| 4808 g_signal_connect(GTK_OBJECT(gtkchat->topic_text), "activate", | 4943 g_signal_connect(GTK_WIDGET(gtkchat->topic_text), "activate", |
| 4809 G_CALLBACK(topic_callback), gtkconv); | 4944 G_CALLBACK(topic_callback), gtkconv); |
| 4810 } | 4945 } |
| 4811 | 4946 |
| 4812 gtk_box_pack_start(GTK_BOX(hbox), gtkchat->topic_text, TRUE, TRUE, 0); | 4947 gtk_box_pack_start(GTK_BOX(hbox), gtkchat->topic_text, TRUE, TRUE, 0); |
| 4813 g_signal_connect(G_OBJECT(gtkchat->topic_text), "key_press_event", | 4948 g_signal_connect(G_OBJECT(gtkchat->topic_text), "key_press_event", |
| 4974 pidgin_conv_end_quickfind(PidginConversation *gtkconv) | 5109 pidgin_conv_end_quickfind(PidginConversation *gtkconv) |
| 4975 { | 5110 { |
| 4976 gtk_widget_modify_base(gtkconv->quickfind.entry, GTK_STATE_NORMAL, NULL); | 5111 gtk_widget_modify_base(gtkconv->quickfind.entry, GTK_STATE_NORMAL, NULL); |
| 4977 | 5112 |
| 4978 webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(gtkconv->webview)); | 5113 webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(gtkconv->webview)); |
| 4979 gtk_widget_hide_all(gtkconv->quickfind.container); | 5114 gtk_widget_hide(gtkconv->quickfind.container); |
| 4980 | 5115 |
| 4981 gtk_widget_grab_focus(gtkconv->entry); | 5116 gtk_widget_grab_focus(gtkconv->entry); |
| 4982 return TRUE; | 5117 return TRUE; |
| 4983 } | 5118 } |
| 4984 | 5119 |
| 4985 static gboolean | 5120 static gboolean |
| 4986 quickfind_process_input(GtkWidget *entry, GdkEventKey *event, PidginConversation *gtkconv) | 5121 quickfind_process_input(GtkWidget *entry, GdkEventKey *event, PidginConversation *gtkconv) |
| 4987 { | 5122 { |
| 4988 switch (event->keyval) { | 5123 switch (event->keyval) { |
| 4989 case GDK_Return: | 5124 case GDK_KEY_Return: |
| 4990 case GDK_KP_Enter: | 5125 case GDK_KEY_KP_Enter: |
| 4991 if (webkit_web_view_search_text(WEBKIT_WEB_VIEW(gtkconv->webview), gtk_entry_get_text(GTK_ENTRY(entry)), FALSE, TRUE, TRUE)) { | 5126 if (webkit_web_view_search_text(WEBKIT_WEB_VIEW(gtkconv->webview), gtk_entry_get_text(GTK_ENTRY(entry)), FALSE, TRUE, TRUE)) { |
| 4992 gtk_widget_modify_base(gtkconv->quickfind.entry, GTK_STATE_NORMAL, NULL); | 5127 gtk_widget_modify_base(gtkconv->quickfind.entry, GTK_STATE_NORMAL, NULL); |
| 4993 } else { | 5128 } else { |
| 4994 GdkColor col; | 5129 GdkColor col; |
| 4995 col.red = 0xffff; | 5130 col.red = 0xffff; |
| 4996 col.green = 0xafff; | 5131 col.green = 0xafff; |
| 4997 col.blue = 0xafff; | 5132 col.blue = 0xafff; |
| 4998 gtk_widget_modify_base(gtkconv->quickfind.entry, GTK_STATE_NORMAL, &col); | 5133 gtk_widget_modify_base(gtkconv->quickfind.entry, GTK_STATE_NORMAL, &col); |
| 4999 } | 5134 } |
| 5000 break; | 5135 break; |
| 5001 case GDK_Escape: | 5136 case GDK_KEY_Escape: |
| 5002 pidgin_conv_end_quickfind(gtkconv); | 5137 pidgin_conv_end_quickfind(gtkconv); |
| 5003 break; | 5138 break; |
| 5004 default: | 5139 default: |
| 5005 return FALSE; | 5140 return FALSE; |
| 5006 } | 5141 } |
| 5015 | 5150 |
| 5016 gtk_box_pack_start(GTK_BOX(container), widget, FALSE, FALSE, 0); | 5151 gtk_box_pack_start(GTK_BOX(container), widget, FALSE, FALSE, 0); |
| 5017 | 5152 |
| 5018 close = pidgin_create_small_button(gtk_label_new("×")); | 5153 close = pidgin_create_small_button(gtk_label_new("×")); |
| 5019 gtk_box_pack_start(GTK_BOX(widget), close, FALSE, FALSE, 0); | 5154 gtk_box_pack_start(GTK_BOX(widget), close, FALSE, FALSE, 0); |
| 5155 #if GTK_CHECK_VERSION(2,12,0) | |
| 5156 gtk_widget_set_tooltip_text(close, _("Close Find bar")); | |
| 5157 #else | |
| 5020 gtk_tooltips_set_tip(gtkconv->tooltips, close, | 5158 gtk_tooltips_set_tip(gtkconv->tooltips, close, |
| 5021 _("Close Find bar"), NULL); | 5159 _("Close Find bar"), NULL); |
| 5160 #endif | |
| 5022 | 5161 |
| 5023 label = gtk_label_new(_("Find:")); | 5162 label = gtk_label_new(_("Find:")); |
| 5024 gtk_box_pack_start(GTK_BOX(widget), label, FALSE, FALSE, 10); | 5163 gtk_box_pack_start(GTK_BOX(widget), label, FALSE, FALSE, 10); |
| 5025 | 5164 |
| 5026 entry = gtk_entry_new(); | 5165 entry = gtk_entry_new(); |
| 5449 PidginWindow *win = gtkconv->win; | 5588 PidginWindow *win = gtkconv->win; |
| 5450 PurpleConversation *c; | 5589 PurpleConversation *c; |
| 5451 PurpleAccount *convaccount = purple_conversation_get_account(conv); | 5590 PurpleAccount *convaccount = purple_conversation_get_account(conv); |
| 5452 PurpleConnection *gc = purple_account_get_connection(convaccount); | 5591 PurpleConnection *gc = purple_account_get_connection(convaccount); |
| 5453 PurplePluginProtocolInfo *prpl_info = gc ? PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)) : NULL; | 5592 PurplePluginProtocolInfo *prpl_info = gc ? PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)) : NULL; |
| 5454 | 5593 GdkAtom target = gtk_selection_data_get_target(sd); |
| 5455 if (sd->target == gdk_atom_intern("PURPLE_BLIST_NODE", FALSE)) | 5594 const guchar *data = gtk_selection_data_get_data(sd); |
| 5595 | |
| 5596 if (target == gdk_atom_intern("PURPLE_BLIST_NODE", FALSE)) | |
| 5456 { | 5597 { |
| 5457 PurpleBlistNode *n = NULL; | 5598 PurpleBlistNode *n = NULL; |
| 5458 PurpleBuddy *b; | 5599 PurpleBuddy *b; |
| 5459 PidginConversation *gtkconv = NULL; | 5600 PidginConversation *gtkconv = NULL; |
| 5460 PurpleAccount *buddyaccount; | 5601 PurpleAccount *buddyaccount; |
| 5461 const char *buddyname; | 5602 const char *buddyname; |
| 5462 | 5603 |
| 5463 n = *(PurpleBlistNode **)sd->data; | 5604 n = *(PurpleBlistNode **) data; |
| 5464 | 5605 |
| 5465 if (PURPLE_BLIST_NODE_IS_CONTACT(n)) | 5606 if (PURPLE_BLIST_NODE_IS_CONTACT(n)) |
| 5466 b = purple_contact_get_priority_buddy((PurpleContact*)n); | 5607 b = purple_contact_get_priority_buddy((PurpleContact*)n); |
| 5467 else if (PURPLE_BLIST_NODE_IS_BUDDY(n)) | 5608 else if (PURPLE_BLIST_NODE_IS_BUDDY(n)) |
| 5468 b = (PurpleBuddy*)n; | 5609 b = (PurpleBuddy*)n; |
| 5506 | 5647 |
| 5507 /* Make this conversation the active conversation */ | 5648 /* Make this conversation the active conversation */ |
| 5508 pidgin_conv_window_switch_gtkconv(win, gtkconv); | 5649 pidgin_conv_window_switch_gtkconv(win, gtkconv); |
| 5509 } | 5650 } |
| 5510 | 5651 |
| 5511 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); | 5652 gtk_drag_finish(dc, TRUE, |
| 5512 } | 5653 gdk_drag_context_get_actions(dc) == GDK_ACTION_MOVE, t); |
| 5513 else if (sd->target == gdk_atom_intern("application/x-im-contact", FALSE)) | 5654 } |
| 5655 else if (target == gdk_atom_intern("application/x-im-contact", FALSE)) | |
| 5514 { | 5656 { |
| 5515 char *protocol = NULL; | 5657 char *protocol = NULL; |
| 5516 char *username = NULL; | 5658 char *username = NULL; |
| 5517 PurpleAccount *account; | 5659 PurpleAccount *account; |
| 5518 PidginConversation *gtkconv; | 5660 PidginConversation *gtkconv; |
| 5519 | 5661 |
| 5520 if (pidgin_parse_x_im_contact((const char *)sd->data, FALSE, &account, | 5662 if (pidgin_parse_x_im_contact((const char *) data, FALSE, &account, |
| 5521 &protocol, &username, NULL)) | 5663 &protocol, &username, NULL)) |
| 5522 { | 5664 { |
| 5523 if (account == NULL) | 5665 if (account == NULL) |
| 5524 { | 5666 { |
| 5525 purple_notify_error(win, NULL, | 5667 purple_notify_error(win, NULL, |
| 5546 } | 5688 } |
| 5547 | 5689 |
| 5548 g_free(username); | 5690 g_free(username); |
| 5549 g_free(protocol); | 5691 g_free(protocol); |
| 5550 | 5692 |
| 5551 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); | 5693 gtk_drag_finish(dc, TRUE, |
| 5552 } | 5694 gdk_drag_context_get_actions(dc) == GDK_ACTION_MOVE, t); |
| 5553 else if (sd->target == gdk_atom_intern("text/uri-list", FALSE)) { | 5695 } |
| 5696 else if (target == gdk_atom_intern("text/uri-list", FALSE)) { | |
| 5554 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) | 5697 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) |
| 5555 pidgin_dnd_file_manage(sd, convaccount, purple_conversation_get_name(conv)); | 5698 pidgin_dnd_file_manage(sd, convaccount, purple_conversation_get_name(conv)); |
| 5556 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); | 5699 gtk_drag_finish(dc, TRUE, |
| 5700 gdk_drag_context_get_actions(dc) == GDK_ACTION_MOVE, t); | |
| 5557 } | 5701 } |
| 5558 else | 5702 else |
| 5559 gtk_drag_finish(dc, FALSE, FALSE, t); | 5703 gtk_drag_finish(dc, FALSE, FALSE, t); |
| 5560 } | 5704 } |
| 5561 | 5705 |
| 5689 gtkconv->active_conv = conv; | 5833 gtkconv->active_conv = conv; |
| 5690 gtkconv->convs = g_list_prepend(gtkconv->convs, conv); | 5834 gtkconv->convs = g_list_prepend(gtkconv->convs, conv); |
| 5691 gtkconv->send_history = g_list_append(NULL, NULL); | 5835 gtkconv->send_history = g_list_append(NULL, NULL); |
| 5692 | 5836 |
| 5693 /* Setup some initial variables. */ | 5837 /* Setup some initial variables. */ |
| 5838 #if !GTK_CHECK_VERSION(2,12,0) | |
| 5694 gtkconv->tooltips = gtk_tooltips_new(); | 5839 gtkconv->tooltips = gtk_tooltips_new(); |
| 5840 #endif | |
| 5695 gtkconv->unseen_state = PIDGIN_UNSEEN_NONE; | 5841 gtkconv->unseen_state = PIDGIN_UNSEEN_NONE; |
| 5696 gtkconv->unseen_count = 0; | 5842 gtkconv->unseen_count = 0; |
| 5697 theme = purple_theme_manager_find_theme(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/theme"), "conversation"); | 5843 theme = purple_theme_manager_find_theme(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/theme"), "conversation"); |
| 5698 if (!theme) | 5844 if (!theme) |
| 5699 theme = purple_theme_manager_find_theme("Default", "conversation"); | 5845 theme = purple_theme_manager_find_theme("Default", "conversation"); |
| 5888 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { | 6034 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { |
| 5889 purple_signals_disconnect_by_handle(gtkconv->u.chat); | 6035 purple_signals_disconnect_by_handle(gtkconv->u.chat); |
| 5890 g_free(gtkconv->u.chat); | 6036 g_free(gtkconv->u.chat); |
| 5891 } | 6037 } |
| 5892 | 6038 |
| 6039 #if !GTK_CHECK_VERSION(2,12,0) | |
| 5893 gtk_object_sink(GTK_OBJECT(gtkconv->tooltips)); | 6040 gtk_object_sink(GTK_OBJECT(gtkconv->tooltips)); |
| 6041 #endif | |
| 5894 | 6042 |
| 5895 gtkconv->send_history = g_list_first(gtkconv->send_history); | 6043 gtkconv->send_history = g_list_first(gtkconv->send_history); |
| 5896 g_list_foreach(gtkconv->send_history, (GFunc)g_free, NULL); | 6044 g_list_foreach(gtkconv->send_history, (GFunc)g_free, NULL); |
| 5897 g_list_free(gtkconv->send_history); | 6045 g_list_free(gtkconv->send_history); |
| 5898 | 6046 |
| 5957 if (event->type == GDK_BUTTON_PRESS | 6105 if (event->type == GDK_BUTTON_PRESS |
| 5958 || event->type == GDK_2BUTTON_PRESS) { | 6106 || event->type == GDK_2BUTTON_PRESS) { |
| 5959 GdkEventButton *btn_event = (GdkEventButton*) event; | 6107 GdkEventButton *btn_event = (GdkEventButton*) event; |
| 5960 PurpleConversation *conv = data; | 6108 PurpleConversation *conv = data; |
| 5961 char *buddyname; | 6109 char *buddyname; |
| 6110 gchar *name; | |
| 6111 | |
| 6112 g_object_get(G_OBJECT(tag), "name", &name, NULL); | |
| 5962 | 6113 |
| 5963 /* strlen("BUDDY " or "HILIT ") == 6 */ | 6114 /* strlen("BUDDY " or "HILIT ") == 6 */ |
| 5964 g_return_val_if_fail((tag->name != NULL) | 6115 g_return_val_if_fail((name != NULL) && (strlen(name) > 6), FALSE); |
| 5965 && (strlen(tag->name) > 6), FALSE); | 6116 |
| 5966 | 6117 buddyname = name + 6; |
| 5967 buddyname = (tag->name) + 6; | |
| 5968 | 6118 |
| 5969 /* emit chat-nick-clicked signal */ | 6119 /* emit chat-nick-clicked signal */ |
| 5970 if (event->type == GDK_BUTTON_PRESS) { | 6120 if (event->type == GDK_BUTTON_PRESS) { |
| 5971 gint plugin_return = GPOINTER_TO_INT(purple_signal_emit_return_1( | 6121 gint plugin_return = GPOINTER_TO_INT(purple_signal_emit_return_1( |
| 5972 pidgin_conversations_get_handle(), "chat-nick-clicked", | 6122 pidgin_conversations_get_handle(), "chat-nick-clicked", |
| 5973 data, buddyname, btn_event->button)); | 6123 data, buddyname, btn_event->button)); |
| 5974 if (plugin_return) | 6124 if (plugin_return) { |
| 6125 g_free(name); | |
| 5975 return TRUE; | 6126 return TRUE; |
| 5976 } | 6127 } |
| 5977 | 6128 } |
| 5978 if (btn_event->button == 1 && | 6129 |
| 5979 event->type == GDK_2BUTTON_PRESS) { | 6130 if (btn_event->button == 1 && event->type == GDK_2BUTTON_PRESS) { |
| 5980 chat_do_im(PIDGIN_CONVERSATION(conv), buddyname); | 6131 chat_do_im(PIDGIN_CONVERSATION(conv), buddyname); |
| 6132 g_free(name); | |
| 6133 | |
| 5981 return TRUE; | 6134 return TRUE; |
| 5982 } else if (btn_event->button == 2 | 6135 } else if (btn_event->button == 2 && event->type == GDK_2BUTTON_PRESS) { |
| 5983 && event->type == GDK_2BUTTON_PRESS) { | |
| 5984 chat_do_info(PIDGIN_CONVERSATION(conv), buddyname); | 6136 chat_do_info(PIDGIN_CONVERSATION(conv), buddyname); |
| 6137 g_free(name); | |
| 5985 | 6138 |
| 5986 return TRUE; | 6139 return TRUE; |
| 5987 } else if (btn_event->button == 3 | 6140 } else if (btn_event->button == 3 && event->type == GDK_BUTTON_PRESS) { |
| 5988 && event->type == GDK_BUTTON_PRESS) { | |
| 5989 GtkTextIter start, end; | 6141 GtkTextIter start, end; |
| 5990 | 6142 |
| 5991 /* we shouldn't display the popup | 6143 /* we shouldn't display the popup |
| 5992 * if the user has selected something: */ | 6144 * if the user has selected something: */ |
| 5993 if (!gtk_text_buffer_get_selection_bounds( | 6145 if (!gtk_text_buffer_get_selection_bounds( |
| 6002 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, | 6154 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, |
| 6003 NULL, GTK_WIDGET(imhtml), | 6155 NULL, GTK_WIDGET(imhtml), |
| 6004 btn_event->button, | 6156 btn_event->button, |
| 6005 btn_event->time); | 6157 btn_event->time); |
| 6006 | 6158 |
| 6159 g_free(name); | |
| 6160 | |
| 6007 /* Don't propagate the event any further */ | 6161 /* Don't propagate the event any further */ |
| 6008 return TRUE; | 6162 return TRUE; |
| 6009 } | 6163 } |
| 6010 } | 6164 } |
| 6165 | |
| 6166 g_free(name); | |
| 6011 } | 6167 } |
| 6012 | 6168 |
| 6013 return FALSE; | 6169 return FALSE; |
| 6014 } | 6170 } |
| 6015 #endif | 6171 #endif |
| 6992 */ | 7148 */ |
| 6993 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { | 7149 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { |
| 6994 /* Show stuff that applies to IMs, hide stuff that applies to chats */ | 7150 /* Show stuff that applies to IMs, hide stuff that applies to chats */ |
| 6995 | 7151 |
| 6996 /* Deal with menu items */ | 7152 /* Deal with menu items */ |
| 6997 gtk_widget_show(win->menu.view_log); | 7153 gtk_action_set_visible(win->menu.view_log, TRUE); |
| 6998 gtk_widget_show(win->menu.send_file); | 7154 gtk_action_set_visible(win->menu.send_file, TRUE); |
| 6999 gtk_widget_show(win->menu.get_attention); | 7155 gtk_action_set_visible(win->menu.get_attention, TRUE); |
| 7000 gtk_widget_show(win->menu.add_pounce); | 7156 gtk_action_set_visible(win->menu.add_pounce, TRUE); |
| 7001 gtk_widget_show(win->menu.get_info); | 7157 gtk_action_set_visible(win->menu.get_info, TRUE); |
| 7002 gtk_widget_hide(win->menu.invite); | 7158 gtk_action_set_visible(win->menu.invite, FALSE); |
| 7003 gtk_widget_show(win->menu.alias); | 7159 gtk_action_set_visible(win->menu.alias, TRUE); |
| 7004 if (purple_privacy_check(account, purple_conversation_get_name(conv))) { | 7160 if (purple_privacy_check(account, purple_conversation_get_name(conv))) { |
| 7005 gtk_widget_hide(win->menu.unblock); | 7161 gtk_action_set_visible(win->menu.unblock, FALSE); |
| 7006 gtk_widget_show(win->menu.block); | 7162 gtk_action_set_visible(win->menu.block, TRUE); |
| 7007 } else { | 7163 } else { |
| 7008 gtk_widget_hide(win->menu.block); | 7164 gtk_action_set_visible(win->menu.block, FALSE); |
| 7009 gtk_widget_show(win->menu.unblock); | 7165 gtk_action_set_visible(win->menu.unblock, TRUE); |
| 7010 } | 7166 } |
| 7011 | 7167 |
| 7012 if ((account == NULL) || purple_find_buddy(account, purple_conversation_get_name(conv)) == NULL) { | 7168 if ((account == NULL) || purple_find_buddy(account, purple_conversation_get_name(conv)) == NULL) { |
| 7013 gtk_widget_show(win->menu.add); | 7169 gtk_action_set_visible(win->menu.add, TRUE); |
| 7014 gtk_widget_hide(win->menu.remove); | 7170 gtk_action_set_visible(win->menu.remove, FALSE); |
| 7015 } else { | 7171 } else { |
| 7016 gtk_widget_show(win->menu.remove); | 7172 gtk_action_set_visible(win->menu.remove, TRUE); |
| 7017 gtk_widget_hide(win->menu.add); | 7173 gtk_action_set_visible(win->menu.add, FALSE); |
| 7018 } | 7174 } |
| 7019 | 7175 |
| 7020 gtk_widget_show(win->menu.insert_link); | 7176 gtk_action_set_visible(win->menu.insert_link, TRUE); |
| 7021 gtk_widget_show(win->menu.insert_image); | 7177 gtk_action_set_visible(win->menu.insert_image, TRUE); |
| 7022 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { | 7178 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { |
| 7023 /* Show stuff that applies to Chats, hide stuff that applies to IMs */ | 7179 /* Show stuff that applies to Chats, hide stuff that applies to IMs */ |
| 7024 | 7180 |
| 7025 /* Deal with menu items */ | 7181 /* Deal with menu items */ |
| 7026 gtk_widget_show(win->menu.view_log); | 7182 gtk_action_set_visible(win->menu.view_log, TRUE); |
| 7027 gtk_widget_hide(win->menu.send_file); | 7183 gtk_action_set_visible(win->menu.send_file, FALSE); |
| 7028 gtk_widget_hide(win->menu.get_attention); | 7184 gtk_action_set_visible(win->menu.get_attention, FALSE); |
| 7029 gtk_widget_hide(win->menu.add_pounce); | 7185 gtk_action_set_visible(win->menu.add_pounce, FALSE); |
| 7030 gtk_widget_hide(win->menu.get_info); | 7186 gtk_action_set_visible(win->menu.get_info, FALSE); |
| 7031 gtk_widget_show(win->menu.invite); | 7187 gtk_action_set_visible(win->menu.invite, TRUE); |
| 7032 gtk_widget_show(win->menu.alias); | 7188 gtk_action_set_visible(win->menu.alias, TRUE); |
| 7033 gtk_widget_hide(win->menu.block); | 7189 gtk_action_set_visible(win->menu.block, FALSE); |
| 7034 gtk_widget_hide(win->menu.unblock); | 7190 gtk_action_set_visible(win->menu.unblock, FALSE); |
| 7035 | 7191 |
| 7036 if ((account == NULL) || purple_blist_find_chat(account, purple_conversation_get_name(conv)) == NULL) { | 7192 if ((account == NULL) || purple_blist_find_chat(account, purple_conversation_get_name(conv)) == NULL) { |
| 7037 /* If the chat is NOT in the buddy list */ | 7193 /* If the chat is NOT in the buddy list */ |
| 7038 gtk_widget_show(win->menu.add); | 7194 gtk_action_set_visible(win->menu.add, TRUE); |
| 7039 gtk_widget_hide(win->menu.remove); | 7195 gtk_action_set_visible(win->menu.remove, FALSE); |
| 7040 } else { | 7196 } else { |
| 7041 /* If the chat IS in the buddy list */ | 7197 /* If the chat IS in the buddy list */ |
| 7042 gtk_widget_hide(win->menu.add); | 7198 gtk_action_set_visible(win->menu.add, FALSE); |
| 7043 gtk_widget_show(win->menu.remove); | 7199 gtk_action_set_visible(win->menu.remove, TRUE); |
| 7044 } | 7200 } |
| 7045 | 7201 |
| 7046 gtk_widget_show(win->menu.insert_link); | 7202 gtk_action_set_visible(win->menu.insert_link, TRUE); |
| 7047 gtk_widget_show(win->menu.insert_image); | 7203 gtk_action_set_visible(win->menu.insert_image, TRUE); |
| 7048 } | 7204 } |
| 7049 | 7205 |
| 7050 /* | 7206 /* |
| 7051 * Handle graying stuff out based on whether an account is connected | 7207 * Handle graying stuff out based on whether an account is connected |
| 7052 * and what features that account supports. | 7208 * and what features that account supports. |
| 7091 gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->entry), buttons); | 7247 gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->entry), buttons); |
| 7092 if (account != NULL) | 7248 if (account != NULL) |
| 7093 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), purple_account_get_protocol_id(account)); | 7249 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), purple_account_get_protocol_id(account)); |
| 7094 | 7250 |
| 7095 /* Deal with menu items */ | 7251 /* Deal with menu items */ |
| 7096 gtk_widget_set_sensitive(win->menu.view_log, TRUE); | 7252 gtk_action_set_sensitive(win->menu.view_log, TRUE); |
| 7097 gtk_widget_set_sensitive(win->menu.add_pounce, TRUE); | 7253 gtk_action_set_sensitive(win->menu.add_pounce, TRUE); |
| 7098 gtk_widget_set_sensitive(win->menu.get_info, (prpl_info->get_info != NULL)); | 7254 gtk_action_set_sensitive(win->menu.get_info, (prpl_info->get_info != NULL)); |
| 7099 gtk_widget_set_sensitive(win->menu.invite, (prpl_info->chat_invite != NULL)); | 7255 gtk_action_set_sensitive(win->menu.invite, (prpl_info->chat_invite != NULL)); |
| 7100 gtk_widget_set_sensitive(win->menu.insert_link, (features & PURPLE_CONNECTION_HTML)); | 7256 gtk_action_set_sensitive(win->menu.insert_link, (features & PURPLE_CONNECTION_HTML)); |
| 7101 gtk_widget_set_sensitive(win->menu.insert_image, !(features & PURPLE_CONNECTION_NO_IMAGES)); | 7257 gtk_action_set_sensitive(win->menu.insert_image, !(features & PURPLE_CONNECTION_NO_IMAGES)); |
| 7102 | 7258 |
| 7103 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) | 7259 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) |
| 7104 { | 7260 { |
| 7105 gtk_widget_set_sensitive(win->menu.add, (prpl_info->add_buddy != NULL)); | 7261 gtk_action_set_sensitive(win->menu.add, (prpl_info->add_buddy != NULL)); |
| 7106 gtk_widget_set_sensitive(win->menu.remove, (prpl_info->remove_buddy != NULL)); | 7262 gtk_action_set_sensitive(win->menu.remove, (prpl_info->remove_buddy != NULL)); |
| 7107 gtk_widget_set_sensitive(win->menu.send_file, | 7263 gtk_action_set_sensitive(win->menu.send_file, |
| 7108 (prpl_info->send_file != NULL && (!prpl_info->can_receive_file || | 7264 (prpl_info->send_file != NULL && (!prpl_info->can_receive_file || |
| 7109 prpl_info->can_receive_file(gc, purple_conversation_get_name(conv))))); | 7265 prpl_info->can_receive_file(gc, purple_conversation_get_name(conv))))); |
| 7110 gtk_widget_set_sensitive(win->menu.get_attention, (prpl_info->send_attention != NULL)); | 7266 gtk_action_set_sensitive(win->menu.get_attention, (prpl_info->send_attention != NULL)); |
| 7111 gtk_widget_set_sensitive(win->menu.alias, | 7267 gtk_action_set_sensitive(win->menu.alias, |
| 7112 (account != NULL) && | 7268 (account != NULL) && |
| 7113 (purple_find_buddy(account, purple_conversation_get_name(conv)) != NULL)); | 7269 (purple_find_buddy(account, purple_conversation_get_name(conv)) != NULL)); |
| 7114 } | 7270 } |
| 7115 else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) | 7271 else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) |
| 7116 { | 7272 { |
| 7117 gtk_widget_set_sensitive(win->menu.add, (prpl_info->join_chat != NULL)); | 7273 gtk_action_set_sensitive(win->menu.add, (prpl_info->join_chat != NULL)); |
| 7118 gtk_widget_set_sensitive(win->menu.remove, (prpl_info->join_chat != NULL)); | 7274 gtk_action_set_sensitive(win->menu.remove, (prpl_info->join_chat != NULL)); |
| 7119 gtk_widget_set_sensitive(win->menu.alias, | 7275 gtk_action_set_sensitive(win->menu.alias, |
| 7120 (account != NULL) && | 7276 (account != NULL) && |
| 7121 (purple_blist_find_chat(account, purple_conversation_get_name(conv)) != NULL)); | 7277 (purple_blist_find_chat(account, purple_conversation_get_name(conv)) != NULL)); |
| 7122 } | 7278 } |
| 7123 | 7279 |
| 7124 } else { | 7280 } else { |
| 7125 /* Account is offline */ | 7281 /* Account is offline */ |
| 7126 /* Or it's a chat that we've left. */ | 7282 /* Or it's a chat that we've left. */ |
| 7127 | 7283 |
| 7128 /* Then deal with menu items */ | 7284 /* Then deal with menu items */ |
| 7129 gtk_widget_set_sensitive(win->menu.view_log, TRUE); | 7285 gtk_action_set_sensitive(win->menu.view_log, TRUE); |
| 7130 gtk_widget_set_sensitive(win->menu.send_file, FALSE); | 7286 gtk_action_set_sensitive(win->menu.send_file, FALSE); |
| 7131 gtk_widget_set_sensitive(win->menu.get_attention, FALSE); | 7287 gtk_action_set_sensitive(win->menu.get_attention, FALSE); |
| 7132 gtk_widget_set_sensitive(win->menu.add_pounce, TRUE); | 7288 gtk_action_set_sensitive(win->menu.add_pounce, TRUE); |
| 7133 gtk_widget_set_sensitive(win->menu.get_info, FALSE); | 7289 gtk_action_set_sensitive(win->menu.get_info, FALSE); |
| 7134 gtk_widget_set_sensitive(win->menu.invite, FALSE); | 7290 gtk_action_set_sensitive(win->menu.invite, FALSE); |
| 7135 gtk_widget_set_sensitive(win->menu.alias, FALSE); | 7291 gtk_action_set_sensitive(win->menu.alias, FALSE); |
| 7136 gtk_widget_set_sensitive(win->menu.add, FALSE); | 7292 gtk_action_set_sensitive(win->menu.add, FALSE); |
| 7137 gtk_widget_set_sensitive(win->menu.remove, FALSE); | 7293 gtk_action_set_sensitive(win->menu.remove, FALSE); |
| 7138 gtk_widget_set_sensitive(win->menu.insert_link, TRUE); | 7294 gtk_action_set_sensitive(win->menu.insert_link, TRUE); |
| 7139 gtk_widget_set_sensitive(win->menu.insert_image, FALSE); | 7295 gtk_action_set_sensitive(win->menu.insert_image, FALSE); |
| 7140 } | 7296 } |
| 7141 | 7297 |
| 7142 /* | 7298 /* |
| 7143 * Update the window's icon | 7299 * Update the window's icon |
| 7144 */ | 7300 */ |
| 7215 if (gtkchat->topic_text != NULL) | 7371 if (gtkchat->topic_text != NULL) |
| 7216 { | 7372 { |
| 7217 topic = purple_conv_chat_get_topic(chat); | 7373 topic = purple_conv_chat_get_topic(chat); |
| 7218 | 7374 |
| 7219 gtk_entry_set_text(GTK_ENTRY(gtkchat->topic_text), topic ? topic : ""); | 7375 gtk_entry_set_text(GTK_ENTRY(gtkchat->topic_text), topic ? topic : ""); |
| 7376 #if GTK_CHECK_VERSION(2,12,0) | |
| 7377 gtk_widget_set_tooltip_text(gtkchat->topic_text, | |
| 7378 topic ? topic : ""); | |
| 7379 #else | |
| 7220 gtk_tooltips_set_tip(gtkconv->tooltips, gtkchat->topic_text, | 7380 gtk_tooltips_set_tip(gtkconv->tooltips, gtkchat->topic_text, |
| 7221 topic ? topic : "", NULL); | 7381 topic ? topic : "", NULL); |
| 7382 #endif | |
| 7222 } | 7383 } |
| 7223 } | 7384 } |
| 7224 | 7385 |
| 7225 #if 0 | 7386 #if 0 |
| 7226 if (fields & PIDGIN_CONV_SMILEY_THEME) | 7387 if (fields & PIDGIN_CONV_SMILEY_THEME) |
| 7227 pidgin_themes_smiley_themeize(PIDGIN_CONVERSATION(conv)->webview); | 7388 pidgin_themes_smiley_themeize(PIDGIN_CONVERSATION(conv)->webview); |
| 7228 #endif | 7389 #endif |
| 7229 | 7390 |
| 7230 if ((fields & PIDGIN_CONV_COLORIZE_TITLE) || | 7391 if ((fields & PIDGIN_CONV_COLORIZE_TITLE) || |
| 7231 (fields & PIDGIN_CONV_SET_TITLE) || | 7392 (fields & PIDGIN_CONV_SET_TITLE) || |
| 7232 (fields & PIDGIN_CONV_TOPIC)) | 7393 (fields & PIDGIN_CONV_TOPIC)) |
| 7233 { | 7394 { |
| 7234 char *title; | 7395 char *title; |
| 7235 PurpleConvIm *im = NULL; | 7396 PurpleConvIm *im = NULL; |
| 7236 PurpleAccount *account = purple_conversation_get_account(conv); | 7397 PurpleAccount *account = purple_conversation_get_account(conv); |
| 7237 PurpleBuddy *buddy = NULL; | 7398 PurpleBuddy *buddy = NULL; |
| 7278 gtk_widget_queue_draw(gtkconv->infopane); | 7439 gtk_widget_queue_draw(gtkconv->infopane); |
| 7279 | 7440 |
| 7280 if (title != markup) | 7441 if (title != markup) |
| 7281 g_free(markup); | 7442 g_free(markup); |
| 7282 | 7443 |
| 7283 if (!GTK_WIDGET_REALIZED(gtkconv->tab_label)) | 7444 if (!gtk_widget_get_realized(gtkconv->tab_label)) |
| 7284 gtk_widget_realize(gtkconv->tab_label); | 7445 gtk_widget_realize(gtkconv->tab_label); |
| 7285 | 7446 |
| 7286 accessibility_obj = gtk_widget_get_accessible(gtkconv->tab_cont); | 7447 accessibility_obj = gtk_widget_get_accessible(gtkconv->tab_cont); |
| 7287 if (im != NULL && | 7448 if (im != NULL && |
| 7288 purple_conv_im_get_typing_state(im) == PURPLE_TYPING) { | 7449 purple_conv_im_get_typing_state(im) == PURPLE_TYPING) { |
| 7593 | 7754 |
| 7594 event = gtk_event_box_new(); | 7755 event = gtk_event_box_new(); |
| 7595 gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event); | 7756 gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event); |
| 7596 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE); | 7757 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE); |
| 7597 gtk_widget_add_events(event, | 7758 gtk_widget_add_events(event, |
| 7598 GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); | 7759 GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); |
| 7599 g_signal_connect(G_OBJECT(event), "button-press-event", | 7760 g_signal_connect(G_OBJECT(event), "button-press-event", |
| 7600 G_CALLBACK(icon_menu), gtkconv); | 7761 G_CALLBACK(icon_menu), gtkconv); |
| 7601 | 7762 |
| 7602 pidgin_tooltip_setup_for_widget(event, gtkconv, pidgin_conv_create_tooltip, NULL); | 7763 pidgin_tooltip_setup_for_widget(event, gtkconv, pidgin_conv_create_tooltip, NULL); |
| 7603 gtk_widget_show(event); | 7764 gtk_widget_show(event); |
| 7635 static gboolean | 7796 static gboolean |
| 7636 pidgin_conv_xy_to_right_infopane(PidginWindow *win, int x, int y) | 7797 pidgin_conv_xy_to_right_infopane(PidginWindow *win, int x, int y) |
| 7637 { | 7798 { |
| 7638 gint pane_x, pane_y, x_rel; | 7799 gint pane_x, pane_y, x_rel; |
| 7639 PidginConversation *gtkconv; | 7800 PidginConversation *gtkconv; |
| 7640 | 7801 GtkAllocation allocation; |
| 7641 gdk_window_get_origin(win->notebook->window, &pane_x, &pane_y); | 7802 |
| 7803 gdk_window_get_origin(gtk_widget_get_window(win->notebook), | |
| 7804 &pane_x, &pane_y); | |
| 7642 x_rel = x - pane_x; | 7805 x_rel = x - pane_x; |
| 7643 gtkconv = pidgin_conv_window_get_active_gtkconv(win); | 7806 gtkconv = pidgin_conv_window_get_active_gtkconv(win); |
| 7644 return (x_rel > gtkconv->infopane->allocation.x + gtkconv->infopane->allocation.width / 2); | 7807 gtk_widget_get_allocation(gtkconv->infopane, &allocation); |
| 7808 return (x_rel > allocation.x + allocation.width / 2); | |
| 7645 } | 7809 } |
| 7646 | 7810 |
| 7647 int | 7811 int |
| 7648 pidgin_conv_get_tab_at_xy(PidginWindow *win, int x, int y, gboolean *to_right) | 7812 pidgin_conv_get_tab_at_xy(PidginWindow *win, int x, int y, gboolean *to_right) |
| 7649 { | 7813 { |
| 7657 if (to_right) | 7821 if (to_right) |
| 7658 *to_right = FALSE; | 7822 *to_right = FALSE; |
| 7659 | 7823 |
| 7660 notebook = GTK_NOTEBOOK(win->notebook); | 7824 notebook = GTK_NOTEBOOK(win->notebook); |
| 7661 | 7825 |
| 7662 gdk_window_get_origin(win->notebook->window, &nb_x, &nb_y); | 7826 gdk_window_get_origin(gtk_widget_get_window(win->notebook), &nb_x, &nb_y); |
| 7663 x_rel = x - nb_x; | 7827 x_rel = x - nb_x; |
| 7664 y_rel = y - nb_y; | 7828 y_rel = y - nb_y; |
| 7665 | 7829 |
| 7666 horiz = (gtk_notebook_get_tab_pos(notebook) == GTK_POS_TOP || | 7830 horiz = (gtk_notebook_get_tab_pos(notebook) == GTK_POS_TOP || |
| 7667 gtk_notebook_get_tab_pos(notebook) == GTK_POS_BOTTOM); | 7831 gtk_notebook_get_tab_pos(notebook) == GTK_POS_BOTTOM); |
| 7668 | 7832 |
| 7669 count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)); | 7833 count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)); |
| 7670 | 7834 |
| 7671 for (i = 0; i < count; i++) { | 7835 for (i = 0; i < count; i++) { |
| 7836 GtkAllocation allocation; | |
| 7672 | 7837 |
| 7673 page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), i); | 7838 page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), i); |
| 7674 tab = gtk_notebook_get_tab_label(GTK_NOTEBOOK(notebook), page); | 7839 tab = gtk_notebook_get_tab_label(GTK_NOTEBOOK(notebook), page); |
| 7840 gtk_widget_get_allocation(tab, &allocation); | |
| 7675 | 7841 |
| 7676 /* Make sure the tab is not hidden beyond an arrow */ | 7842 /* Make sure the tab is not hidden beyond an arrow */ |
| 7677 if (!GTK_WIDGET_DRAWABLE(tab) && gtk_notebook_get_show_tabs(notebook)) | 7843 if (!gtk_widget_is_drawable(tab) && gtk_notebook_get_show_tabs(notebook)) |
| 7678 continue; | 7844 continue; |
| 7679 | 7845 |
| 7680 if (horiz) { | 7846 if (horiz) { |
| 7681 if (x_rel >= tab->allocation.x - PIDGIN_HIG_BOX_SPACE && | 7847 if (x_rel >= allocation.x - PIDGIN_HIG_BOX_SPACE && |
| 7682 x_rel <= tab->allocation.x + tab->allocation.width + PIDGIN_HIG_BOX_SPACE) { | 7848 x_rel <= allocation.x + allocation.width + PIDGIN_HIG_BOX_SPACE) { |
| 7683 page_num = i; | 7849 page_num = i; |
| 7684 | 7850 |
| 7685 if (to_right && x_rel >= tab->allocation.x + tab->allocation.width/2) | 7851 if (to_right && x_rel >= allocation.x + allocation.width/2) |
| 7686 *to_right = TRUE; | 7852 *to_right = TRUE; |
| 7687 | 7853 |
| 7688 break; | 7854 break; |
| 7689 } | 7855 } |
| 7690 } else { | 7856 } else { |
| 7691 if (y_rel >= tab->allocation.y - PIDGIN_HIG_BOX_SPACE && | 7857 if (y_rel >= allocation.y - PIDGIN_HIG_BOX_SPACE && |
| 7692 y_rel <= tab->allocation.y + tab->allocation.height + PIDGIN_HIG_BOX_SPACE) { | 7858 y_rel <= allocation.y + allocation.height + PIDGIN_HIG_BOX_SPACE) { |
| 7693 page_num = i; | 7859 page_num = i; |
| 7694 | 7860 |
| 7695 if (to_right && y_rel >= tab->allocation.y + tab->allocation.height/2) | 7861 if (to_right && y_rel >= allocation.y + allocation.height/2) |
| 7696 *to_right = TRUE; | 7862 *to_right = TRUE; |
| 7697 | 7863 |
| 7698 break; | 7864 break; |
| 7699 } | 7865 } |
| 7700 } | 7866 } |
| 7797 continue; | 7963 continue; |
| 7798 | 7964 |
| 7799 gtkconv = PIDGIN_CONVERSATION(conv); | 7965 gtkconv = PIDGIN_CONVERSATION(conv); |
| 7800 win = gtkconv->win; | 7966 win = gtkconv->win; |
| 7801 | 7967 |
| 7802 gtk_check_menu_item_set_active( | 7968 gtk_toggle_action_set_active( |
| 7803 GTK_CHECK_MENU_ITEM(win->menu.show_timestamps), | 7969 GTK_TOGGLE_ACTION(win->menu.show_timestamps), |
| 7804 (gboolean)GPOINTER_TO_INT(value)); | 7970 (gboolean)GPOINTER_TO_INT(value)); |
| 7805 | 7971 |
| 7806 /* TODO WEBKIT: Use WebKit version of this. */ | 7972 /* TODO WEBKIT: Use WebKit version of this. */ |
| 7807 #if 0 | 7973 #if 0 |
| 7808 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), | 7974 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), |
| 7828 continue; | 7994 continue; |
| 7829 | 7995 |
| 7830 gtkconv = PIDGIN_CONVERSATION(conv); | 7996 gtkconv = PIDGIN_CONVERSATION(conv); |
| 7831 win = gtkconv->win; | 7997 win = gtkconv->win; |
| 7832 | 7998 |
| 7833 gtk_check_menu_item_set_active( | 7999 gtk_toggle_action_set_active( |
| 7834 GTK_CHECK_MENU_ITEM(win->menu.show_formatting_toolbar), | 8000 GTK_TOGGLE_ACTION(win->menu.show_formatting_toolbar), |
| 7835 (gboolean)GPOINTER_TO_INT(value)); | 8001 (gboolean)GPOINTER_TO_INT(value)); |
| 7836 | 8002 |
| 7837 if ((gboolean)GPOINTER_TO_INT(value)) | 8003 if ((gboolean)GPOINTER_TO_INT(value)) |
| 7838 gtk_widget_show(gtkconv->toolbar); | 8004 gtk_widget_show(gtkconv->toolbar); |
| 7839 else | 8005 else |
| 8450 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/im/show_buddy_icons", | 8616 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/im/show_buddy_icons", |
| 8451 show_buddy_icons_pref_cb, NULL); | 8617 show_buddy_icons_pref_cb, NULL); |
| 8452 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/blist/show_protocol_icons", | 8618 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/blist/show_protocol_icons", |
| 8453 show_protocol_icons_pref_cb, NULL); | 8619 show_protocol_icons_pref_cb, NULL); |
| 8454 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/im/hide_new", | 8620 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/im/hide_new", |
| 8455 hide_new_pref_cb, NULL); | 8621 hide_new_pref_cb, NULL); |
| 8456 | 8622 |
| 8457 | 8623 |
| 8458 | 8624 |
| 8459 /********************************************************************** | 8625 /********************************************************************** |
| 8460 * Register signals | 8626 * Register signals |
| 8607 | 8773 |
| 8608 hidden_convwin = pidgin_conv_window_new(); | 8774 hidden_convwin = pidgin_conv_window_new(); |
| 8609 window_list = g_list_remove(window_list, hidden_convwin); | 8775 window_list = g_list_remove(window_list, hidden_convwin); |
| 8610 | 8776 |
| 8611 purple_signal_connect(purple_accounts_get_handle(), "account-status-changed", | 8777 purple_signal_connect(purple_accounts_get_handle(), "account-status-changed", |
| 8612 handle, PURPLE_CALLBACK(account_status_changed_cb), NULL); | 8778 handle, PURPLE_CALLBACK(account_status_changed_cb), NULL); |
| 8613 | 8779 |
| 8614 /* Callbacks to update a conversation */ | 8780 /* Callbacks to update a conversation */ |
| 8615 purple_signal_connect(blist_handle, "blist-node-added", handle, | 8781 purple_signal_connect(blist_handle, "blist-node-added", handle, |
| 8616 G_CALLBACK(buddy_update_cb), NULL); | 8782 G_CALLBACK(buddy_update_cb), NULL); |
| 8617 purple_signal_connect(blist_handle, "blist-node-removed", handle, | 8783 purple_signal_connect(blist_handle, "blist-node-removed", handle, |
| 8793 GTK_RESPONSE_OK); | 8959 GTK_RESPONSE_OK); |
| 8794 | 8960 |
| 8795 gtk_container_set_border_width(GTK_CONTAINER(warn_close_dialog), | 8961 gtk_container_set_border_width(GTK_CONTAINER(warn_close_dialog), |
| 8796 6); | 8962 6); |
| 8797 gtk_window_set_resizable(GTK_WINDOW(warn_close_dialog), FALSE); | 8963 gtk_window_set_resizable(GTK_WINDOW(warn_close_dialog), FALSE); |
| 8964 | |
| 8965 /* TODO: figure out how to set no separator in GTK+ 3.0 */ | |
| 8966 #if 0 | |
| 8798 gtk_dialog_set_has_separator(GTK_DIALOG(warn_close_dialog), | 8967 gtk_dialog_set_has_separator(GTK_DIALOG(warn_close_dialog), |
| 8799 FALSE); | 8968 FALSE); |
| 8969 #endif | |
| 8800 | 8970 |
| 8801 /* Setup the outside spacing. */ | 8971 /* Setup the outside spacing. */ |
| 8802 vbox = GTK_DIALOG(warn_close_dialog)->vbox; | 8972 vbox = gtk_dialog_get_content_area(GTK_DIALOG(warn_close_dialog)); |
| 8803 | 8973 |
| 8804 gtk_box_set_spacing(GTK_BOX(vbox), 12); | 8974 gtk_box_set_spacing(GTK_BOX(vbox), 12); |
| 8805 gtk_container_set_border_width(GTK_CONTAINER(vbox), 6); | 8975 gtk_container_set_border_width(GTK_CONTAINER(vbox), 6); |
| 8806 | 8976 |
| 8807 img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_WARNING, | 8977 img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_WARNING, |
| 8951 #ifndef _WIN32 | 9121 #ifndef _WIN32 |
| 8952 /* Currently for win32 GTK+ (as of 2.2.1), gdk_pointer_is_grabbed will | 9122 /* Currently for win32 GTK+ (as of 2.2.1), gdk_pointer_is_grabbed will |
| 8953 always be true after a button press. */ | 9123 always be true after a button press. */ |
| 8954 if (!gdk_pointer_is_grabbed()) | 9124 if (!gdk_pointer_is_grabbed()) |
| 8955 #endif | 9125 #endif |
| 8956 gdk_pointer_grab(gtkwin->notebook->window, FALSE, | 9126 gdk_pointer_grab(gtk_widget_get_window(gtkwin->notebook), FALSE, |
| 8957 GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, | 9127 GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, |
| 8958 NULL, cursor, GDK_CURRENT_TIME); | 9128 NULL, cursor, GDK_CURRENT_TIME); |
| 8959 } | 9129 } |
| 8960 | 9130 |
| 8961 static gboolean | 9131 static gboolean |
| 9071 if (e->type != GDK_BUTTON_PRESS) | 9241 if (e->type != GDK_BUTTON_PRESS) |
| 9072 return FALSE; | 9242 return FALSE; |
| 9073 | 9243 |
| 9074 if (e->button == 1) { | 9244 if (e->button == 1) { |
| 9075 int nb_x, nb_y; | 9245 int nb_x, nb_y; |
| 9246 GtkAllocation allocation; | |
| 9247 | |
| 9248 gtk_widget_get_allocation(gtkconv->infopane_hbox, &allocation); | |
| 9076 | 9249 |
| 9077 if (gtkconv->win->in_drag) | 9250 if (gtkconv->win->in_drag) |
| 9078 return TRUE; | 9251 return TRUE; |
| 9079 | 9252 |
| 9080 gtkconv->win->in_predrag = TRUE; | 9253 gtkconv->win->in_predrag = TRUE; |
| 9081 gtkconv->win->drag_tab = gtk_notebook_page_num(GTK_NOTEBOOK(gtkconv->win->notebook), gtkconv->tab_cont); | 9254 gtkconv->win->drag_tab = gtk_notebook_page_num(GTK_NOTEBOOK(gtkconv->win->notebook), gtkconv->tab_cont); |
| 9082 | 9255 |
| 9083 gdk_window_get_origin(gtkconv->infopane_hbox->window, &nb_x, &nb_y); | 9256 gdk_window_get_origin(gtk_widget_get_window(gtkconv->infopane_hbox), &nb_x, &nb_y); |
| 9084 | 9257 |
| 9085 gtkconv->win->drag_min_x = gtkconv->infopane_hbox->allocation.x + nb_x; | 9258 gtkconv->win->drag_min_x = allocation.x + nb_x; |
| 9086 gtkconv->win->drag_min_y = gtkconv->infopane_hbox->allocation.y + nb_y; | 9259 gtkconv->win->drag_min_y = allocation.y + nb_y; |
| 9087 gtkconv->win->drag_max_x = gtkconv->infopane_hbox->allocation.width + gtkconv->win->drag_min_x; | 9260 gtkconv->win->drag_max_x = allocation.width + gtkconv->win->drag_min_x; |
| 9088 gtkconv->win->drag_max_y = gtkconv->infopane_hbox->allocation.height + gtkconv->win->drag_min_y; | 9261 gtkconv->win->drag_max_y = allocation.height + gtkconv->win->drag_min_y; |
| 9089 | 9262 |
| 9090 gtkconv->win->drag_motion_signal = g_signal_connect(G_OBJECT(gtkconv->win->notebook), "motion_notify_event", | 9263 gtkconv->win->drag_motion_signal = g_signal_connect(G_OBJECT(gtkconv->win->notebook), "motion_notify_event", |
| 9091 G_CALLBACK(notebook_motion_cb), gtkconv->win); | 9264 G_CALLBACK(notebook_motion_cb), gtkconv->win); |
| 9092 gtkconv->win->drag_leave_signal = g_signal_connect(G_OBJECT(gtkconv->win->notebook), "leave_notify_event", | 9265 gtkconv->win->drag_leave_signal = g_signal_connect(G_OBJECT(gtkconv->win->notebook), "leave_notify_event", |
| 9093 G_CALLBACK(notebook_leave_cb), gtkconv->win); | 9266 G_CALLBACK(notebook_leave_cb), gtkconv->win); |
| 9096 | 9269 |
| 9097 if (e->button == 3) { | 9270 if (e->button == 3) { |
| 9098 /* Right click was pressed. Popup the context menu. */ | 9271 /* Right click was pressed. Popup the context menu. */ |
| 9099 GtkWidget *menu = gtk_menu_new(), *sub; | 9272 GtkWidget *menu = gtk_menu_new(), *sub; |
| 9100 gboolean populated = populate_menu_with_options(menu, gtkconv, TRUE); | 9273 gboolean populated = populate_menu_with_options(menu, gtkconv, TRUE); |
| 9274 #if 0 /* TODO */ | |
| 9101 sub = gtk_menu_item_get_submenu(GTK_MENU_ITEM(gtkconv->win->menu.send_to)); | 9275 sub = gtk_menu_item_get_submenu(GTK_MENU_ITEM(gtkconv->win->menu.send_to)); |
| 9102 | 9276 |
| 9103 if (sub && GTK_WIDGET_IS_SENSITIVE(gtkconv->win->menu.send_to)) { | 9277 if (sub && GTK_WIDGET_IS_SENSITIVE(gtkconv->win->menu.send_to)) { |
| 9104 GtkWidget *item = gtk_menu_item_new_with_mnemonic(_("S_end To")); | 9278 GtkWidget *item = gtk_menu_item_new_with_mnemonic(_("S_end To")); |
| 9105 if (populated) | 9279 if (populated) |
| 9110 gtk_widget_show_all(sub); | 9284 gtk_widget_show_all(sub); |
| 9111 } else if (!populated) { | 9285 } else if (!populated) { |
| 9112 gtk_widget_destroy(menu); | 9286 gtk_widget_destroy(menu); |
| 9113 return FALSE; | 9287 return FALSE; |
| 9114 } | 9288 } |
| 9115 | 9289 #endif |
| 9116 gtk_widget_show_all(menu); | 9290 gtk_widget_show_all(menu); |
| 9117 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, e->button, e->time); | 9291 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, e->button, e->time); |
| 9118 return TRUE; | 9292 return TRUE; |
| 9119 } | 9293 } |
| 9120 return FALSE; | 9294 return FALSE; |
| 9125 { | 9299 { |
| 9126 gint nb_x, nb_y; | 9300 gint nb_x, nb_y; |
| 9127 int tab_clicked; | 9301 int tab_clicked; |
| 9128 GtkWidget *page; | 9302 GtkWidget *page; |
| 9129 GtkWidget *tab; | 9303 GtkWidget *tab; |
| 9304 GtkAllocation allocation; | |
| 9130 | 9305 |
| 9131 if (e->button == 2 && e->type == GDK_BUTTON_PRESS) { | 9306 if (e->button == 2 && e->type == GDK_BUTTON_PRESS) { |
| 9132 PidginConversation *gtkconv; | 9307 PidginConversation *gtkconv; |
| 9133 tab_clicked = pidgin_conv_get_tab_at_xy(win, e->x_root, e->y_root, NULL); | 9308 tab_clicked = pidgin_conv_get_tab_at_xy(win, e->x_root, e->y_root, NULL); |
| 9134 | 9309 |
| 9162 | 9337 |
| 9163 /* | 9338 /* |
| 9164 * Get the relative position of the press event, with regards to | 9339 * Get the relative position of the press event, with regards to |
| 9165 * the position of the notebook. | 9340 * the position of the notebook. |
| 9166 */ | 9341 */ |
| 9167 gdk_window_get_origin(win->notebook->window, &nb_x, &nb_y); | 9342 gdk_window_get_origin(gtk_widget_get_window(win->notebook), &nb_x, &nb_y); |
| 9168 | 9343 |
| 9169 /* Reset the min/max x/y */ | 9344 /* Reset the min/max x/y */ |
| 9170 win->drag_min_x = 0; | 9345 win->drag_min_x = 0; |
| 9171 win->drag_min_y = 0; | 9346 win->drag_min_y = 0; |
| 9172 win->drag_max_x = 0; | 9347 win->drag_max_x = 0; |
| 9174 | 9349 |
| 9175 /* Find out which tab was dragged. */ | 9350 /* Find out which tab was dragged. */ |
| 9176 page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), tab_clicked); | 9351 page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), tab_clicked); |
| 9177 tab = gtk_notebook_get_tab_label(GTK_NOTEBOOK(win->notebook), page); | 9352 tab = gtk_notebook_get_tab_label(GTK_NOTEBOOK(win->notebook), page); |
| 9178 | 9353 |
| 9179 win->drag_min_x = tab->allocation.x + nb_x; | 9354 gtk_widget_get_allocation(tab, &allocation); |
| 9180 win->drag_min_y = tab->allocation.y + nb_y; | 9355 |
| 9181 win->drag_max_x = tab->allocation.width + win->drag_min_x; | 9356 win->drag_min_x = allocation.x + nb_x; |
| 9182 win->drag_max_y = tab->allocation.height + win->drag_min_y; | 9357 win->drag_min_y = allocation.y + nb_y; |
| 9358 win->drag_max_x = allocation.width + win->drag_min_x; | |
| 9359 win->drag_max_y = allocation.height + win->drag_min_y; | |
| 9183 | 9360 |
| 9184 /* Make sure the click occurred in the tab. */ | 9361 /* Make sure the click occurred in the tab. */ |
| 9185 if (e->x_root < win->drag_min_x || | 9362 if (e->x_root < win->drag_min_x || |
| 9186 e->x_root >= win->drag_max_x || | 9363 e->x_root >= win->drag_max_x || |
| 9187 e->y_root < win->drag_min_y || | 9364 e->y_root < win->drag_min_y || |
| 9188 e->y_root >= win->drag_max_y) { | 9365 e->y_root >= win->drag_max_y) { |
| 9189 | 9366 |
| 9190 return FALSE; | 9367 return FALSE; |
| 9191 } | 9368 } |
| 9192 | 9369 |
| 9193 win->in_predrag = TRUE; | 9370 win->in_predrag = TRUE; |
| 9194 win->drag_tab = tab_clicked; | 9371 win->drag_tab = tab_clicked; |
| 9195 | 9372 |
| 9196 /* Connect the new motion signals. */ | 9373 /* Connect the new motion signals. */ |
| 9414 | 9591 |
| 9415 if (gtkconv) | 9592 if (gtkconv) |
| 9416 close_conv_cb(NULL, gtkconv); | 9593 close_conv_cb(NULL, gtkconv); |
| 9417 } | 9594 } |
| 9418 | 9595 |
| 9596 /* TODO: I don't know if this doable in GTK+ 3.0 */ | |
| 9597 #if 0 | |
| 9419 static gboolean | 9598 static gboolean |
| 9420 right_click_menu_cb(GtkNotebook *notebook, GdkEventButton *event, PidginWindow *win) | 9599 right_click_menu_cb(GtkNotebook *notebook, GdkEventButton *event, PidginWindow *win) |
| 9421 { | 9600 { |
| 9422 GtkWidget *item, *menu; | 9601 GtkWidget *item; |
| 9423 PidginConversation *gtkconv; | 9602 PidginConversation *gtkconv; |
| 9603 GtkWidget *menu = gtk_notebook_get_menu | |
| 9424 | 9604 |
| 9425 if (event->type != GDK_BUTTON_PRESS || event->button != 3) | 9605 if (event->type != GDK_BUTTON_PRESS || event->button != 3) |
| 9426 return FALSE; | 9606 return FALSE; |
| 9427 | 9607 |
| 9428 gtkconv = pidgin_conv_window_get_gtkconv_at_index(win, | 9608 gtkconv = pidgin_conv_window_get_gtkconv_at_index(win, |
| 9465 g_signal_connect(G_OBJECT(item), "activate", | 9645 g_signal_connect(G_OBJECT(item), "activate", |
| 9466 G_CALLBACK(close_tab_cb), menu); | 9646 G_CALLBACK(close_tab_cb), menu); |
| 9467 | 9647 |
| 9468 return FALSE; | 9648 return FALSE; |
| 9469 } | 9649 } |
| 9650 #endif | |
| 9470 | 9651 |
| 9471 static void | 9652 static void |
| 9472 remove_edit_entry(PidginConversation *gtkconv, GtkWidget *entry) | 9653 remove_edit_entry(PidginConversation *gtkconv, GtkWidget *entry) |
| 9473 { | 9654 { |
| 9474 g_signal_handlers_disconnect_matched(G_OBJECT(entry), G_SIGNAL_MATCH_DATA, | 9655 g_signal_handlers_disconnect_matched(G_OBJECT(entry), G_SIGNAL_MATCH_DATA, |
| 9486 } | 9667 } |
| 9487 | 9668 |
| 9488 static gboolean | 9669 static gboolean |
| 9489 alias_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer user_data) | 9670 alias_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer user_data) |
| 9490 { | 9671 { |
| 9491 if (event->keyval == GDK_Escape) { | 9672 if (event->keyval == GDK_KEY_Escape) { |
| 9492 remove_edit_entry(user_data, widget); | 9673 remove_edit_entry(user_data, widget); |
| 9493 return TRUE; | 9674 return TRUE; |
| 9494 } | 9675 } |
| 9495 return FALSE; | 9676 return FALSE; |
| 9496 } | 9677 } |
| 9513 | 9694 |
| 9514 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { | 9695 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { |
| 9515 PurpleBuddy *buddy; | 9696 PurpleBuddy *buddy; |
| 9516 buddy = purple_find_buddy(account, name); | 9697 buddy = purple_find_buddy(account, name); |
| 9517 if (buddy != NULL) { | 9698 if (buddy != NULL) { |
| 9518 purple_blist_alias_buddy(buddy, | 9699 purple_blist_alias_buddy(buddy, gtk_entry_get_text(entry)); |
| 9519 gtk_entry_get_text(entry)); | |
| 9520 } | 9700 } |
| 9521 serv_alias_buddy(buddy); | 9701 serv_alias_buddy(buddy); |
| 9522 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { | 9702 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { |
| 9523 gtk_entry_set_text(GTK_ENTRY(gtkconv->u.chat->topic_text), gtk_entry_get_text(entry)); | 9703 gtk_entry_set_text(GTK_ENTRY(gtkconv->u.chat->topic_text), gtk_entry_get_text(entry)); |
| 9524 topic_callback(NULL, gtkconv); | 9704 topic_callback(NULL, gtkconv); |
| 9531 { | 9711 { |
| 9532 GtkWidget *entry = NULL; | 9712 GtkWidget *entry = NULL; |
| 9533 PurpleConversation *conv = gtkconv->active_conv; | 9713 PurpleConversation *conv = gtkconv->active_conv; |
| 9534 const char *text = NULL; | 9714 const char *text = NULL; |
| 9535 | 9715 |
| 9536 if (!GTK_WIDGET_VISIBLE(gtkconv->infopane)) { | 9716 if (!gtk_widget_get_visible(gtkconv->infopane)) { |
| 9537 /* There's already an entry for alias. Let's not create another one. */ | 9717 /* There's already an entry for alias. Let's not create another one. */ |
| 9538 return FALSE; | 9718 return FALSE; |
| 9539 } | 9719 } |
| 9540 | 9720 |
| 9541 if (!purple_account_is_connected(purple_conversation_get_account(gtkconv->active_conv))) { | 9721 if (!purple_account_is_connected(purple_conversation_get_account(gtkconv->active_conv))) { |
| 9615 gtkconv_set_unseen(gtkconv, PIDGIN_UNSEEN_NONE); | 9795 gtkconv_set_unseen(gtkconv, PIDGIN_UNSEEN_NONE); |
| 9616 } | 9796 } |
| 9617 | 9797 |
| 9618 /* Update the menubar */ | 9798 /* Update the menubar */ |
| 9619 | 9799 |
| 9620 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtkconv->win->menu.logging), | 9800 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(gtkconv->win->menu.logging), |
| 9621 purple_conversation_is_logging(conv)); | 9801 purple_conversation_is_logging(conv)); |
| 9622 | 9802 |
| 9623 generate_send_to_items(win); | 9803 generate_send_to_items(win); |
| 9624 regenerate_options_items(win); | 9804 regenerate_options_items(win); |
| 9625 regenerate_plugins_items(win); | 9805 regenerate_plugins_items(win); |
| 9626 | 9806 |
| 9627 pidgin_conv_switch_active_conversation(conv); | 9807 pidgin_conv_switch_active_conversation(conv); |
| 9628 | 9808 |
| 9629 sound_method = purple_prefs_get_string(PIDGIN_PREFS_ROOT "/sound/method"); | 9809 sound_method = purple_prefs_get_string(PIDGIN_PREFS_ROOT "/sound/method"); |
| 9630 if (strcmp(sound_method, "none") != 0) | 9810 if (strcmp(sound_method, "none") != 0) |
| 9631 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.sounds), | 9811 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(win->menu.sounds), |
| 9632 gtkconv->make_sound); | 9812 gtkconv->make_sound); |
| 9633 | 9813 |
| 9634 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.show_formatting_toolbar), | 9814 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(win->menu.show_formatting_toolbar), |
| 9635 purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/show_formatting_toolbar")); | 9815 purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/show_formatting_toolbar")); |
| 9636 | 9816 |
| 9637 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.show_timestamps), | 9817 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(win->menu.show_timestamps), |
| 9638 purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/show_timestamps")); | 9818 purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/show_timestamps")); |
| 9639 | 9819 |
| 9640 /* | 9820 /* |
| 9641 * We pause icons when they are not visible. If this icon should | 9821 * We pause icons when they are not visible. If this icon should |
| 9642 * be animated then start it back up again. | 9822 * be animated then start it back up again. |
| 9643 */ | 9823 */ |
| 9660 | 9840 |
| 9661 static GList* | 9841 static GList* |
| 9662 make_status_icon_list(const char *stock, GtkWidget *w) | 9842 make_status_icon_list(const char *stock, GtkWidget *w) |
| 9663 { | 9843 { |
| 9664 GList *l = NULL; | 9844 GList *l = NULL; |
| 9665 l = g_list_append(l, gtk_widget_render_icon (w, stock, | 9845 l = g_list_append(l, |
| 9666 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL), "GtkWindow")); | 9846 gtk_widget_render_icon(w, stock, |
| 9667 l = g_list_append(l, gtk_widget_render_icon (w, stock, | 9847 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL), "GtkWindow")); |
| 9668 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_SMALL), "GtkWindow")); | 9848 l = g_list_append(l, |
| 9669 l = g_list_append(l, gtk_widget_render_icon (w, stock, | 9849 gtk_widget_render_icon(w, stock, |
| 9670 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_MEDIUM), "GtkWindow")); | 9850 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_SMALL), "GtkWindow")); |
| 9671 l = g_list_append(l, gtk_widget_render_icon (w, stock, | 9851 l = g_list_append(l, |
| 9672 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_LARGE), "GtkWindow")); | 9852 gtk_widget_render_icon(w, stock, |
| 9853 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_MEDIUM), "GtkWindow")); | |
| 9854 l = g_list_append(l, | |
| 9855 gtk_widget_render_icon(w, stock, | |
| 9856 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_LARGE), "GtkWindow")); | |
| 9673 return l; | 9857 return l; |
| 9674 } | 9858 } |
| 9675 | 9859 |
| 9676 static void | 9860 static void |
| 9677 create_icon_lists(GtkWidget *w) | 9861 create_icon_lists(GtkWidget *w) |
| 9691 } | 9875 } |
| 9692 | 9876 |
| 9693 static gboolean gtk_conv_configure_cb(GtkWidget *w, GdkEventConfigure *event, gpointer data) { | 9877 static gboolean gtk_conv_configure_cb(GtkWidget *w, GdkEventConfigure *event, gpointer data) { |
| 9694 int x, y; | 9878 int x, y; |
| 9695 | 9879 |
| 9696 if (GTK_WIDGET_VISIBLE(w)) | 9880 if (gtk_widget_get_visible(w)) |
| 9697 gtk_window_get_position(GTK_WINDOW(w), &x, &y); | 9881 gtk_window_get_position(GTK_WINDOW(w), &x, &y); |
| 9698 else | 9882 else |
| 9699 return FALSE; /* carry on normally */ | 9883 return FALSE; /* carry on normally */ |
| 9700 | 9884 |
| 9701 /* Workaround for GTK+ bug # 169811 - "configure_event" is fired | 9885 /* Workaround for GTK+ bug # 169811 - "configure_event" is fired |
| 9702 * when the window is being maximized */ | 9886 * when the window is being maximized */ |
| 9703 if (gdk_window_get_state(w->window) & GDK_WINDOW_STATE_MAXIMIZED) | 9887 if (gdk_window_get_state(gtk_widget_get_window(w)) & GDK_WINDOW_STATE_MAXIMIZED) |
| 9704 return FALSE; | 9888 return FALSE; |
| 9705 | 9889 |
| 9706 /* don't save off-screen positioning */ | 9890 /* don't save off-screen positioning */ |
| 9707 if (x + event->width < 0 || | 9891 if (x + event->width < 0 || |
| 9708 y + event->height < 0 || | 9892 y + event->height < 0 || |
| 9723 | 9907 |
| 9724 static void | 9908 static void |
| 9725 pidgin_conv_set_position_size(PidginWindow *win, int conv_x, int conv_y, | 9909 pidgin_conv_set_position_size(PidginWindow *win, int conv_x, int conv_y, |
| 9726 int conv_width, int conv_height) | 9910 int conv_width, int conv_height) |
| 9727 { | 9911 { |
| 9728 /* if the window exists, is hidden, we're saving positions, and the | 9912 /* if the window exists, is hidden, we're saving positions, and the |
| 9729 * position is sane... */ | 9913 * position is sane... */ |
| 9730 if (win && win->window && | 9914 if (win && win->window && |
| 9731 !GTK_WIDGET_VISIBLE(win->window) && conv_width != 0) { | 9915 !gtk_widget_get_visible(win->window) && conv_width != 0) { |
| 9732 | 9916 |
| 9733 #ifdef _WIN32 /* only override window manager placement on Windows */ | 9917 #ifdef _WIN32 /* only override window manager placement on Windows */ |
| 9734 /* ...check position is on screen... */ | 9918 /* ...check position is on screen... */ |
| 9735 if (conv_x >= gdk_screen_width()) | 9919 if (conv_x >= gdk_screen_width()) |
| 9736 conv_x = gdk_screen_width() - 100; | 9920 conv_x = gdk_screen_width() - 100; |
| 9811 gtk_notebook_set_scrollable(GTK_NOTEBOOK(win->notebook), TRUE); | 9995 gtk_notebook_set_scrollable(GTK_NOTEBOOK(win->notebook), TRUE); |
| 9812 gtk_notebook_popup_enable(GTK_NOTEBOOK(win->notebook)); | 9996 gtk_notebook_popup_enable(GTK_NOTEBOOK(win->notebook)); |
| 9813 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), FALSE); | 9997 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), FALSE); |
| 9814 gtk_notebook_set_show_border(GTK_NOTEBOOK(win->notebook), TRUE); | 9998 gtk_notebook_set_show_border(GTK_NOTEBOOK(win->notebook), TRUE); |
| 9815 | 9999 |
| 10000 /* TODO: figure out how to add custom stuff to the right-click menu in | |
| 10001 GtkNotebook in GTK+ 3.0 */ | |
| 10002 #if 0 | |
| 9816 g_signal_connect(G_OBJECT(win->notebook), "button-press-event", | 10003 g_signal_connect(G_OBJECT(win->notebook), "button-press-event", |
| 9817 G_CALLBACK(right_click_menu_cb), win); | 10004 G_CALLBACK(right_click_menu_cb), win); |
| 10005 #endif | |
| 9818 | 10006 |
| 9819 gtk_widget_show(win->notebook); | 10007 gtk_widget_show(win->notebook); |
| 9820 | 10008 |
| 9821 g_signal_connect(G_OBJECT(win->notebook), "switch_page", | 10009 g_signal_connect(G_OBJECT(win->notebook), "switch_page", |
| 9822 G_CALLBACK(before_switch_conv_cb), win); | 10010 G_CALLBACK(before_switch_conv_cb), win); |
| 9881 } | 10069 } |
| 9882 return; | 10070 return; |
| 9883 } | 10071 } |
| 9884 gtk_widget_destroy(win->window); | 10072 gtk_widget_destroy(win->window); |
| 9885 | 10073 |
| 9886 g_object_unref(G_OBJECT(win->menu.item_factory)); | 10074 g_object_unref(G_OBJECT(win->menu.ui)); |
| 9887 | 10075 |
| 9888 purple_notify_close_with_handle(win); | 10076 purple_notify_close_with_handle(win); |
| 9889 purple_signals_disconnect_by_handle(win); | 10077 purple_signals_disconnect_by_handle(win); |
| 9890 | 10078 |
| 9891 g_free(win); | 10079 g_free(win); |
| 9904 } | 10092 } |
| 9905 | 10093 |
| 9906 void | 10094 void |
| 9907 pidgin_conv_window_raise(PidginWindow *win) | 10095 pidgin_conv_window_raise(PidginWindow *win) |
| 9908 { | 10096 { |
| 9909 gdk_window_raise(GDK_WINDOW(win->window->window)); | 10097 gdk_window_raise(GDK_WINDOW(gtk_widget_get_window(win->window))); |
| 9910 } | 10098 } |
| 9911 | 10099 |
| 9912 void | 10100 void |
| 9913 pidgin_conv_window_switch_gtkconv(PidginWindow *win, PidginConversation *gtkconv) | 10101 pidgin_conv_window_switch_gtkconv(PidginWindow *win, PidginConversation *gtkconv) |
| 9914 { | 10102 { |
| 9959 pidgin_conv_tab_pack(win, ((PidginConversation*)win->gtkconvs->data)); | 10147 pidgin_conv_tab_pack(win, ((PidginConversation*)win->gtkconvs->data)); |
| 9960 | 10148 |
| 9961 | 10149 |
| 9962 /* Close button. */ | 10150 /* Close button. */ |
| 9963 gtkconv->close = pidgin_create_small_button(gtk_label_new("×")); | 10151 gtkconv->close = pidgin_create_small_button(gtk_label_new("×")); |
| 10152 #if GTK_CHECK_VERSION(2,12,0) | |
| 10153 gtk_widget_set_tooltip_text(gtkconv->close, _("Close conversation")); | |
| 10154 #else | |
| 9964 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->close, | 10155 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->close, |
| 9965 _("Close conversation"), NULL); | 10156 _("Close conversation"), NULL); |
| 10157 #endif | |
| 9966 | 10158 |
| 9967 g_signal_connect(gtkconv->close, "clicked", G_CALLBACK (close_conv_cb), gtkconv); | 10159 g_signal_connect(gtkconv->close, "clicked", G_CALLBACK (close_conv_cb), gtkconv); |
| 9968 | 10160 |
| 9969 /* Status icon. */ | 10161 /* Status icon. */ |
| 9970 gtkconv->icon = gtk_image_new(); | 10162 gtkconv->icon = gtk_image_new(); |
| 10075 gtk_event_box_set_visible_window(GTK_EVENT_BOX(ebox), FALSE); | 10267 gtk_event_box_set_visible_window(GTK_EVENT_BOX(ebox), FALSE); |
| 10076 gtk_container_add(GTK_CONTAINER(ebox), gtkconv->tabby); | 10268 gtk_container_add(GTK_CONTAINER(ebox), gtkconv->tabby); |
| 10077 g_signal_connect(G_OBJECT(ebox), "enter-notify-event", | 10269 g_signal_connect(G_OBJECT(ebox), "enter-notify-event", |
| 10078 G_CALLBACK(gtkconv_tab_set_tip), gtkconv); | 10270 G_CALLBACK(gtkconv_tab_set_tip), gtkconv); |
| 10079 | 10271 |
| 10080 if (gtkconv->tab_label->parent == NULL) { | 10272 if (gtk_widget_get_parent(gtkconv->tab_label) == NULL) { |
| 10081 /* Pack if it's a new widget */ | 10273 /* Pack if it's a new widget */ |
| 10082 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), first, FALSE, FALSE, 0); | 10274 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), first, FALSE, FALSE, 0); |
| 10083 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), gtkconv->tab_label, TRUE, TRUE, 0); | 10275 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), gtkconv->tab_label, TRUE, TRUE, 0); |
| 10084 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), third, FALSE, FALSE, 0); | 10276 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), third, FALSE, FALSE, 0); |
| 10085 | 10277 |
| 10096 | 10288 |
| 10097 /* Reset the tabs label to the new version */ | 10289 /* Reset the tabs label to the new version */ |
| 10098 gtk_notebook_set_tab_label(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, ebox); | 10290 gtk_notebook_set_tab_label(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, ebox); |
| 10099 } | 10291 } |
| 10100 | 10292 |
| 10101 gtk_notebook_set_tab_label_packing(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, | 10293 g_object_set(G_OBJECT(win->notebook), "expand", !tabs_side && !angle, NULL); |
| 10102 !tabs_side && !angle, | |
| 10103 TRUE, GTK_PACK_START); | |
| 10104 | 10294 |
| 10105 if (pidgin_conv_window_get_gtkconv_count(win) == 1) | 10295 if (pidgin_conv_window_get_gtkconv_count(win) == 1) |
| 10106 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), | 10296 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), |
| 10107 purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/tabs") && | 10297 purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/tabs") && |
| 10108 (!purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/im/show_buddy_icons") || | 10298 (!purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/im/show_buddy_icons") || |
| 10122 { | 10312 { |
| 10123 unsigned int index; | 10313 unsigned int index; |
| 10124 | 10314 |
| 10125 index = gtk_notebook_page_num(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont); | 10315 index = gtk_notebook_page_num(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont); |
| 10126 | 10316 |
| 10317 #if GTK_CHECK_VERSION(2,10,0) | |
| 10318 g_object_ref_sink(G_OBJECT(gtkconv->tab_cont)); | |
| 10319 #else | |
| 10127 g_object_ref(gtkconv->tab_cont); | 10320 g_object_ref(gtkconv->tab_cont); |
| 10128 gtk_object_sink(GTK_OBJECT(gtkconv->tab_cont)); | 10321 gtk_object_sink(GTK_OBJECT(gtkconv->tab_cont)); |
| 10322 #endif | |
| 10129 | 10323 |
| 10130 gtk_notebook_remove_page(GTK_NOTEBOOK(win->notebook), index); | 10324 gtk_notebook_remove_page(GTK_NOTEBOOK(win->notebook), index); |
| 10131 | 10325 |
| 10132 win->gtkconvs = g_list_remove(win->gtkconvs, gtkconv); | 10326 win->gtkconvs = g_list_remove(win->gtkconvs, gtkconv); |
| 10133 | 10327 |
| 10206 gdkwin = gdk_window_get_toplevel(gdkwin); | 10400 gdkwin = gdk_window_get_toplevel(gdkwin); |
| 10207 | 10401 |
| 10208 for (l = pidgin_conv_windows_get_list(); l != NULL; l = l->next) { | 10402 for (l = pidgin_conv_windows_get_list(); l != NULL; l = l->next) { |
| 10209 win = l->data; | 10403 win = l->data; |
| 10210 | 10404 |
| 10211 if (gdkwin == win->window->window) | 10405 if (gdkwin == gtk_widget_get_window(win->window)) |
| 10212 return win; | 10406 return win; |
| 10213 } | 10407 } |
| 10214 | 10408 |
| 10215 return NULL; | 10409 return NULL; |
| 10216 } | 10410 } |
| 10328 { | 10522 { |
| 10329 int x, y; | 10523 int x, y; |
| 10330 PurpleConversationType type = purple_conversation_get_type(conv->active_conv); | 10524 PurpleConversationType type = purple_conversation_get_type(conv->active_conv); |
| 10331 GList *all; | 10525 GList *all; |
| 10332 | 10526 |
| 10333 if (GTK_WIDGET_VISIBLE(w)) | 10527 if (gtk_widget_get_visible(w)) |
| 10334 gtk_window_get_position(GTK_WINDOW(w), &x, &y); | 10528 gtk_window_get_position(GTK_WINDOW(w), &x, &y); |
| 10335 else | 10529 else |
| 10336 return FALSE; /* carry on normally */ | 10530 return FALSE; /* carry on normally */ |
| 10337 | 10531 |
| 10338 /* Workaround for GTK+ bug # 169811 - "configure_event" is fired | 10532 /* Workaround for GTK+ bug # 169811 - "configure_event" is fired |
| 10339 * when the window is being maximized */ | 10533 * when the window is being maximized */ |
| 10340 if (gdk_window_get_state(w->window) & GDK_WINDOW_STATE_MAXIMIZED) | 10534 if (gdk_window_get_state(gtk_widget_get_window(w)) & GDK_WINDOW_STATE_MAXIMIZED) |
| 10341 return FALSE; | 10535 return FALSE; |
| 10342 | 10536 |
| 10343 /* don't save off-screen positioning */ | 10537 /* don't save off-screen positioning */ |
| 10344 if (x + event->width < 0 || | 10538 if (x + event->width < 0 || |
| 10345 y + event->height < 0 || | 10539 y + event->height < 0 || |