I want to add arbitrary item to Pidgin menu. Let it be Buddies → Show → Groups. I want it to be checkbutton (like Buddies → Show → Empty Groups) with custom function associated. How can I do this?
2 回答
以下示例适用于 Pidgin 版本 2.10.9。我相信 3.0.0(当前的开发分支)没有太多变化,所以它也将适用于那里,只需最少的修改。
首先,下载 Pidgin 源码。在 Ubuntu 中,这只需运行即可完成
apt-get source pidgin
它将获取 libpurple、pidgin 和 finch 源。然后进去pidgin-2.10.9/pidgin/gtkblist.c
找线
static GtkItemFactoryEntry blist_menu[] =
在那里你会看到文本中的 Gtk 菜单。添加以下行:
{ N_("/Buddies/Show/_Groups"), NULL, pidgin_blist_show_groups_cb, 1, "<CheckItem>", NULL },
后
{ N_("/Buddies/Show/_Empty Groups"), NULL, pidgin_blist_show_empty_groups_cb, 1, "<CheckItem>", NULL },
您可以看到添加的行只是添加后的模拟。第三个数组成员是负责更新菜单项状态的函数。
接下来,添加您刚刚指定的函数,pidgin_blist_show_groups_cb
. 你可以找到pidgin_blist_show_empty_groups_cb
并复制它的内容。
static void pidgin_blist_show_groups_cb(gpointer data, guint action, GtkWidget *item)
{
pidgin_set_cursor(gtkblist->window, GDK_WATCH);
purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/blist/show_groups",
gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item)));
pidgin_clear_cursor(gtkblist->window);
}
此外,您需要在启动时设置项目状态。查找功能
static void pidgin_blist_show(PurpleBuddyList *list)
并添加
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item (gtkblist->ift, N_("/Buddies/Show/Groups"))),
purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/blist/show_groups"));
后
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item (gtkblist->ift, N_("/Buddies/Show/Empty Groups"))),
purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/blist/show_empty_groups"));
如何将自定义首选项添加到Pidgin "/blist/show_groups"
?. 要测试您的更改,请编译并安装 pidgin:
sudo apt-get build-dep pidgin
cd pidgin-2.10.9/
fakeroot debian/rules binary
sudo dpkg -i ../pidgin_2.10.9-0ubuntu3.deb
Pidgin-3.0.0
Pidgin 在 3.0.0 版本中生成菜单的方式发生了一些变化。首先,有新的数组GtkToggleActionEntry blist_menu_toggle_entries[]
。你需要在那里添加
{ "ShowGroups", NULL, N_("_Groups"), NULL, NULL, G_CALLBACK(pidgin_blist_show_groups_cb), FALSE },
后
{ "ShowEmptyGroups", NULL, N_("_Empty Groups"), NULL, NULL, G_CALLBACK(pidgin_blist_show_empty_groups_cb), FALSE },
而且,有static const char *blist_menu
. 您需要添加
"<menuitem action='ShowGroups'/>"
后
"<menuitem action='ShowEmptyGroups'/>"
然后按照此答案中的说明跳过第一个。