forked from enlightenment/efl
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:
parent
0591cf9cd9
commit
aa512d1604
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue