Радио-элементы в контекстном меню апплета панели GNOME - PullRequest
1 голос
/ 02 июля 2010

Есть ли способ поместить пункты меню радио в контекстное меню апплета панели GNOME, а затем контролировать, какой из элементов помечен как активный? Официальная документация менее чем полезна , и все апплеты, установленные на моем компьютере, используют обычные пункты меню, поэтому я не могу просмотреть их исходные коды.

1 Ответ

0 голосов
/ 03 июля 2010

В файле 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 должна содержать больше информации о способах манипулирования элементами в меню.

...