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,
|
ELM_DBUS_SIGNAL_ITEM_ACTIVATION_REQUESTED,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct _Callback_Data {
|
||||||
|
void (*result_cb)(Eina_Bool, void *);
|
||||||
|
void *data;
|
||||||
|
} Callback_Data;
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_menu_add_recursive(Elm_DBus_Menu *dbus_menu, Elm_Menu_Item *item)
|
_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;
|
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
|
static Eina_Bool
|
||||||
_layout_idler(void *data)
|
_layout_idler(void *data)
|
||||||
{
|
{
|
||||||
|
@ -875,10 +890,12 @@ _elm_dbus_menu_unregister(Eo *obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
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;
|
EDBus_Message *msg;
|
||||||
const char *obj_path;
|
const char *obj_path;
|
||||||
|
Callback_Data *cd;
|
||||||
|
|
||||||
ELM_MENU_CHECK(obj);
|
ELM_MENU_CHECK(obj);
|
||||||
ELM_MENU_DATA_GET(obj, sd);
|
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,
|
msg = edbus_message_method_call_new(REGISTRAR_NAME, REGISTRAR_PATH,
|
||||||
REGISTRAR_INTERFACE, "RegisterWindow");
|
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);
|
obj_path = edbus_service_object_path_get(sd->dbus_menu->iface);
|
||||||
edbus_message_arguments_append(msg, "uo", (unsigned)xid,
|
edbus_message_arguments_append(msg, "uo", (unsigned)xid,
|
||||||
obj_path);
|
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;
|
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,
|
void _elm_dbus_menu_item_delete(Elm_DBus_Menu *dbus_menu,
|
||||||
int id);
|
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_app_menu_unregister(Eo *obj);
|
||||||
void _elm_dbus_menu_item_select_cb(Elm_Object_Item *obj_item);
|
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;
|
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
|
static void
|
||||||
_main_menu_get(Eo *obj, void *_pd, va_list *list)
|
_main_menu_get(Eo *obj, void *_pd, va_list *list)
|
||||||
{
|
{
|
||||||
Eo **ret = va_arg(*list, Eo **);
|
Eo **ret = va_arg(*list, Eo **);
|
||||||
Elm_Win_Smart_Data *sd = _pd;
|
Elm_Win_Smart_Data *sd = _pd;
|
||||||
|
Eina_Bool use_dbus = EINA_FALSE;
|
||||||
|
|
||||||
if (sd->main_menu) goto end;
|
if (sd->main_menu) goto end;
|
||||||
|
|
||||||
sd->main_menu = elm_menu_add(obj);
|
sd->main_menu = elm_menu_add(obj);
|
||||||
|
|
||||||
if (_elm_config->external_menu)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_ELEMENTARY_X
|
#ifdef HAVE_ELEMENTARY_X
|
||||||
if (sd->x.xwin)
|
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_register(sd->main_menu);
|
||||||
_elm_dbus_menu_app_menu_register(sd->x.xwin, sd->main_menu);
|
_elm_dbus_menu_app_menu_register(sd->x.xwin, sd->main_menu,
|
||||||
}
|
_dbus_result_cb, obj);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
_local_menu_set(obj);
|
||||||
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);
|
|
||||||
}
|
|
||||||
end:
|
end:
|
||||||
*ret = sd->main_menu;
|
*ret = sd->main_menu;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue