Как добавить элемент в меню пиджин

Я хочу добавить произвольный элемент в меню Pidgin. Пусть это будет Друзья → Показать → Группы. Я хочу, чтобы это была кнопка-флажок (например, Друзья → Показать → Пустые группы) со связанной настраиваемой функцией. Как я могу это сделать?


person Danatela    schedule 30.04.2014    source источник


Ответы (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
person Danatela    schedule 30.04.2014

Пиджин-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'/>"

Затем следуйте инструкциям из этого ответа, пропуская самый первый.

person Danatela    schedule 30.04.2014