Я хочу добавить произвольный элемент в меню Pidgin. Пусть это будет Друзья → Показать → Группы. Я хочу, чтобы это была кнопка-флажок (например, Друзья → Показать → Пустые группы) со связанной настраиваемой функцией. Как я могу это сделать?
Как добавить элемент в меню пиджин
Ответы (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"));
Добавление предпочтения "/blist/show_groups"
, а также добавление к нему обратного вызова объясняется в Как сделать Я добавляю пользовательские настройки в Pidgin?. Чтобы проверить ваши изменения, скомпилируйте и установите 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
Пиджин-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'/>"
Затем следуйте инструкциям из этого ответа, пропуская самый первый.