В файле XML, определяющем контекстное меню, для каждого радио <menuitem>
задайте type="radio"
и свойству group
имя группы радиоэлементов, например:
<Root>
<popups>
<popup name="button3">
<menuitem name="Foo" verb="DoFoo" label="Foo is awesome" type="radio" group="mygroup"/>
<menuitem name="Bar" verb="DoBar" label="Bar is cool" type="radio" group="mygroup"/>
<menuitem name="Baz" verb="DoBaz" label="Baz rocks" type="radio" group="mygroup"/>
</popup>
</popups>
</Root>
Вы не настроили обработчики так, чтобы они реагировали на выбранные элементы так же, как обычные пункты меню. Вместо этого вы слушаете сигнал «ui-event» на BonoboUIComponent для меню:
BonoboUIComponent *component = panel_applet_get_popup_component (applet);
g_signal_connect (component, "ui-event", G_CALLBACK (popup_component_ui_event_cb), NULL);
/* ... */
static void
popup_component_ui_event_cb (BonoboUIComponent *component,
const gchar *path,
Bonobo_UIComponent_EventType type,
const gchar *state_string,
gpointer data)
{
}
path
будет полным путем (см. Ниже) элемента, по которому щелкнули. state_string
будет новым значением состояния элемента (см. Ниже). Для каждого щелчка радиоэлемента будет два события: одно для отмены выбора старого элемента и одно для выбора нового.
Чтобы манипулировать проверенным состоянием кнопок, используйте bonobo_ui_component_set_prop
, чтобы установить для свойства «state» значение «0» (не проверено) или «1» (проверено). Чтобы быть в безопасности, явно снимите отметку со старого значения; В некоторых угловых случаях вы можете в противном случае проверить несколько пунктов радио в одной и той же группе (особенно если контекстное меню еще не было нарисовано).
BonoboUIComponent *component = panel_applet_get_popup_component (applet);
bonobo_ui_component_set_prop (component, "/commands/Foo", "state", "1", NULL);
bonobo_ui_component_set_prop (component, "/commands/Bar", "state", "0", NULL);
bonobo_ui_component_set_prop (component, "/commands/Baz", "state", "0", NULL);
Обратите внимание, что вы идентифицируете радио-элемент по "/ commands / name", где name - это имя, которое вы дали элементу в XML-файле.
Вы могли бы аналогичным образом использовать bonobo_ui_component_get_prop
для поиска того, какой радиоэлемент проверен, но вам лучше использовать обработчики событий для определения, когда пользователь нажимает на него.
В общем, документация для BonoboUIComponent в libbonoboui должна содержать больше информации о способах манипулирования элементами в меню.