elm: Handle D-Bus menu registration error

If a menu registration results in error, fall back to local menu.

Patch by: Henrique Dante de Almeida <hdante@profusion.mobi>



SVN revision: 82960
This commit is contained in:
Henrique Dante de Almeida 2013-01-17 22:11:33 +00:00 committed by Bruno Dilly
parent 0591cf9cd9
commit aa512d1604
3 changed files with 56 additions and 15 deletions

View File

@ -50,6 +50,11 @@ enum
ELM_DBUS_SIGNAL_ITEM_ACTIVATION_REQUESTED,
};
typedef struct _Callback_Data {
void (*result_cb)(Eina_Bool, void *);
void *data;
} Callback_Data;
static Eina_Bool
_menu_add_recursive(Elm_DBus_Menu *dbus_menu, Elm_Menu_Item *item)
{
@ -72,6 +77,16 @@ _menu_add_recursive(Elm_DBus_Menu *dbus_menu, Elm_Menu_Item *item)
return EINA_TRUE;
}
static void
_app_register_cb(void *data, const EDBus_Message *msg,
EDBus_Pending *pending EINA_UNUSED)
{
Callback_Data *cd = data;
cd->result_cb(!edbus_message_error_get(msg, NULL, NULL), cd->data);
free(cd);
}
static Eina_Bool
_layout_idler(void *data)
{
@ -875,10 +890,12 @@ _elm_dbus_menu_unregister(Eo *obj)
}
void
_elm_dbus_menu_app_menu_register(Ecore_X_Window xid, Eo *obj)
_elm_dbus_menu_app_menu_register(Ecore_X_Window xid, Eo *obj,
void (*result_cb)(Eina_Bool, void *), void *data)
{
EDBus_Message *msg;
const char *obj_path;
Callback_Data *cd;
ELM_MENU_CHECK(obj);
ELM_MENU_DATA_GET(obj, sd);
@ -891,10 +908,14 @@ _elm_dbus_menu_app_menu_register(Ecore_X_Window xid, Eo *obj)
msg = edbus_message_method_call_new(REGISTRAR_NAME, REGISTRAR_PATH,
REGISTRAR_INTERFACE, "RegisterWindow");
cd = malloc(sizeof(Callback_Data));
cd->result_cb = result_cb;
cd->data = data;
obj_path = edbus_service_object_path_get(sd->dbus_menu->iface);
edbus_message_arguments_append(msg, "uo", (unsigned)xid,
obj_path);
edbus_connection_send(sd->dbus_menu->bus, msg, NULL, NULL, -1);
edbus_connection_send(sd->dbus_menu->bus, msg, _app_register_cb,
cd, -1);
sd->dbus_menu->xid = xid;
}

View File

@ -408,7 +408,9 @@ int _elm_dbus_menu_item_add(Elm_DBus_Menu *dbus_menu,
void _elm_dbus_menu_item_delete(Elm_DBus_Menu *dbus_menu,
int id);
void _elm_dbus_menu_app_menu_register(Ecore_X_Window xid, Eo *obj);
void _elm_dbus_menu_app_menu_register(Ecore_X_Window xid, Eo *obj,
void (*result_cb)(Eina_Bool, void *),
void *data);
void _elm_dbus_menu_app_menu_unregister(Eo *obj);
void _elm_dbus_menu_item_select_cb(Elm_Object_Item *obj_item);

View File

@ -3572,32 +3572,50 @@ elm_win_main_menu_get(const Evas_Object *obj)
return ret;
}
static void
_local_menu_set(Eo *obj)
{
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
edje_object_part_swallow(sd->layout, "elm.swallow.menu", sd->main_menu);
edje_object_signal_emit(sd->layout, "elm,action,show_menu", "elm");
_elm_menu_menu_bar_set(sd->main_menu, EINA_TRUE);
}
static void
_dbus_result_cb(Eina_Bool result, void *data)
{
if (!result)
{
ERR("D-Bus menu error. Using local menu");
_local_menu_set(data);
}
}
static void
_main_menu_get(Eo *obj, void *_pd, va_list *list)
{
Eo **ret = va_arg(*list, Eo **);
Elm_Win_Smart_Data *sd = _pd;
Eina_Bool use_dbus = EINA_FALSE;
if (sd->main_menu) goto end;
sd->main_menu = elm_menu_add(obj);
if (_elm_config->external_menu)
{
#ifdef HAVE_ELEMENTARY_X
if (sd->x.xwin)
{
_elm_dbus_menu_register(sd->main_menu);
_elm_dbus_menu_app_menu_register(sd->x.xwin, sd->main_menu);
}
if (_elm_config->external_menu && sd->x.xwin) use_dbus = EINA_TRUE;
#endif
if (use_dbus)
{
_elm_dbus_menu_register(sd->main_menu);
_elm_dbus_menu_app_menu_register(sd->x.xwin, sd->main_menu,
_dbus_result_cb, obj);
}
else
{
edje_object_part_swallow(sd->layout, "elm.swallow.menu", sd->main_menu);
edje_object_signal_emit(sd->layout, "elm,action,show_menu", "elm");
_elm_menu_menu_bar_set(sd->main_menu, EINA_TRUE);
}
_local_menu_set(obj);
end:
*ret = sd->main_menu;
}