forked from enlightenment/efl
edje: support seat on focus action and signals
Seat goes as an optional parameter for FOCUS_SET (if not provided, act over default seat), and emit signals with seat suffix: * focus,in,$SEAT * focus,out,$SEAT * focus,part,in,$SEAT * focus,part,out,$SEAT
This commit is contained in:
parent
fecd59fe32
commit
5cfdf3ec3a
|
@ -2032,6 +2032,7 @@ _edje_program_copy(Edje_Program *ep, Edje_Program *ep2)
|
|||
ep->in.from = ep2->in.from;
|
||||
ep->in.range = ep2->in.range;
|
||||
ep->action = ep2->action;
|
||||
ep->seat = STRDUP(ep2->seat);
|
||||
ep->state = STRDUP(ep2->state);
|
||||
ep->state2 = STRDUP(ep2->state2);
|
||||
ep->value = ep2->value;
|
||||
|
@ -6067,6 +6068,7 @@ _program_free(Edje_Program *pr)
|
|||
free((void*)pr->source);
|
||||
free((void*)pr->filter.part);
|
||||
free((void*)pr->filter.state);
|
||||
free((void*)pr->seat);
|
||||
free((void*)pr->state);
|
||||
free((void*)pr->state2);
|
||||
free((void*)pr->sample_name);
|
||||
|
@ -14091,7 +14093,7 @@ st_collections_group_programs_program_in(void)
|
|||
@li DRAG_VAL_SET 0.5 0.0
|
||||
@li DRAG_VAL_STEP 1.0 0.0
|
||||
@li DRAG_VAL_PAGE 0.0 0.0
|
||||
@li FOCUS_SET
|
||||
@li FOCUS_SET ("seat")
|
||||
@li FOCUS_OBJECT
|
||||
@li PARAM_COPY "src_part" "src_param" "dst_part" "dst_param"
|
||||
@li PARAM_SET "part" "param" "value"
|
||||
|
@ -14167,6 +14169,13 @@ st_collections_group_programs_program_action(void)
|
|||
else
|
||||
ep->value = parse_float_range(2, 0.0, 1.0);
|
||||
}
|
||||
else if (ep->action == EDJE_ACTION_TYPE_FOCUS_SET)
|
||||
{
|
||||
if (get_arg_count() == 1)
|
||||
ep->seat = NULL;
|
||||
else
|
||||
ep->seat = parse_str(1);
|
||||
}
|
||||
else if (ep->action == EDJE_ACTION_TYPE_SIGNAL_EMIT)
|
||||
{
|
||||
ep->state = parse_str(1);
|
||||
|
@ -14309,7 +14318,6 @@ st_collections_group_programs_program_action(void)
|
|||
break;
|
||||
case EDJE_ACTION_TYPE_ACTION_STOP:
|
||||
case EDJE_ACTION_TYPE_FOCUS_OBJECT:
|
||||
case EDJE_ACTION_TYPE_FOCUS_SET:
|
||||
case EDJE_ACTION_TYPE_PHYSICS_FORCES_CLEAR:
|
||||
case EDJE_ACTION_TYPE_PHYSICS_STOP:
|
||||
check_arg_count(1);
|
||||
|
@ -14333,6 +14341,9 @@ st_collections_group_programs_program_action(void)
|
|||
case EDJE_ACTION_TYPE_STATE_SET:
|
||||
check_min_arg_count(2);
|
||||
break;
|
||||
case EDJE_ACTION_TYPE_FOCUS_SET:
|
||||
check_min_arg_count(1);
|
||||
break;
|
||||
default:
|
||||
check_arg_count(3);
|
||||
}
|
||||
|
|
|
@ -1924,7 +1924,7 @@ typedef enum _Edje_Action_Type
|
|||
EDJE_ACTION_TYPE_DRAG_VAL_STEP = 5, /**< Drag val step action value */
|
||||
EDJE_ACTION_TYPE_DRAG_VAL_PAGE = 6, /**< Drag val page action value */
|
||||
EDJE_ACTION_TYPE_SCRIPT = 7, /**< Script action value */
|
||||
EDJE_ACTION_TYPE_FOCUS_SET = 8, /**< Forcus set action value */
|
||||
EDJE_ACTION_TYPE_FOCUS_SET = 8, /**< Focus set action value */
|
||||
EDJE_ACTION_TYPE_RESERVED00 = 9, /**< Reversed do action value */
|
||||
EDJE_ACTION_TYPE_FOCUS_OBJECT = 10, /**< Forcus object action value */
|
||||
EDJE_ACTION_TYPE_PARAM_COPY = 11, /**< Param copy action value */
|
||||
|
|
|
@ -25,29 +25,35 @@ _edje_hold_signal_cb(void *data, const Efl_Event *event)
|
|||
static void
|
||||
_edje_focus_in_signal_cb(void *data, const Efl_Event *event)
|
||||
{
|
||||
Efl_Input_Focus *ev;
|
||||
Edje *ed;
|
||||
Edje_Real_Part *rp;
|
||||
|
||||
ev = event->info;
|
||||
ed = data;
|
||||
rp = evas_object_data_get(event->object, "real_part");
|
||||
if ((!rp) || (!ed))
|
||||
return;
|
||||
|
||||
_edje_emit(ed, "focus,part,in", rp->part->name);
|
||||
_edje_seat_emit(ed, efl_input_device_get(ev),
|
||||
"focus,part,in", rp->part->name);
|
||||
}
|
||||
|
||||
static void
|
||||
_edje_focus_out_signal_cb(void *data, const Efl_Event *event)
|
||||
{
|
||||
Efl_Input_Focus *ev;
|
||||
Edje *ed;
|
||||
Edje_Real_Part *rp;
|
||||
|
||||
ev = event->info;
|
||||
ed = data;
|
||||
rp = evas_object_data_get(event->object, "real_part");
|
||||
if ((!rp) || (!ed))
|
||||
return;
|
||||
|
||||
_edje_emit(ed, "focus,part,out", rp->part->name);
|
||||
_edje_seat_emit(ed, efl_input_device_get(ev),
|
||||
"focus,part,out", rp->part->name);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -1062,6 +1062,8 @@ _edje_edd_init(void)
|
|||
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "vibration_name", vibration_name, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "vibration_repeat", vibration_repeat, EET_T_INT);
|
||||
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "seat", seat, EET_T_STRING);
|
||||
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "state", state, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "state2", state2, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "value", value, EET_T_DOUBLE);
|
||||
|
|
|
@ -10693,6 +10693,7 @@ edje_edit_program_add(Evas_Object *obj, const char *name)
|
|||
epr->in.from = 0.0;
|
||||
epr->in.range = 0.0;
|
||||
epr->action = 0;
|
||||
epr->seat = NULL;
|
||||
epr->state = NULL;
|
||||
epr->value = 0.0;
|
||||
epr->state2 = NULL;
|
||||
|
@ -10788,6 +10789,7 @@ edje_edit_program_del(Evas_Object *obj, const char *prog)
|
|||
_edje_if_string_free(ed, &epr->source);
|
||||
_edje_if_string_free(ed, &epr->filter.part);
|
||||
_edje_if_string_free(ed, &epr->filter.state);
|
||||
_edje_if_string_free(ed, &epr->seat);
|
||||
_edje_if_string_free(ed, &epr->state);
|
||||
_edje_if_string_free(ed, &epr->state2);
|
||||
_edje_if_string_free(ed, &epr->sample_name);
|
||||
|
|
|
@ -113,12 +113,17 @@ _preedit_del(Entry *en)
|
|||
}
|
||||
|
||||
static void
|
||||
_edje_entry_focus_in_cb(void *data, Evas_Object *o, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
|
||||
_edje_entry_focus_in_cb(void *data, Evas_Object *o, const char *emission, const char *source EINA_UNUSED)
|
||||
{
|
||||
Efl_Input_Device *seat;
|
||||
const char *seat_name;
|
||||
Edje_Real_Part *rp;
|
||||
Entry *en;
|
||||
Edje *ed;
|
||||
|
||||
seat_name = emission + strlen("focus,part,in,");
|
||||
seat = evas_device_get(evas_object_evas_get(o), seat_name);
|
||||
|
||||
rp = data;
|
||||
if ((!rp) || (rp->type != EDJE_RP_TYPE_TEXT) ||
|
||||
(!rp->typedata.text)) return;
|
||||
|
@ -130,7 +135,7 @@ _edje_entry_focus_in_cb(void *data, Evas_Object *o, const char *emission EINA_UN
|
|||
en = rp->typedata.text->entry_data;
|
||||
if (!en || !en->imf_context) return;
|
||||
|
||||
if (evas_object_focus_get(ed->obj))
|
||||
if (evas_object_seat_focus_check(ed->obj, seat))
|
||||
{
|
||||
ecore_imf_context_focus_in(en->imf_context);
|
||||
_edje_entry_imf_cursor_info_set(en);
|
||||
|
@ -158,17 +163,16 @@ _edje_entry_focus_out_cb(void *data, Evas_Object *o EINA_UNUSED, const char *emi
|
|||
#endif
|
||||
|
||||
static void
|
||||
_edje_focus_in_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
||||
_edje_focus_in(Edje *ed, Efl_Input_Device *seat)
|
||||
{
|
||||
Edje *ed = data;
|
||||
#ifdef HAVE_ECORE_IMF
|
||||
Edje_Real_Part *rp;
|
||||
Entry *en;
|
||||
#endif
|
||||
|
||||
_edje_emit(ed, "focus,in", "");
|
||||
_edje_seat_emit(ed, seat, "focus,in", "");
|
||||
#ifdef HAVE_ECORE_IMF
|
||||
rp = ed->focused_part;
|
||||
rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
|
||||
if (!rp) return;
|
||||
if ((rp->type != EDJE_RP_TYPE_TEXT) ||
|
||||
(!rp->typedata.text)) return;
|
||||
|
@ -185,17 +189,25 @@ _edje_focus_in_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
|
|||
}
|
||||
|
||||
static void
|
||||
_edje_focus_out_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
||||
_edje_focus_in_cb(void *data, const Efl_Event *event)
|
||||
{
|
||||
Efl_Input_Focus *ev = event->info;
|
||||
|
||||
_edje_focus_in(data, efl_input_device_get(ev));
|
||||
}
|
||||
|
||||
static void
|
||||
_edje_focus_out(Edje *ed, Efl_Input_Device *seat)
|
||||
{
|
||||
Edje *ed = data;
|
||||
#ifdef HAVE_ECORE_IMF
|
||||
Edje_Real_Part *rp = ed->focused_part;
|
||||
Edje_Real_Part *rp;
|
||||
Entry *en;
|
||||
#endif
|
||||
|
||||
_edje_emit(ed, "focus,out", "");
|
||||
_edje_seat_emit(ed, seat, "focus,out", "");
|
||||
|
||||
#ifdef HAVE_ECORE_IMF
|
||||
rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
|
||||
if (!rp) return;
|
||||
if ((rp->type != EDJE_RP_TYPE_TEXT) ||
|
||||
(!rp->typedata.text)) return;
|
||||
|
@ -211,6 +223,14 @@ _edje_focus_out_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED
|
|||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
_edje_focus_out_cb(void *data, const Efl_Event *event)
|
||||
{
|
||||
Efl_Input_Focus *ev = event->info;
|
||||
|
||||
_edje_focus_out(data, efl_input_device_get(ev));
|
||||
}
|
||||
|
||||
static Edje_Entry_Change_Info *
|
||||
_text_filter_markup_prepend_internal(Edje *ed, Entry *en, Evas_Textblock_Cursor *c,
|
||||
char *text,
|
||||
|
@ -1676,7 +1696,9 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
|
|||
{
|
||||
Edje *ed = data;
|
||||
Evas_Event_Key_Down *ev = event_info;
|
||||
Edje_Real_Part *rp = ed->focused_part;
|
||||
Edje_Real_Part *rp;
|
||||
Efl_Input_Device *seat;
|
||||
|
||||
Entry *en;
|
||||
Eina_Bool control, alt, shift;
|
||||
#if defined(__APPLE__) && defined(__MACH__)
|
||||
|
@ -1685,6 +1707,10 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
|
|||
Eina_Bool multiline;
|
||||
Eina_Bool cursor_changed;
|
||||
int old_cur_pos;
|
||||
|
||||
seat = efl_input_device_seat_get(ev->dev);
|
||||
rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
|
||||
|
||||
if (!rp) return;
|
||||
if ((rp->type != EDJE_RP_TYPE_TEXT) ||
|
||||
(!rp->typedata.text)) return;
|
||||
|
@ -2340,10 +2366,14 @@ end:
|
|||
static void
|
||||
_edje_key_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
|
||||
{
|
||||
Evas_Event_Key_Up *ev = event_info;
|
||||
Efl_Input_Device *seat;
|
||||
Edje *ed = data;
|
||||
Edje_Real_Part *rp = ed->focused_part;
|
||||
Edje_Real_Part *rp;
|
||||
Entry *en;
|
||||
|
||||
seat = efl_input_device_seat_get(ev->dev);
|
||||
rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
|
||||
if (!rp) return;
|
||||
if ((rp->type != EDJE_RP_TYPE_TEXT) ||
|
||||
(!rp->typedata.text)) return;
|
||||
|
@ -2356,7 +2386,6 @@ _edje_key_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, v
|
|||
#ifdef HAVE_ECORE_IMF
|
||||
if (en->imf_context)
|
||||
{
|
||||
Evas_Event_Key_Up *ev = event_info;
|
||||
Ecore_IMF_Event_Key_Up ecore_ev;
|
||||
|
||||
ecore_imf_evas_event_key_up_wrap(ev, &ecore_ev);
|
||||
|
@ -2797,26 +2826,36 @@ _canvas_viewport_resize_cb(void *data, Evas *e EINA_UNUSED, void *event_info EIN
|
|||
}
|
||||
|
||||
static void
|
||||
_evas_focus_in_cb(void *data, Evas *e, EINA_UNUSED void *event_info)
|
||||
_evas_focus_in_cb(void *data, const Efl_Event *event)
|
||||
{
|
||||
Edje *ed = (Edje *)data;
|
||||
Efl_Input_Focus *ev = event->info;
|
||||
Evas *e = event->object;
|
||||
Efl_Input_Device *seat;
|
||||
Edje *ed = data;
|
||||
|
||||
if (!ed) return;
|
||||
|
||||
if (evas_focus_get(e) == ed->obj)
|
||||
seat = efl_input_device_get(ev);
|
||||
if (evas_canvas_seat_focus_get(e, seat) == ed->obj)
|
||||
{
|
||||
_edje_focus_in_cb(data, NULL, NULL, NULL);
|
||||
_edje_focus_in(data, seat);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_evas_focus_out_cb(void *data, Evas *e, EINA_UNUSED void *event_info)
|
||||
_evas_focus_out_cb(void *data, const Efl_Event *event)
|
||||
{
|
||||
Edje *ed = (Edje *)data;
|
||||
Efl_Input_Focus *ev = event->info;
|
||||
Evas *e = event->object;
|
||||
Efl_Input_Device *seat;
|
||||
Edje *ed = data;
|
||||
|
||||
if (!ed) return;
|
||||
|
||||
if (evas_focus_get(e) == ed->obj)
|
||||
seat = efl_input_device_get(ev);
|
||||
if (evas_canvas_seat_focus_get(e, seat) == ed->obj)
|
||||
{
|
||||
_edje_focus_out_cb(data, NULL, NULL, NULL);
|
||||
_edje_focus_out(data, seat);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2830,12 +2869,16 @@ _edje_entry_init(Edje *ed)
|
|||
return;
|
||||
ed->entries_inited = EINA_TRUE;
|
||||
|
||||
evas_object_event_callback_add(ed->obj, EVAS_CALLBACK_FOCUS_IN, _edje_focus_in_cb, ed);
|
||||
evas_object_event_callback_add(ed->obj, EVAS_CALLBACK_FOCUS_OUT, _edje_focus_out_cb, ed);
|
||||
evas_object_event_callback_add(ed->obj, EVAS_CALLBACK_KEY_DOWN, _edje_key_down_cb, ed);
|
||||
evas_object_event_callback_add(ed->obj, EVAS_CALLBACK_KEY_UP, _edje_key_up_cb, ed);
|
||||
evas_event_callback_add(ed->base->evas, EVAS_CALLBACK_CANVAS_FOCUS_IN, _evas_focus_in_cb, ed);
|
||||
evas_event_callback_add(ed->base->evas, EVAS_CALLBACK_CANVAS_FOCUS_OUT, _evas_focus_out_cb, ed);
|
||||
efl_event_callback_add(ed->obj, EFL_EVENT_FOCUS_IN, _edje_focus_in_cb, ed);
|
||||
efl_event_callback_add(ed->obj, EFL_EVENT_FOCUS_OUT, _edje_focus_out_cb, ed);
|
||||
evas_object_event_callback_add(ed->obj, EVAS_CALLBACK_KEY_DOWN,
|
||||
_edje_key_down_cb, ed);
|
||||
evas_object_event_callback_add(ed->obj, EVAS_CALLBACK_KEY_UP,
|
||||
_edje_key_up_cb, ed);
|
||||
efl_event_callback_add(ed->base->evas, EFL_CANVAS_EVENT_FOCUS_IN,
|
||||
_evas_focus_in_cb, ed);
|
||||
efl_event_callback_add(ed->base->evas, EFL_CANVAS_EVENT_FOCUS_OUT,
|
||||
_evas_focus_out_cb, ed);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -2847,14 +2890,16 @@ _edje_entry_shutdown(Edje *ed)
|
|||
return;
|
||||
ed->entries_inited = EINA_FALSE;
|
||||
|
||||
evas_object_event_callback_del(ed->obj, EVAS_CALLBACK_FOCUS_IN, _edje_focus_in_cb);
|
||||
evas_object_event_callback_del(ed->obj, EVAS_CALLBACK_FOCUS_OUT, _edje_focus_out_cb);
|
||||
evas_object_event_callback_del(ed->obj, EVAS_CALLBACK_KEY_DOWN, _edje_key_down_cb);
|
||||
evas_object_event_callback_del(ed->obj, EVAS_CALLBACK_KEY_UP, _edje_key_up_cb);
|
||||
if (evas_event_callback_del_full(ed->base->evas, EVAS_CALLBACK_CANVAS_FOCUS_IN, _evas_focus_in_cb, ed) != ed)
|
||||
ERR("could not unregister EVAS_CALLBACK_FOCUS_IN");
|
||||
if (evas_event_callback_del_full(ed->base->evas, EVAS_CALLBACK_CANVAS_FOCUS_OUT, _evas_focus_out_cb, ed) != ed)
|
||||
ERR("could not unregister EVAS_CALLBACK_FOCUS_OUT");
|
||||
efl_event_callback_del(ed->obj, EFL_EVENT_FOCUS_IN, _edje_focus_in_cb, ed);
|
||||
efl_event_callback_del(ed->obj, EFL_EVENT_FOCUS_OUT, _edje_focus_out_cb, ed);
|
||||
evas_object_event_callback_del(ed->obj, EVAS_CALLBACK_KEY_DOWN,
|
||||
_edje_key_down_cb);
|
||||
evas_object_event_callback_del(ed->obj, EVAS_CALLBACK_KEY_UP,
|
||||
_edje_key_up_cb);
|
||||
efl_event_callback_del(ed->base->evas, EFL_CANVAS_EVENT_FOCUS_IN,
|
||||
_evas_focus_in_cb, ed);
|
||||
efl_event_callback_del(ed->base->evas, EFL_CANVAS_EVENT_FOCUS_OUT,
|
||||
_evas_focus_out_cb, ed);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -2948,8 +2993,12 @@ _edje_entry_real_part_init(Edje *ed, Edje_Real_Part *rp)
|
|||
|
||||
en->commit_cancel = EINA_FALSE;
|
||||
|
||||
edje_object_signal_callback_add(ed->obj, "focus,part,in", rp->part->name, _edje_entry_focus_in_cb, rp);
|
||||
edje_object_signal_callback_add(ed->obj, "focus,part,out", rp->part->name, _edje_entry_focus_out_cb, rp);
|
||||
edje_object_signal_callback_add(ed->obj, "focus,part,in,*",
|
||||
rp->part->name,
|
||||
_edje_entry_focus_in_cb, rp);
|
||||
edje_object_signal_callback_add(ed->obj, "focus,part,out,*",
|
||||
rp->part->name,
|
||||
_edje_entry_focus_out_cb, rp);
|
||||
|
||||
ctx_id = ecore_imf_context_default_id_get();
|
||||
if (ctx_id)
|
||||
|
@ -3053,8 +3102,12 @@ _edje_entry_real_part_shutdown(Edje *ed, Edje_Real_Part *rp)
|
|||
en->imf_context = NULL;
|
||||
}
|
||||
|
||||
edje_object_signal_callback_del(ed->obj, "focus,part,in", rp->part->name, _edje_entry_focus_in_cb);
|
||||
edje_object_signal_callback_del(ed->obj, "focus,part,out", rp->part->name, _edje_entry_focus_out_cb);
|
||||
edje_object_signal_callback_del(ed->obj, "focus,part,in,*",
|
||||
rp->part->name,
|
||||
_edje_entry_focus_in_cb);
|
||||
edje_object_signal_callback_del(ed->obj, "focus,part,out,*",
|
||||
rp->part->name,
|
||||
_edje_entry_focus_out_cb);
|
||||
}
|
||||
#endif
|
||||
_compose_seq_reset(en);
|
||||
|
@ -4429,11 +4482,14 @@ static Eina_Bool
|
|||
_edje_entry_imf_retrieve_surrounding_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUSED, char **text, int *cursor_pos)
|
||||
{
|
||||
Edje *ed = data;
|
||||
Edje_Real_Part *rp = ed->focused_part;
|
||||
Edje_Real_Part *rp;
|
||||
Entry *en = NULL;
|
||||
const char *str;
|
||||
char *plain_text;
|
||||
|
||||
// FIXME
|
||||
//rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
|
||||
rp = _edje_focused_part_get(ed, "default");
|
||||
if (!rp) return EINA_FALSE;
|
||||
if ((rp->type != EDJE_RP_TYPE_TEXT) ||
|
||||
(!rp->typedata.text)) return EINA_FALSE;
|
||||
|
@ -4506,11 +4562,14 @@ static void
|
|||
_edje_entry_imf_event_commit_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUSED, void *event_info)
|
||||
{
|
||||
Edje *ed = data;
|
||||
Edje_Real_Part *rp = ed->focused_part;
|
||||
Edje_Real_Part *rp;
|
||||
Entry *en = NULL;
|
||||
char *commit_str = event_info;
|
||||
Edje_Entry_Change_Info *info = NULL;
|
||||
|
||||
// FIXME
|
||||
//rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
|
||||
rp = _edje_focused_part_get(ed, "default");
|
||||
if ((!rp)) return;
|
||||
if ((rp->type != EDJE_RP_TYPE_TEXT) ||
|
||||
(!rp->typedata.text)) return;
|
||||
|
@ -4587,7 +4646,7 @@ static void
|
|||
_edje_entry_imf_event_preedit_changed_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUSED, void *event_info EINA_UNUSED)
|
||||
{
|
||||
Edje *ed = data;
|
||||
Edje_Real_Part *rp = ed->focused_part;
|
||||
Edje_Real_Part *rp;
|
||||
Entry *en = NULL;
|
||||
Edje_Entry_Change_Info *info = NULL;
|
||||
int cursor_pos;
|
||||
|
@ -4610,6 +4669,9 @@ _edje_entry_imf_event_preedit_changed_cb(void *data, Ecore_IMF_Context *ctx EINA
|
|||
Eina_Strbuf *buf;
|
||||
Eina_Strbuf *preedit_attr_str;
|
||||
|
||||
// FIXME
|
||||
//rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
|
||||
rp = _edje_focused_part_get(ed, "default");
|
||||
if ((!rp)) return;
|
||||
|
||||
if ((rp->type != EDJE_RP_TYPE_TEXT) ||
|
||||
|
@ -4751,7 +4813,7 @@ static void
|
|||
_edje_entry_imf_event_delete_surrounding_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUSED, void *event_info)
|
||||
{
|
||||
Edje *ed = data;
|
||||
Edje_Real_Part *rp = ed->focused_part;
|
||||
Edje_Real_Part *rp;
|
||||
Entry *en = NULL;
|
||||
Ecore_IMF_Event_Delete_Surrounding *ev = event_info;
|
||||
Evas_Textblock_Cursor *del_start, *del_end;
|
||||
|
@ -4759,6 +4821,10 @@ _edje_entry_imf_event_delete_surrounding_cb(void *data, Ecore_IMF_Context *ctx E
|
|||
int cursor_pos;
|
||||
int start, end;
|
||||
|
||||
// FIXME
|
||||
//rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
|
||||
rp = _edje_focused_part_get(ed, "default");
|
||||
if ((!rp)) return;
|
||||
if ((!rp) || (!ev)) return;
|
||||
if ((rp->type != EDJE_RP_TYPE_TEXT) ||
|
||||
(!rp->typedata.text)) return;
|
||||
|
@ -4810,10 +4876,13 @@ static void
|
|||
_edje_entry_imf_event_selection_set_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUSED, void *event_info)
|
||||
{
|
||||
Edje *ed = data;
|
||||
Edje_Real_Part *rp = ed->focused_part;
|
||||
Edje_Real_Part *rp;
|
||||
Entry *en = NULL;
|
||||
Ecore_IMF_Event_Selection *ev = event_info;
|
||||
|
||||
// FIXME
|
||||
//rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
|
||||
rp = _edje_focused_part_get(ed, "default");
|
||||
if ((!rp) || (!ev)) return;
|
||||
if ((rp->type != EDJE_RP_TYPE_TEXT) ||
|
||||
(!rp->typedata.text)) return;
|
||||
|
@ -4844,10 +4913,13 @@ static Eina_Bool
|
|||
_edje_entry_imf_retrieve_selection_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUSED, char **text)
|
||||
{
|
||||
Edje *ed = data;
|
||||
Edje_Real_Part *rp = ed->focused_part;
|
||||
Edje_Real_Part *rp;
|
||||
Entry *en = NULL;
|
||||
const char *selection_text = NULL;
|
||||
|
||||
// FIXME
|
||||
//rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
|
||||
rp = _edje_focused_part_get(ed, "default");
|
||||
if (!rp) return EINA_FALSE;
|
||||
if ((rp->type != EDJE_RP_TYPE_TEXT) ||
|
||||
(!rp->typedata.text)) return EINA_FALSE;
|
||||
|
|
|
@ -1809,13 +1809,23 @@ _edje_file_del(Edje *ed)
|
|||
}
|
||||
}
|
||||
|
||||
if (ed->focused_parts)
|
||||
{
|
||||
Edje_Focused_Part *focused_part;
|
||||
|
||||
EINA_LIST_FREE(ed->focused_parts, focused_part)
|
||||
{
|
||||
free(focused_part->seat);
|
||||
free(focused_part);
|
||||
}
|
||||
}
|
||||
|
||||
if (ed->L) _edje_lua2_script_shutdown(ed);
|
||||
while (ed->subobjs)
|
||||
_edje_subobj_unregister(ed, ed->subobjs->data);
|
||||
if (ed->table_parts) free(ed->table_parts);
|
||||
ed->table_parts = NULL;
|
||||
ed->table_parts_size = 0;
|
||||
ed->focused_part = NULL;
|
||||
if (tev)
|
||||
{
|
||||
evas_event_thaw(tev);
|
||||
|
@ -1982,6 +1992,7 @@ _edje_program_free(Edje_Program *pr, Eina_Bool free_strings)
|
|||
if (pr->state2) eina_stringshare_del(pr->state2);
|
||||
if (pr->sample_name) eina_stringshare_del(pr->sample_name);
|
||||
if (pr->tone_name) eina_stringshare_del(pr->tone_name);
|
||||
if (pr->seat) eina_stringshare_del(pr->seat);
|
||||
}
|
||||
EINA_LIST_FREE(pr->targets, prt)
|
||||
free(prt);
|
||||
|
|
|
@ -805,6 +805,8 @@ struct _Edje_Program /* a conditional program to be run */
|
|||
double range;
|
||||
} in;
|
||||
|
||||
const char *seat; /* which seat to focus, NULL = default seat */
|
||||
|
||||
const char *state; /* what state of alternates to apply, NULL = default */
|
||||
const char *state2; /* what other state to use - for signal emit action */
|
||||
double value; /* value of state to apply (if multiple names match) */
|
||||
|
@ -1659,7 +1661,7 @@ struct _Edje
|
|||
Edje_Var_Pool *var_pool;
|
||||
/* for faster lookups to avoid nth list walks */
|
||||
Edje_Real_Part **table_parts;
|
||||
Edje_Real_Part *focused_part;
|
||||
Eina_List *focused_parts;
|
||||
Eina_List *subobjs;
|
||||
Eina_List *text_insert_filter_callbacks;
|
||||
Eina_List *markup_filter_callbacks;
|
||||
|
@ -2273,6 +2275,13 @@ struct _Edje_Font
|
|||
char *file;
|
||||
};
|
||||
|
||||
typedef struct _Edje_Focused_Part Edje_Focused_Part;
|
||||
struct _Edje_Focused_Part
|
||||
{
|
||||
Edje_Real_Part *part;
|
||||
char *seat;
|
||||
};
|
||||
|
||||
Edje_Patterns *edje_match_collection_dir_init(const Eina_List *lst);
|
||||
Edje_Patterns *edje_match_programs_signal_init(Edje_Program * const *array,
|
||||
unsigned int count);
|
||||
|
@ -2472,6 +2481,9 @@ void _edje_emit_full(Edje *ed, const char *sig, const char *src, void *data, voi
|
|||
void _edje_emit_handle(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Data *data, Eina_Bool prop);
|
||||
void _edje_signals_sources_patterns_clean(Edje_Signals_Sources_Patterns *ssp);
|
||||
|
||||
void _edje_focused_part_set(Edje *ed, const char *seat_name, Edje_Real_Part *rp);
|
||||
Edje_Real_Part *_edje_focused_part_get(Edje *ed, const char *seat_name);
|
||||
|
||||
const Edje_Signals_Sources_Patterns *_edje_signal_callback_patterns_ref(const Edje_Signal_Callback_Group *gp);
|
||||
void _edje_signal_callback_patterns_unref(const Edje_Signals_Sources_Patterns *essp);
|
||||
void _edje_signal_callback_reset(Edje_Signal_Callback_Flags *flags, unsigned int length);
|
||||
|
|
|
@ -615,6 +615,20 @@ _edje_physics_action_set(Edje *ed, Edje_Program *pr, void (*func)(EPhysics_Body
|
|||
|
||||
#endif
|
||||
|
||||
static void
|
||||
_edje_seat_name_emit(Edje *ed, const char *name, const char *sig, const char *src)
|
||||
{
|
||||
char buf[128];
|
||||
|
||||
/* keep sending signals without seat information for legacy compatibility */
|
||||
_edje_emit_full(ed, sig, src, NULL, NULL);
|
||||
|
||||
if (!name) return;
|
||||
|
||||
snprintf(buf, sizeof(buf), "%s,%s", sig, name);
|
||||
_edje_emit_full(ed, buf, src, NULL, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
_edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char *ssig, const char *ssrc)
|
||||
{
|
||||
|
@ -943,12 +957,32 @@ low_mem_current:
|
|||
break;
|
||||
|
||||
case EDJE_ACTION_TYPE_FOCUS_SET:
|
||||
{
|
||||
Edje_Real_Part *focused_part;
|
||||
const char *seat_name;
|
||||
|
||||
/* TODO : use edje custom seat naming */
|
||||
if (pr->seat)
|
||||
seat_name = pr->seat;
|
||||
else
|
||||
{
|
||||
Efl_Input_Device *seat;
|
||||
Evas *e;
|
||||
|
||||
e = evas_object_evas_get(ed->obj);
|
||||
seat = evas_canvas_default_device_get(e, EFL_INPUT_DEVICE_CLASS_SEAT);
|
||||
seat_name = evas_device_name_get(seat);
|
||||
if (!seat_name)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!pr->targets)
|
||||
{
|
||||
if (ed->focused_part)
|
||||
_edje_emit(ed, "focus,part,out",
|
||||
ed->focused_part->part->name);
|
||||
ed->focused_part = NULL;
|
||||
focused_part = _edje_focused_part_get(ed, seat_name);
|
||||
if (focused_part)
|
||||
_edje_seat_name_emit(ed, seat_name, "focus,part,out",
|
||||
focused_part->part->name);
|
||||
_edje_focused_part_set(ed, seat_name, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -959,20 +993,25 @@ low_mem_current:
|
|||
rp = ed->table_parts[pt->id % ed->table_parts_size];
|
||||
if (rp)
|
||||
{
|
||||
if (ed->focused_part != rp)
|
||||
focused_part = _edje_focused_part_get(ed,
|
||||
seat_name);
|
||||
if (focused_part != rp)
|
||||
{
|
||||
if (ed->focused_part)
|
||||
_edje_emit(ed, "focus,part,out",
|
||||
ed->focused_part->part->name);
|
||||
ed->focused_part = rp;
|
||||
_edje_emit(ed, "focus,part,in",
|
||||
ed->focused_part->part->name);
|
||||
if (focused_part)
|
||||
_edje_seat_name_emit(ed, seat_name,
|
||||
"focus,part,out",
|
||||
focused_part->part->name);
|
||||
_edje_focused_part_set(ed, seat_name, rp);
|
||||
_edje_seat_name_emit(ed, seat_name,
|
||||
"focus,part,in",
|
||||
rp->part->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case EDJE_ACTION_TYPE_FOCUS_OBJECT:
|
||||
if (!pr->targets)
|
||||
|
@ -1267,6 +1306,50 @@ _edje_emit_full(Edje *ed, const char *sig, const char *src, void *data, void (*f
|
|||
_edje_emit_send(ed, broadcast, sig, src, data, free_func);
|
||||
}
|
||||
|
||||
void
|
||||
_edje_focused_part_set(Edje *ed, const char *seat_name, Edje_Real_Part *rp)
|
||||
{
|
||||
Edje_Focused_Part *focused_part;
|
||||
Eina_List *l;
|
||||
|
||||
EINA_LIST_FOREACH(ed->focused_parts, l, focused_part)
|
||||
{
|
||||
if (!strcmp(seat_name, focused_part->seat))
|
||||
{
|
||||
focused_part->part = rp;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
focused_part = calloc(1, sizeof(Edje_Focused_Part));
|
||||
EINA_SAFETY_ON_NULL_RETURN(focused_part);
|
||||
|
||||
focused_part->seat = strdup(seat_name);
|
||||
if (!focused_part->seat)
|
||||
{
|
||||
free(focused_part);
|
||||
return;
|
||||
}
|
||||
|
||||
focused_part->part = rp;
|
||||
ed->focused_parts = eina_list_append(ed->focused_parts, focused_part);
|
||||
}
|
||||
|
||||
Edje_Real_Part *
|
||||
_edje_focused_part_get(Edje *ed, const char *seat_name)
|
||||
{
|
||||
Edje_Focused_Part *focused_part;
|
||||
Eina_List *l;
|
||||
|
||||
EINA_LIST_FOREACH(ed->focused_parts, l, focused_part)
|
||||
{
|
||||
if (!strcmp(seat_name, focused_part->seat))
|
||||
return focused_part->part;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct _Edje_Program_Data
|
||||
{
|
||||
Eina_List *matches;
|
||||
|
|
Loading…
Reference in New Issue