pidgin/gtkconv.c

branch
cpw.qulogic.gtk3
changeset 32375
9ccb07c70f2a
parent 29694
4efd5d82fef3
parent 32368
b7d8f3cef3b1
child 32378
bdfcbacbeb2b
--- a/pidgin/gtkconv.c	Fri Feb 19 05:26:00 2010 +0000
+++ b/pidgin/gtkconv.c	Fri Feb 19 07:07:09 2010 +0000
@@ -160,7 +160,9 @@
 static void gtkconv_set_unseen(PidginConversation *gtkconv, PidginUnseenState state);
 static void update_typing_icon(PidginConversation *gtkconv);
 static void update_typing_message(PidginConversation *gtkconv, const char *message);
+#if !GTK_CHECK_VERSION(2,6,0)
 static const char *item_factory_translate_func (const char *path, gpointer func_data);
+#endif
 gboolean pidgin_conv_has_focus(PurpleConversation *conv);
 static GdkColor* generate_nick_colors(guint *numcolors, GdkColor background);
 static gboolean color_is_visible(GdkColor foreground, GdkColor background, int color_contrast, int brightness_contrast);
@@ -971,7 +973,11 @@
 }
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_new_conv_cb(GtkAction *action, gpointer data)
+#else
 menu_new_conv_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	pidgin_dialogs_im();
 }
@@ -1018,7 +1024,11 @@
  * plaintext v. HTML file.
  */
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_save_as_cb(GtkAction *action, gpointer data)
+#else
 menu_save_as_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *win = data;
 	PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
@@ -1048,7 +1058,11 @@
 }
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_view_log_cb(GtkAction *action, gpointer data)
+#else
 menu_view_log_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *win = data;
 	PurpleConversation *conv;
@@ -1075,7 +1089,9 @@
 	gdk_window_set_cursor(gtkblist->window->window, cursor);
 	gdk_window_set_cursor(win->window->window, cursor);
 	gdk_cursor_unref(cursor);
+#if GTK_CHECK_VERSION(2,4,0) && !GTK_CHECK_VERSION(2,6,0) //FIXME: What?
 	gdk_display_flush(gdk_drawable_get_display(GDK_DRAWABLE(widget->window)));
+#endif
 
 	name = purple_conversation_get_name(conv);
 	account = purple_conversation_get_account(conv);
@@ -1102,7 +1118,11 @@
 }
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_clear_cb(GtkAction *action, gpointer data)
+#else
 menu_clear_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *win = data;
 	PurpleConversation *conv;
@@ -1112,7 +1132,11 @@
 }
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_find_cb(GtkAction *action, gpointer data)
+#else
 menu_find_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *gtkwin = data;
 	PidginConversation *gtkconv = pidgin_conv_window_get_active_gtkconv(gtkwin);
@@ -1122,6 +1146,21 @@
 
 #ifdef USE_VV
 static void 
+#if GTK_CHECK_VERSION(2,6,0)
+menu_initiate_media_call_cb(GtkAction *action, gpointer data)
+{
+	PidginWindow *win = (PidginWindow *)data;
+	PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
+	PurpleAccount *account = purple_conversation_get_account(conv);
+
+	purple_prpl_initiate_media(account,
+			purple_conversation_get_name(conv),
+			action == win->audio_call ? PURPLE_MEDIA_AUDIO :
+			action == win->video_call ? PURPLE_MEDIA_VIDEO :
+			action == win->audio_video_call ? PURPLE_MEDIA_AUDIO |
+			PURPLE_MEDIA_VIDEO : PURPLE_MEDIA_NONE);
+}
+#else
 menu_initiate_media_call_cb(gpointer data, guint action, GtkWidget *widget)
 {
 	PidginWindow *win = (PidginWindow *)data;
@@ -1136,9 +1175,14 @@
 			PURPLE_MEDIA_VIDEO : PURPLE_MEDIA_NONE);
 }
 #endif
-
-static void
+#endif
+
+static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_send_file_cb(GtkAction *action, gpointer data)
+#else
 menu_send_file_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *win = data;
 	PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
@@ -1150,7 +1194,11 @@
 }
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_get_attention_cb(GtkAction *ation, gpointer data)
+#else
 menu_get_attention_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *win = data;
 	PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
@@ -1162,7 +1210,11 @@
 }
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_add_pounce_cb(GtkAction *action, gpointer data)
+#else
 menu_add_pounce_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *win = data;
 	PurpleConversation *conv;
@@ -1174,7 +1226,11 @@
 }
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_insert_link_cb(GtkAction *action, gpointer data)
+#else
 menu_insert_link_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *win = data;
 	PidginConversation *gtkconv;
@@ -1188,7 +1244,11 @@
 }
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_insert_image_cb(GtkAction *action, gpointer data)
+#else
 menu_insert_image_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *win = data;
 	PurpleConversation *conv;
@@ -1205,7 +1265,11 @@
 
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_alias_cb(GtkAction *action, gpointer data)
+#else
 menu_alias_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *win = data;
 	PurpleConversation *conv;
@@ -1232,7 +1296,11 @@
 }
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_get_info_cb(GtkAction *action, gpointer data)
+#else
 menu_get_info_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *win = data;
 	PurpleConversation *conv;
@@ -1243,7 +1311,11 @@
 }
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_invite_cb(GtkAction *action, gpointer data)
+#else
 menu_invite_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *win = data;
 	PurpleConversation *conv;
@@ -1254,7 +1326,11 @@
 }
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_block_cb(GtkAction *action, gpointer data)
+#else
 menu_block_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *win = data;
 	PurpleConversation *conv;
@@ -1265,7 +1341,11 @@
 }
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_unblock_cb(GtkAction *action, gpointer data)
+#else
 menu_unblock_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *win = data;
 	PurpleConversation *conv;
@@ -1276,7 +1356,11 @@
 }
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_add_remove_cb(GtkAction *action, gpointer data)
+#else
 menu_add_remove_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *win = data;
 	PurpleConversation *conv;
@@ -1321,7 +1405,11 @@
 }
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_close_conv_cb(GtkAction *action, gpointer data)
+#else
 menu_close_conv_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *win = data;
 
@@ -1329,7 +1417,11 @@
 }
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_logging_cb(GtkAction *action, gpointer data)
+#else
 menu_logging_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *win = data;
 	PurpleConversation *conv;
@@ -1341,7 +1433,11 @@
 	if (conv == NULL)
 		return;
 
+#if GTK_CHECK_VERSION(2,6,0)
+	logging = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action));
+#else
 	logging = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
+#endif
 
 	if (logging == purple_conversation_is_logging(conv))
 		return;
@@ -1394,14 +1490,26 @@
 }
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_toolbar_cb(GtkAction *action, gpointer data)
+{
+	purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/conversations/show_formatting_toolbar",
+	                    gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)));
+}
+#else
 menu_toolbar_cb(gpointer data, guint action, GtkWidget *widget)
 {
 	purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/conversations/show_formatting_toolbar",
 	                    gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)));
 }
-
-static void
+#endif
+
+static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_sounds_cb(GtkAction *action, gpointer data)
+#else
 menu_sounds_cb(gpointer data, guint action, GtkWidget *widget)
+#endif
 {
 	PidginWindow *win = data;
 	PurpleConversation *conv;
@@ -1416,18 +1524,30 @@
 	gtkconv = PIDGIN_CONVERSATION(conv);
 
 	gtkconv->make_sound =
+#if GTK_CHECK_VERSION(2,6,0)
+		gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action));
+#else
 		gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
+#endif
 	node = get_conversation_blist_node(conv);
 	if (node)
 		purple_blist_node_set_bool(node, "gtk-mute-sound", !gtkconv->make_sound);
 }
 
 static void
+#if GTK_CHECK_VERSION(2,6,0)
+menu_timestamps_cb(GtkAction *action, gpointer data)
+{
+	purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/conversations/show_timestamps",
+		gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)));
+}
+#else
 menu_timestamps_cb(gpointer data, guint action, GtkWidget *widget)
 {
 	purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/conversations/show_timestamps",
 		gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)));
 }
+#endif
 
 static void
 chat_do_im(PidginConversation *gtkconv, const char *who)
@@ -2234,8 +2354,13 @@
 	purple_conversation_close_logs(old_conv);
 	gtkconv->active_conv = conv;
 
+#if GTK_CHECK_VERSION(2,6,0)
+	purple_conversation_set_logging(conv,
+		gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(gtkconv->win->menu.logging)));
+#else
 	purple_conversation_set_logging(conv,
 		gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(gtkconv->win->menu.logging)));
+#endif
 
 	entry = GTK_IMHTML(gtkconv->entry);
 	protocol_name = purple_account_get_protocol_name(conv->account);
@@ -3058,6 +3183,101 @@
 	return gtkconv->win;
 }
 
+#if GTK_CHECK_VERSION(2,6,0)
+
+static GtkActionEntry menu_entries[] =
+/* TODO: fill out tooltips... */
+{
+	/* Conversation menu */
+	{ "ConversationMenu", NULL, N_("_Conversation"), NULL, NULL, NULL },
+	{ "NewInstantMessage", PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW, N_("New Instant _Message..."), "<control>M", NULL, G_CALLBACK(menu_new_conv_cb) },
+	{ "Find", GTK_STOCK_FIND, N_("_Find..."), NULL, NULL, G_CALLBACK(menu_find_cb) },
+	{ "ViewLog", NULL, N_("View _Log"), NULL, NULL, G_CALLBACK(menu_view_log_cb) },
+	{ "SaveAs", GTK_STOCK_SAVE_AS, N_("_Save As..."), NULL, NULL, G_CALLBACK(menu_save_as_cb) },
+	{ "ClearScrollback", GTK_STOCK_CLEAR, N_("Clea_r Scrollback"), "<control>L", NULL, G_CALLBACK(menu_clear_cb) },
+
+#ifdef USE_VV
+	{ "MediaMenu", NULL, N_("M_edia"), NULL, NULL, NULL },
+	{ "AudioCall", PIDGIN_STOCK_TOOLBAR_AUDIO_CALL, N_("_Audio Call"), NULL, NULL, G_CALLBACK(menu_initiate_media_call_cb) },
+	{ "VideoCall", PIDGIN_STOCK_TOOLBAR_VIDEO_CALL, N_("_Video Call"), NULL, NULL, G_CALLBACK(menu_initiate_media_call_cb) },
+	{ "AudioVideoCall", PIDGIN_STOCK_TOOLBAR_VIDEO_CALL, N_("Audio\\/Video _Call"), NULL, NULL, G_CALLBACK(menu_initiate_media_call_cb) },
+#endif
+
+	{ "SendFile", PIDGIN_STOCK_TOOLBAR_SEND_FILE, N_("Se_nd File..."), NULL, NULL, G_CALLBACK(menu_send_file_cb) },
+	{ "GetAttention", PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION, N_("Get _Attention"), NULL, NULL, G_CALLBACK(menu_get_attention_cb) },
+	{ "AddBuddyPounce", NULL, N_("Add Buddy _Pounce..."), NULL, NULL, G_CALLBACK(menu_add_pounce_cb) },
+	{ "GetInfo", PIDGIN_STOCK_TOOLBAR_USER_INFO, N_("_Get Info"), "<control>O", NULL, G_CALLBACK(menu_get_info_cb) },
+	{ "Invite", NULL, N_("In_vite..."), NULL, NULL, G_CALLBACK(menu_invite_cb) },
+	{ "MoreMenu", NULL, N_("M_ore"), NULL, NULL, NULL },
+	{ "Alias", NULL, N_("Al_ias..."), NULL, NULL, G_CALLBACK(menu_alias_cb) },
+	{ "Block", PIDGIN_STOCK_TOOLBAR_BLOCK, N_("_Block..."), NULL, NULL, G_CALLBACK(menu_block_cb) },
+	{ "Unblock", PIDGIN_STOCK_TOOLBAR_UNBLOCK, N_("_Unblock..."), NULL, NULL, G_CALLBACK(menu_unblock_cb) },
+	{ "Add", GTK_STOCK_ADD, N_("_Add..."), NULL, NULL, G_CALLBACK(menu_add_remove_cb) },
+	{ "Remove", GTK_STOCK_REMOVE, N_("_Remove..."), NULL, NULL, G_CALLBACK(menu_add_remove_cb) },
+	{ "InsertLink", PIDGIN_STOCK_TOOLBAR_INSERT_LINK, N_("Insert Lin_k..."), NULL, NULL, G_CALLBACK(menu_insert_link_cb) },
+	{ "InsertImage", PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE, N_("Insert Imag_e..."), NULL, NULL, G_CALLBACK(menu_insert_image_cb) },
+	{ "Close", GTK_STOCK_CLOSE, N_("_Close"), NULL, NULL, G_CALLBACK(menu_close_conv_cb) },
+
+	/* Options */
+	{ "OptionsMenu", NULL, N_("_Options"), NULL, NULL, NULL },
+};
+
+/* Toggle items */
+static const GtkToggleActionEntry menu_toggle_entries[] = {
+	{ "EnableLogging", NULL, N_("Enable _Logging"), NULL, NULL, G_CALLBACK(menu_logging_cb), FALSE },
+	{ "EnableSounds", NULL, N_("Enable _Sounds"), NULL, NULL, G_CALLBACK(menu_sounds_cb), FALSE },
+	{ "ShowFormattingToolbars", NULL, N_("Show Formatting _Toolbars"), NULL, NULL, G_CALLBACK(menu_toolbar_cb), FALSE },
+	{ "ShowTimestamps", NULL, N_("Show Ti_mestamps"), NULL, NULL, G_CALLBACK(menu_timestamps_cb), FALSE },
+};
+
+static const char *conversation_menu =
+"<ui>"
+	"<menubar name='Conversation'>"
+		"<menu action='ConversationMenu'>"
+			"<menuitem action='NewInstantMessage'/>"
+			"<separator/>"
+			"<menuitem action='Find'/>"
+			"<menuitem action='ViewLog'/>"
+			"<menuitem action='SaveAs'/>"
+			"<menuitem action='ClearScrollback'/>"
+			"<separator/>"
+#ifdef USE_VV
+			"<menu action='MediaMenu'>"
+				"<menuitem action='AudioCall'/>"
+				"<menuitem action='VideoCall'/>"
+				"<menuitem action='AudioVideoCall'/>"
+			"</menu>"
+#endif
+			"<menuitem action='SendFile'/>"
+			"<menuitem action='GetAttention'/>"
+			"<menuitem action='AddBuddyPounce'/>"
+			"<menuitem action='GetInfo'/>"
+			"<menuitem action='Invite'/>"
+			"<menu action='MoreMenu'/>"
+			"<separator/>"
+			"<menuitem action='Alias'/>"
+			"<menuitem action='Block'/>"
+			"<menuitem action='Unblock'/>"
+			"<menuitem action='Add'/>"
+			"<menuitem action='Remove'/>"
+			"<separator/>"
+			"<menuitem action='InsertLink'/>"
+			"<menuitem action='InsertImage'/>"
+			"<separator/>"
+			"<menuitem action='Close'/>"
+		"</menu>"
+		"<menu action='OptionsMenu'>"
+			"<menuitem action='EnableLogging'/>"
+			"<menuitem action='EnableSounds'/>"
+			"<separator/>"
+			"<menuitem action='ShowFormattingToolbars'/>"
+			"<menuitem action='ShowTimestamps'/>"
+		"</menu>"
+	"</menubar>"
+"</ui>";
+
+#else
+
 static GtkItemFactoryEntry menu_items[] =
 {
 	/* Conversation menu */
@@ -3144,6 +3364,8 @@
 	return _(path);
 }
 
+#endif
+
 static void
 sound_method_pref_changed_cb(const char *name, PurplePrefType type,
 							 gconstpointer value, gpointer data)
@@ -3153,19 +3375,31 @@
 
 	if (!strcmp(method, "none"))
 	{
+#if GTK_CHECK_VERSION(2,6,0)
+		gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(win->menu.sounds),
+		                             FALSE);
+		gtk_action_set_sensitive(win->menu.sounds, FALSE);
+#else
 		gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.sounds),
 		                               FALSE);
 		gtk_widget_set_sensitive(win->menu.sounds, FALSE);
+#endif
 	}
 	else
 	{
 		PidginConversation *gtkconv = pidgin_conv_window_get_active_gtkconv(win);
 
+#if GTK_CHECK_VERSION(2,6,0)
+		if (gtkconv != NULL)
+			gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(win->menu.sounds),
+			                             gtkconv->make_sound);
+		gtk_action_set_sensitive(win->menu.sounds, TRUE);
+#else
 		if (gtkconv != NULL)
 			gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.sounds),
 			                               gtkconv->make_sound);
 		gtk_widget_set_sensitive(win->menu.sounds, TRUE);
-
+#endif
 	}
 }
 
@@ -3293,6 +3527,17 @@
 				purple_prpl_get_media_caps(account,
 				purple_conversation_get_name(conv));
 
+#if GTK_CHECK_VERSION(2,6,0)
+		gtk_action_set_sensitive(win->audio_call,
+				caps & PURPLE_MEDIA_CAPS_AUDIO
+				? TRUE : FALSE);
+		gtk_action_set_sensitive(win->video_call,
+				caps & PURPLE_MEDIA_CAPS_VIDEO
+				? TRUE : FALSE);
+		gtk_action_set_sensitive(win->audio_video_call, 
+				caps & PURPLE_MEDIA_CAPS_AUDIO_VIDEO
+				? TRUE : FALSE);
+#else
 		gtk_widget_set_sensitive(win->audio_call,
 				caps & PURPLE_MEDIA_CAPS_AUDIO
 				? TRUE : FALSE);
@@ -3302,16 +3547,29 @@
 		gtk_widget_set_sensitive(win->audio_video_call, 
 				caps & PURPLE_MEDIA_CAPS_AUDIO_VIDEO
 				? TRUE : FALSE);
+#endif
 	} else if (purple_conversation_get_type(conv)
 			== PURPLE_CONV_TYPE_CHAT) {
 		/* for now, don't care about chats... */
+#if GTK_CHECK_VERSION(2,6,0)
+		gtk_action_set_sensitive(win->audio_call, FALSE);
+		gtk_action_set_sensitive(win->video_call, FALSE);
+		gtk_action_set_sensitive(win->audio_video_call, FALSE);
+#else
 		gtk_widget_set_sensitive(win->audio_call, FALSE);
 		gtk_widget_set_sensitive(win->video_call, FALSE);
 		gtk_widget_set_sensitive(win->audio_video_call, FALSE);
+#endif
 	} else {
+#if GTK_CHECK_VERSION(2,6,0)
+		gtk_action_set_sensitive(win->audio_call, FALSE);
+		gtk_action_set_sensitive(win->video_call, FALSE);
+		gtk_action_set_sensitive(win->audio_video_call, FALSE);
+#else
 		gtk_widget_set_sensitive(win->audio_call, FALSE);
 		gtk_widget_set_sensitive(win->video_call, FALSE);
 		gtk_widget_set_sensitive(win->audio_video_call, FALSE);
+#endif
 	}							
 #endif
 }
@@ -3319,6 +3577,8 @@
 static void
 regenerate_options_items(PidginWindow *win)
 {
+#if GTK_CHECK_VERSION(2,6,0)
+#else
 	GtkWidget *menu;
 	PidginConversation *gtkconv;
 	GList *list;
@@ -3342,6 +3602,7 @@
 	}
 
 	gtk_widget_show_all(menu);
+#endif
 }
 
 static void
@@ -3355,6 +3616,8 @@
 static void
 regenerate_plugins_items(PidginWindow *win)
 {
+#if GTK_CHECK_VERSION(2,6,0)
+#else
 	GList *action_items;
 	GtkWidget *menu;
 	GList *list;
@@ -3396,8 +3659,10 @@
 		g_signal_connect(G_OBJECT(item), "destroy", G_CALLBACK(remove_from_list), win);
 	}
 	g_object_set_data(G_OBJECT(win->window), "plugin-actions", action_items);
-}
-
+#endif
+}
+
+#if !GTK_CHECK_VERSION(2,6,0)
 static void menubar_activated(GtkWidget *item, gpointer data)
 {
 	PidginWindow *win = data;
@@ -3421,12 +3686,146 @@
 	g_signal_handlers_disconnect_by_func(G_OBJECT(win->menu.menubar),
 				G_CALLBACK(focus_out_from_menubar), win);
 }
+#endif
 
 static GtkWidget *
 setup_menubar(PidginWindow *win)
 {
 	GtkAccelGroup *accel_group;
 	const char *method;
+
+#if GTK_CHECK_VERSION(2,6,0)
+	GtkActionGroup *action_group;
+	GError *error;
+
+	action_group = gtk_action_group_new("ConversationActions");
+	gtk_action_group_add_actions(action_group,
+	                             menu_entries,
+	                             G_N_ELEMENTS(menu_entries),
+	                             win);
+	gtk_action_group_add_toggle_actions(action_group,
+	                                    menu_toggle_entries,
+	                                    G_N_ELEMENTS(menu_toggle_entries),
+	                                    win);
+#ifdef ENABLE_NLS
+	gtk_action_group_set_translation_domain(action_group,
+	                                        PACKAGE);
+#endif
+
+	win->menu.ui = gtk_ui_manager_new();
+	gtk_ui_manager_insert_action_group(win->menu.ui, action_group, 0);
+
+	accel_group = gtk_ui_manager_get_accel_group(win->menu.ui);
+	gtk_window_add_accel_group(GTK_WINDOW(win->window), accel_group);
+	g_signal_connect(G_OBJECT(accel_group), "accel-changed",
+	                 G_CALLBACK(pidgin_save_accels_cb), NULL);
+
+	error = NULL;
+	if (!gtk_ui_manager_add_ui_from_string(win->menu.ui, conversation_menu, -1, &error))
+	{
+		g_message("building menus failed: %s", error->message);
+		g_error_free(error);
+		exit(EXIT_FAILURE);
+	}
+
+	win->menu.menubar =
+		gtk_ui_manager_get_widget(win->menu.ui, "/Conversation");
+
+	win->menu.view_log =
+		gtk_ui_manager_get_action(win->menu.ui,
+		                          "/Conversation/ConversationMenu/ViewLog");
+
+#ifdef USE_VV
+	win->audio_call =
+		gtk_ui_manager_get_action(win->menu.ui,
+					    "/Conversation/ConversationMenu/MediaMenu/AudioCall");
+	win->video_call =
+		gtk_ui_manager_get_action(win->menu.ui,
+					    "/Conversation/ConversationMenu/MediaMenu/VideoCall");
+	win->audio_video_call =
+		gtk_ui_manager_get_action(win->menu.ui,
+					    "/Conversation/ConversationMenu/MediaMenu/AudioVideoCall");
+#endif
+	
+	/* --- */
+
+	win->menu.send_file =
+		gtk_ui_manager_get_action(win->menu.ui,
+		                          "/Conversation/ConversationMenu/SendFile");
+
+	win->menu.add_pounce =
+		gtk_ui_manager_get_action(win->menu.ui,
+		                          "/Conversation/ConversationMenu/AddBuddyPounce");
+
+	/* --- */
+
+	win->menu.get_info =
+		gtk_ui_manager_get_action(win->menu.ui,
+		                          "/Conversation/ConversationMenu/GetInfo");
+
+	win->menu.invite =
+		gtk_ui_manager_get_action(win->menu.ui,
+		                          "/Conversation/ConversationMenu/Invite");
+
+	/* --- */
+
+	win->menu.alias =
+		gtk_ui_manager_get_action(win->menu.ui,
+		                          "/Conversation/ConversationMenu/Alias");
+
+	win->menu.block =
+		gtk_ui_manager_get_action(win->menu.ui,
+		                          "/Conversation/ConversationMenu/Block");
+
+	win->menu.unblock =
+		gtk_ui_manager_get_action(win->menu.ui,
+					    "/Conversation/ConversationMenu/Unblock");
+
+	win->menu.add =
+		gtk_ui_manager_get_action(win->menu.ui,
+		                          "/Conversation/ConversationMenu/Add");
+
+	win->menu.remove =
+		gtk_ui_manager_get_action(win->menu.ui,
+		                          "/Conversation/ConversationMenu/Remove");
+
+	/* --- */
+
+	win->menu.insert_link =
+		gtk_ui_manager_get_action(win->menu.ui,
+				"/Conversation/ConversationMenu/InsertLink");
+
+	win->menu.insert_image =
+		gtk_ui_manager_get_action(win->menu.ui,
+				"/Conversation/ConversationMenu/InsertImage");
+
+	/* --- */
+
+	win->menu.logging =
+		gtk_ui_manager_get_action(win->menu.ui,
+		                          "/Conversation/OptionsMenu/EnableLogging");
+	win->menu.sounds =
+		gtk_ui_manager_get_action(win->menu.ui,
+		                          "/Conversation/OptionsMenu/EnableSounds");
+	method = purple_prefs_get_string(PIDGIN_PREFS_ROOT "/sound/method");
+	if (method != NULL && !strcmp(method, "none"))
+	{
+		gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(win->menu.sounds),
+		                               FALSE);
+		gtk_action_set_sensitive(win->menu.sounds, FALSE);
+	}
+	purple_prefs_connect_callback(win, PIDGIN_PREFS_ROOT "/sound/method",
+				    sound_method_pref_changed_cb, win);
+
+	win->menu.show_formatting_toolbar =
+		gtk_ui_manager_get_action(win->menu.ui,
+		                          "/Conversation/OptionsMenu/ShowFormattingToolbars");
+	win->menu.show_timestamps =
+		gtk_ui_manager_get_action(win->menu.ui,
+		                          "/Conversation/OptionsMenu/ShowTimestamps");
+	win->menu.show_icon = NULL;
+
+#else
 	GtkWidget *menuitem;
 
 	accel_group = gtk_accel_group_new ();
@@ -3551,6 +3950,8 @@
 		                            N_("/Options/Show Timestamps"));
 	win->menu.show_icon = NULL;
 
+#endif
+
 	win->menu.tray = pidgin_menu_tray_new();
 	gtk_menu_shell_append(GTK_MENU_SHELL(win->menu.menubar),
 	                      win->menu.tray);
@@ -3732,7 +4133,8 @@
 	if (!(b = purple_find_buddy(account, conv->name)))
 		return FALSE;
 
-
+#if GTK_CHECK_VERSION(2,6,0)
+#else
 	gtk_widget_show(win->menu.send_to);
 
 	menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(win->menu.send_to));
@@ -3754,6 +4156,7 @@
 			break;
 		}
 	}
+#endif
 
 	return FALSE;
 }
@@ -3863,6 +4266,8 @@
 static void
 generate_send_to_items(PidginWindow *win)
 {
+#if GTK_CHECK_VERSION(2,6,0)
+#else
 	GtkWidget *menu;
 	GSList *group = NULL;
 	GtkSizeGroup *sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
@@ -3947,6 +4352,7 @@
 	if (!group)
 		gtk_widget_set_sensitive(win->menu.send_to, FALSE);
 	update_send_to_selection(win);
+#endif
 }
 
 static const char *
@@ -5375,7 +5781,9 @@
 	gtkconv->send_history = g_list_append(NULL, NULL);
 
 	/* Setup some initial variables. */
+#if !GTK_CHECK_VERSION(2,12,0)
 	gtkconv->tooltips = gtk_tooltips_new();
+#endif
 	gtkconv->unseen_state = PIDGIN_UNSEEN_NONE;
 	gtkconv->unseen_count = 0;
 
@@ -5578,7 +5986,9 @@
 		g_free(gtkconv->u.chat);
 	}
 
+#if !GTK_CHECK_VERSION(2,12,0)
 	gtk_object_sink(GTK_OBJECT(gtkconv->tooltips));
+#endif
 
 	gtkconv->send_history = g_list_first(gtkconv->send_history);
 	g_list_foreach(gtkconv->send_history, (GFunc)g_free, NULL);
@@ -6493,6 +6903,16 @@
 	gtk_imhtml_append_text(GTK_IMHTML(gtkconv->entry), message, 0);
 }
 
+/* Mask functions with ones from newer GTK+ */
+#if GTK_CHECK_VERSION(2,6,0)
+#define gtk_widget_set_sensitive_ gtk_widget_set_sensitive
+#define gtk_widget_show_ gtk_widget_show
+#define gtk_widget_hide_ gtk_widget_hide
+#define gtk_widget_set_sensitive gtk_action_set_sensitive
+#define gtk_widget_show(x) gtk_action_set_visible((x), TRUE)
+#define gtk_widget_hide(x) gtk_action_set_visible((x), FALSE)
+#endif
+
 /*
  * Makes sure all the menu items and all the buttons are hidden/shown and
  * sensitive/insensitive.  This is called after changing tabs and when an
@@ -6702,6 +7122,17 @@
 	}
 }
 
+/* Restore the functions */
+#if GTK_CHECK_VERSION(2,6,0)
+#undef gtk_widget_set_sensitive
+#undef gtk_widget_show
+#undef gtk_widget_hide
+
+#define gtk_widget_set_sensitive gtk_widget_set_sensitive_
+#define gtk_widget_show gtk_widget_show_
+#define gtk_widget_hide gtk_widget_hide_
+#endif
+
 static void
 pidgin_conv_update_fields(PurpleConversation *conv, PidginConvFields fields)
 {
@@ -6750,8 +7181,13 @@
 			topic = purple_conv_chat_get_topic(chat);
 
 			gtk_entry_set_text(GTK_ENTRY(gtkchat->topic_text), topic ? topic : "");
+#if GTK_CHECK_VERSION(2,12,0)
+			gtk_widget_set_tooltip_text(gtkchat->topic_text,
+			                            topic ? topic : "");
+#else
 			gtk_tooltips_set_tip(gtkconv->tooltips, gtkchat->topic_text,
 			                     topic ? topic : "", NULL);
+#endif
 		}
 	}
 
@@ -7353,9 +7789,15 @@
 		gtkconv = PIDGIN_CONVERSATION(conv);
 		win     = gtkconv->win;
 
+#if GTK_CHECK_VERSION(2,6,0)
+		gtk_toggle_action_set_active(
+		        GTK_TOGGLE_ACTION(win->menu.show_timestamps),
+		        (gboolean)GPOINTER_TO_INT(value));
+#else
 		gtk_check_menu_item_set_active(
 		        GTK_CHECK_MENU_ITEM(win->menu.show_timestamps),
 		        (gboolean)GPOINTER_TO_INT(value));
+#endif
 
 		gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml),
 			(gboolean)GPOINTER_TO_INT(value));
@@ -7381,9 +7823,15 @@
 		gtkconv = PIDGIN_CONVERSATION(conv);
 		win     = gtkconv->win;
 
+#if GTK_CHECK_VERSION(2,6,0)
+		gtk_toggle_action_set_active(
+		        GTK_TOGGLE_ACTION(win->menu.show_formatting_toolbar),
+		        (gboolean)GPOINTER_TO_INT(value));
+#else
 		gtk_check_menu_item_set_active(
 		        GTK_CHECK_MENU_ITEM(win->menu.show_formatting_toolbar),
 		        (gboolean)GPOINTER_TO_INT(value));
+#endif
 
 		if ((gboolean)GPOINTER_TO_INT(value))
 			gtk_widget_show(gtkconv->toolbar);
@@ -8639,6 +9087,8 @@
 		/* Right click was pressed. Popup the context menu. */
 		GtkWidget *menu = gtk_menu_new(), *sub;
 		gboolean populated = populate_menu_with_options(menu, gtkconv, TRUE);
+#if GTK_CHECK_VERSION(2,6,0)
+#else
 		sub = gtk_menu_item_get_submenu(GTK_MENU_ITEM(gtkconv->win->menu.send_to));
 
 		if (sub && GTK_WIDGET_IS_SENSITIVE(gtkconv->win->menu.send_to)) {
@@ -8653,7 +9103,7 @@
 			gtk_widget_destroy(menu);
 			return FALSE;
 		}
-
+#endif
 		gtk_widget_show_all(menu);
 		gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, e->button, e->time);
 		return TRUE;
@@ -9161,8 +9611,13 @@
 
 	/* Update the menubar */
 
+#if GTK_CHECK_VERSION(2,6,0)
+	gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(gtkconv->win->menu.logging),
+	                             purple_conversation_is_logging(conv));
+#else
 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtkconv->win->menu.logging),
 	                               purple_conversation_is_logging(conv));
+#endif
 
 	generate_send_to_items(win);
 	regenerate_options_items(win);
@@ -9171,6 +9626,17 @@
 	pidgin_conv_switch_active_conversation(conv);
 
 	sound_method = purple_prefs_get_string(PIDGIN_PREFS_ROOT "/sound/method");
+#if GTK_CHECK_VERSION(2,6,0)
+	if (strcmp(sound_method, "none") != 0)
+		gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(win->menu.sounds),
+		                             gtkconv->make_sound);
+
+	gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(win->menu.show_formatting_toolbar),
+	                             purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/show_formatting_toolbar"));
+
+	gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(win->menu.show_timestamps),
+	                             purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/show_timestamps"));
+#else
 	if (strcmp(sound_method, "none") != 0)
 		gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.sounds),
 		                               gtkconv->make_sound);
@@ -9180,6 +9646,7 @@
 
 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.show_timestamps),
 	                               purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/show_timestamps"));
+#endif
 
 	/*
 	 * We pause icons when they are not visible.  If this icon should
@@ -9429,7 +9896,11 @@
 	}
 	gtk_widget_destroy(win->window);
 
+#if GTK_CHECK_VERSION(2,6,0)
+	g_object_unref(G_OBJECT(win->menu.ui));
+#else
 	g_object_unref(G_OBJECT(win->menu.item_factory));
+#endif
 
 	purple_notify_close_with_handle(win);
 	purple_signals_disconnect_by_handle(win);
@@ -9507,8 +9978,12 @@
 
 	/* Close button. */
 	gtkconv->close = create_close_button();
+#if GTK_CHECK_VERSION(2,12,0)
+	gtk_widget_set_tooltip_text(gtkconv->close, _("Close conversation"));
+#else
 	gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->close,
 	                     _("Close conversation"), NULL);
+#endif
 
 	g_signal_connect(G_OBJECT(gtkconv->close), "button-press-event",
 			 G_CALLBACK(close_conv_cb), gtkconv);
@@ -9673,8 +10148,12 @@
 	conv_type = purple_conversation_get_type(gtkconv->active_conv);
 	index = gtk_notebook_page_num(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont);
 
+#if GTK_CHECK_VERSION(2,10,0)
+	g_object_ref_sink(G_OBJECT(gtkconv->tab_cont));
+#else
 	g_object_ref(gtkconv->tab_cont);
 	gtk_object_sink(GTK_OBJECT(gtkconv->tab_cont));
+#endif
 
 	gtk_notebook_remove_page(GTK_NOTEBOOK(win->notebook), index);
 

mercurial