forked from enlightenment/terminology
introduce Term_Container
This commit is contained in:
parent
e562bcb7e2
commit
50f7468dbc
|
@ -290,12 +290,9 @@ main_ipc_new(Ipc_Instance *inst)
|
||||||
free(nargv);
|
free(nargv);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
win_term_swallow(wn, term);
|
|
||||||
}
|
|
||||||
|
|
||||||
win_add_split(wn, term);
|
if (win_solo_term_set(wn, term) < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
main_trans_update(config);
|
main_trans_update(config);
|
||||||
main_media_update(config);
|
main_media_update(config);
|
||||||
|
@ -864,12 +861,12 @@ remote:
|
||||||
retval = EXIT_FAILURE;
|
retval = EXIT_FAILURE;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
win_term_swallow(wn, term);
|
|
||||||
}
|
|
||||||
|
|
||||||
win_add_split(wn, term);
|
if (win_solo_term_set(wn, term) < 0)
|
||||||
|
{
|
||||||
|
retval = EXIT_FAILURE;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
main_trans_update(config);
|
main_trans_update(config);
|
||||||
main_media_update(config);
|
main_media_update(config);
|
||||||
|
|
192
src/bin/win.c
192
src/bin/win.c
|
@ -52,27 +52,38 @@ struct _Term
|
||||||
unsigned char popmedia_deleted : 1;
|
unsigned char popmedia_deleted : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef enum _Term_Container_Type
|
||||||
|
|
||||||
struct _Win
|
|
||||||
{
|
{
|
||||||
Evas_Object *win;
|
TERM_CONTAINER_TYPE_SOLO,
|
||||||
Evas_Object *conform;
|
TERM_CONTAINER_TYPE_SPLIT,
|
||||||
Evas_Object *backbg;
|
TERM_CONTAINER_TYPE_TAB
|
||||||
Evas_Object *base;
|
} Term_Container_Type;
|
||||||
Config *config;
|
|
||||||
Eina_List *terms;
|
typedef struct _Term_Container Term_Container;
|
||||||
Split *split;
|
typedef struct _Term_Container_Api Term_Container_Api;
|
||||||
Ecore_Job *size_job;
|
typedef struct _Solo Solo;
|
||||||
Evas_Object *cmdbox;
|
typedef struct _Tab Tab;
|
||||||
Ecore_Timer *cmdbox_del_timer;
|
|
||||||
Ecore_Timer *cmdbox_focus_timer;
|
struct _Term_Container_Api {
|
||||||
unsigned char focused : 1;
|
Term *(*find_term_at_coords)(Term_Container *container, Evas_Coord mx, Evas_Coord my);
|
||||||
unsigned char cmdbox_up : 1;
|
void (*free)(Term_Container *container);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _Solo {
|
||||||
|
Term_Container_Api api;
|
||||||
|
/* TODO: boris */
|
||||||
|
Term *term;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _Tab {
|
||||||
|
Term_Container_Api api;
|
||||||
|
/* TODO: boris */
|
||||||
|
Term *term;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _Split
|
struct _Split
|
||||||
{
|
{
|
||||||
|
Term_Container_Api api;
|
||||||
Win *wn; // win this split belongs to
|
Win *wn; // win this split belongs to
|
||||||
Split *parent; // the parent split or null if toplevel
|
Split *parent; // the parent split or null if toplevel
|
||||||
Split *s1, *s2; // left/right or top/bottom child splits, null if leaf
|
Split *s1, *s2; // left/right or top/bottom child splits, null if leaf
|
||||||
|
@ -84,6 +95,36 @@ struct _Split
|
||||||
unsigned char horizontal : 1;
|
unsigned char horizontal : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct _Term_Container
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
Term_Container_Api *api;
|
||||||
|
Split *split;
|
||||||
|
Solo *solo;
|
||||||
|
Tab *tab;
|
||||||
|
} u;
|
||||||
|
Term_Container_Type type;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _Win
|
||||||
|
{
|
||||||
|
Evas_Object *win;
|
||||||
|
Evas_Object *conform;
|
||||||
|
Evas_Object *backbg;
|
||||||
|
Evas_Object *base;
|
||||||
|
Config *config;
|
||||||
|
Eina_List *terms;
|
||||||
|
Term_Container *container;
|
||||||
|
Ecore_Job *size_job;
|
||||||
|
Evas_Object *cmdbox;
|
||||||
|
Ecore_Timer *cmdbox_del_timer;
|
||||||
|
Ecore_Timer *cmdbox_focus_timer;
|
||||||
|
unsigned char focused : 1;
|
||||||
|
unsigned char cmdbox_up : 1;
|
||||||
|
};
|
||||||
|
|
||||||
/* }}} */
|
/* }}} */
|
||||||
static Eina_List *wins = NULL;
|
static Eina_List *wins = NULL;
|
||||||
|
|
||||||
|
@ -104,23 +145,13 @@ static void _main_term_bg_redo(Term *term);
|
||||||
static void _term_media_update(Term *term, const Config *config);
|
static void _term_media_update(Term *term, const Config *config);
|
||||||
static void _term_miniview_check(Term *term);
|
static void _term_miniview_check(Term *term);
|
||||||
static void _popmedia_queue_process(Term *term);
|
static void _popmedia_queue_process(Term *term);
|
||||||
|
static void _cb_size_hint(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED);
|
||||||
|
|
||||||
void
|
#if 0
|
||||||
win_add_split(Win *wn, Term *term)
|
|
||||||
{
|
|
||||||
Split *sp;
|
|
||||||
|
|
||||||
sp = wn->split = calloc(1, sizeof(Split));
|
|
||||||
sp->wn = wn;
|
|
||||||
sp->term = term;
|
|
||||||
sp->terms = eina_list_append(sp->terms, sp->term);
|
|
||||||
_term_resize_track_start(sp);
|
|
||||||
_split_tabcount_update(sp, sp->term);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Term *
|
static Term *
|
||||||
_find_term_under_mouse(Win *wn)
|
_find_term_under_mouse(Win *wn)
|
||||||
{
|
{
|
||||||
|
/* TODO: boris */
|
||||||
Evas_Coord mx, my;
|
Evas_Coord mx, my;
|
||||||
Split *sp;
|
Split *sp;
|
||||||
|
|
||||||
|
@ -151,13 +182,13 @@ _find_term_under_mouse(Win *wn)
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_cb_win_focus_in(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
_cb_win_focus_in(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
||||||
{
|
{
|
||||||
Win *wn = data;
|
Win *wn = data;
|
||||||
Term *term;
|
Term *term;
|
||||||
Split *sp;
|
|
||||||
|
|
||||||
if (!wn->focused) elm_win_urgent_set(wn->win, EINA_FALSE);
|
if (!wn->focused) elm_win_urgent_set(wn->win, EINA_FALSE);
|
||||||
wn->focused = EINA_TRUE;
|
wn->focused = EINA_TRUE;
|
||||||
|
@ -169,8 +200,10 @@ _cb_win_focus_in(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUS
|
||||||
if ( wn->config->mouse_over_focus )
|
if ( wn->config->mouse_over_focus )
|
||||||
{
|
{
|
||||||
Term *term_mouse;
|
Term *term_mouse;
|
||||||
|
Evas_Coord mx, my;
|
||||||
|
|
||||||
term_mouse = _find_term_under_mouse(wn);
|
evas_pointer_canvas_xy_get(evas_object_evas_get(wn->win), &mx, &my);
|
||||||
|
term_mouse = wn->container->u.api->find_term_at_coords(wn->container, mx, my);
|
||||||
if ((term_mouse) && (term_mouse != term))
|
if ((term_mouse) && (term_mouse != term))
|
||||||
{
|
{
|
||||||
if (term)
|
if (term)
|
||||||
|
@ -184,6 +217,8 @@ _cb_win_focus_in(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUS
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!term) return;
|
if (!term) return;
|
||||||
|
/* TODO: boris */
|
||||||
|
#if 0
|
||||||
sp = _split_find(wn->win, term->term, NULL);
|
sp = _split_find(wn->win, term->term, NULL);
|
||||||
if (sp->sel)
|
if (sp->sel)
|
||||||
{
|
{
|
||||||
|
@ -195,6 +230,7 @@ _cb_win_focus_in(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUS
|
||||||
edje_object_signal_emit(term->base, "focus,in", "terminology");
|
edje_object_signal_emit(term->base, "focus,in", "terminology");
|
||||||
if (!wn->cmdbox_up) elm_object_focus_set(term->term, EINA_TRUE);
|
if (!wn->cmdbox_up) elm_object_focus_set(term->term, EINA_TRUE);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -248,9 +284,64 @@ _cb_term_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* {{{ Solo */
|
||||||
|
|
||||||
|
static Term *
|
||||||
|
_solo_find_term_at_coords(Term_Container *container,
|
||||||
|
Evas_Coord mx EINA_UNUSED,
|
||||||
|
Evas_Coord my EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Solo *solo = (Solo*)container;
|
||||||
|
return solo->term;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Term_Container *
|
||||||
|
solo_new(Term *term)
|
||||||
|
{
|
||||||
|
Term_Container *container = NULL;
|
||||||
|
Solo *solo = NULL;
|
||||||
|
Term_Container_Api *api;
|
||||||
|
container = calloc(1, sizeof(Term_Container));
|
||||||
|
solo = calloc(1, sizeof(Solo));
|
||||||
|
if (!solo || !container)
|
||||||
|
{
|
||||||
|
free(container);
|
||||||
|
free(solo);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
api = (Term_Container_Api*)solo;
|
||||||
|
api->find_term_at_coords = _solo_find_term_at_coords;
|
||||||
|
solo->term = term;
|
||||||
|
container->u.solo = solo;
|
||||||
|
container->type = TERM_CONTAINER_TYPE_SOLO;
|
||||||
|
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* }}} */
|
||||||
/* {{{ Win */
|
/* {{{ Win */
|
||||||
|
|
||||||
|
|
||||||
|
int win_solo_term_set(Win *wn, Term *term)
|
||||||
|
{
|
||||||
|
Evas_Object *base = win_base_get(wn);
|
||||||
|
Evas *evas = evas_object_evas_get(base);
|
||||||
|
|
||||||
|
|
||||||
|
wn->container = solo_new(term);
|
||||||
|
if (!wn->container) return -1;
|
||||||
|
|
||||||
|
/* TODO: boris resize track */
|
||||||
|
//_term_resize_track_start(sp);
|
||||||
|
|
||||||
|
edje_object_part_swallow(base, "terminology.content", term->bg);
|
||||||
|
_cb_size_hint(term, evas, term->term, NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Evas_Object *
|
Evas_Object *
|
||||||
win_base_get(Win *wn)
|
win_base_get(Win *wn)
|
||||||
{
|
{
|
||||||
|
@ -368,10 +459,10 @@ win_free(Win *wn)
|
||||||
evas_object_del(wn->cmdbox);
|
evas_object_del(wn->cmdbox);
|
||||||
wn->cmdbox = NULL;
|
wn->cmdbox = NULL;
|
||||||
}
|
}
|
||||||
if (wn->split)
|
if (wn->container)
|
||||||
{
|
{
|
||||||
_split_free(wn->split);
|
wn->container->u.api->free(wn->container);
|
||||||
wn->split = NULL;
|
wn->container = NULL;
|
||||||
}
|
}
|
||||||
if (wn->win)
|
if (wn->win)
|
||||||
{
|
{
|
||||||
|
@ -648,6 +739,7 @@ struct _Sizeinfo
|
||||||
int req;
|
int req;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if 0
|
||||||
static void
|
static void
|
||||||
_split_size_walk(Split *sp, Sizeinfo *info)
|
_split_size_walk(Split *sp, Sizeinfo *info)
|
||||||
{
|
{
|
||||||
|
@ -725,6 +817,7 @@ _split_size_walk(Split *sp, Sizeinfo *info)
|
||||||
info->step_y = inforet.step_y;
|
info->step_y = inforet.step_y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_size_job(void *data)
|
_size_job(void *data)
|
||||||
|
@ -734,11 +827,14 @@ _size_job(void *data)
|
||||||
Evas_Coord mw = 0, mh = 0;
|
Evas_Coord mw = 0, mh = 0;
|
||||||
|
|
||||||
wn->size_job = NULL;
|
wn->size_job = NULL;
|
||||||
|
/* TODO: boris */
|
||||||
|
#if 0
|
||||||
_split_size_walk(wn->split, &info);
|
_split_size_walk(wn->split, &info);
|
||||||
if (wn->split->panes)
|
if (wn->split->panes)
|
||||||
evas_object_size_hint_min_get(wn->split->panes, &mw, &mh);
|
evas_object_size_hint_min_get(wn->split->panes, &mw, &mh);
|
||||||
else
|
else
|
||||||
evas_object_size_hint_min_get(wn->split->term->bg, &mw, &mh);
|
evas_object_size_hint_min_get(wn->split->term->bg, &mw, &mh);
|
||||||
|
#endif
|
||||||
elm_win_size_base_set(wn->win, mw - info.step_x, mh - info.step_y);
|
elm_win_size_base_set(wn->win, mw - info.step_x, mh - info.step_y);
|
||||||
elm_win_size_step_set(wn->win, info.step_x, info.step_y);
|
elm_win_size_step_set(wn->win, info.step_x, info.step_y);
|
||||||
evas_object_size_hint_min_set(wn->backbg, mw, mh);
|
evas_object_size_hint_min_set(wn->backbg, mw, mh);
|
||||||
|
@ -775,6 +871,7 @@ _cb_size_hint(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event EIN
|
||||||
term->wn->size_job = ecore_job_add(_size_job, term->wn);
|
term->wn->size_job = ecore_job_add(_size_job, term->wn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
static Split *
|
static Split *
|
||||||
_split_split_find(Split *sp, Evas_Object *term, Term **ptm)
|
_split_split_find(Split *sp, Evas_Object *term, Term **ptm)
|
||||||
{
|
{
|
||||||
|
@ -810,10 +907,13 @@ _split_split_find(Split *sp, Evas_Object *term, Term **ptm)
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static Split *
|
static Split *
|
||||||
_split_find(Evas_Object *win, Evas_Object *term, Term **ptm)
|
_split_find(Evas_Object *win EINA_UNUSED, Evas_Object *term EINA_UNUSED, Term **ptm EINA_UNUSED)
|
||||||
{
|
{
|
||||||
|
/* TODO: boris */
|
||||||
|
#if 0
|
||||||
Win *wn;
|
Win *wn;
|
||||||
Eina_List *l;
|
Eina_List *l;
|
||||||
|
|
||||||
|
@ -821,6 +921,7 @@ _split_find(Evas_Object *win, Evas_Object *term, Term **ptm)
|
||||||
{
|
{
|
||||||
if (wn->win == win) return _split_split_find(wn->split, term, ptm);
|
if (wn->win == win) return _split_split_find(wn->split, term, ptm);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1063,6 +1164,7 @@ main_split_v(Evas_Object *win, Evas_Object *term, char *cmd)
|
||||||
_split_split(sp, EINA_FALSE, cmd);
|
_split_split(sp, EINA_FALSE, cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
static void
|
static void
|
||||||
_split_append(Split *sp, Eina_List **flat)
|
_split_append(Split *sp, Eina_List **flat)
|
||||||
{
|
{
|
||||||
|
@ -1074,7 +1176,9 @@ _split_append(Split *sp, Eina_List **flat)
|
||||||
_split_append(sp->s2, flat);
|
_split_append(sp->s2, flat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 0
|
||||||
static Eina_List *
|
static Eina_List *
|
||||||
_split_flatten(Split *sp)
|
_split_flatten(Split *sp)
|
||||||
{
|
{
|
||||||
|
@ -1083,10 +1187,13 @@ _split_flatten(Split *sp)
|
||||||
_split_append(sp, &flat);
|
_split_append(sp, &flat);
|
||||||
return flat;
|
return flat;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static Term *
|
static Term *
|
||||||
_term_next_get(Term *termin)
|
_term_next_get(Term *termin)
|
||||||
{
|
{
|
||||||
|
/* TODO: boris */
|
||||||
|
#if 0
|
||||||
Split *sp;
|
Split *sp;
|
||||||
Eina_List *flat, *l;
|
Eina_List *flat, *l;
|
||||||
|
|
||||||
|
@ -1113,11 +1220,15 @@ _term_next_get(Term *termin)
|
||||||
eina_list_free(flat);
|
eina_list_free(flat);
|
||||||
if (sp->terms) return sp->terms->data;
|
if (sp->terms) return sp->terms->data;
|
||||||
return sp->term;
|
return sp->term;
|
||||||
|
#endif
|
||||||
|
return termin;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Term *
|
static Term *
|
||||||
_term_prev_get(Term *termin)
|
_term_prev_get(Term *termin)
|
||||||
{
|
{
|
||||||
|
/* TODO: boris */
|
||||||
|
#if 0
|
||||||
Split *sp;
|
Split *sp;
|
||||||
Eina_List *flat, *l;
|
Eina_List *flat, *l;
|
||||||
|
|
||||||
|
@ -1150,6 +1261,8 @@ _term_prev_get(Term *termin)
|
||||||
l = eina_list_last(sp->terms);
|
l = eina_list_last(sp->terms);
|
||||||
if (l) return l->data;
|
if (l) return l->data;
|
||||||
return sp->term;
|
return sp->term;
|
||||||
|
#endif
|
||||||
|
return termin;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1212,15 +1325,6 @@ _split_merge(Split *spp, Split *sp, const char *slot)
|
||||||
/* }}} */
|
/* }}} */
|
||||||
/* {{{ Term */
|
/* {{{ Term */
|
||||||
|
|
||||||
void win_term_swallow(Win *wn, Term *term)
|
|
||||||
{
|
|
||||||
Evas_Object *base = win_base_get(wn);
|
|
||||||
Evas *evas = evas_object_evas_get(base);
|
|
||||||
|
|
||||||
edje_object_part_swallow(base, "terminology.content", term->bg);
|
|
||||||
_cb_size_hint(term, evas, term->term, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void change_theme(Evas_Object *win, Config *config)
|
void change_theme(Evas_Object *win, Config *config)
|
||||||
{
|
{
|
||||||
const Eina_List *terms, *l;
|
const Eina_List *terms, *l;
|
||||||
|
|
|
@ -35,8 +35,7 @@ Evas_Object *win_base_get(Win *wn);
|
||||||
Evas_Object *win_evas_object_get(Win *win);
|
Evas_Object *win_evas_object_get(Win *win);
|
||||||
Eina_List * win_terms_get(Win *wn);
|
Eina_List * win_terms_get(Win *wn);
|
||||||
Config *win_config_get(Win *wn);
|
Config *win_config_get(Win *wn);
|
||||||
void win_term_swallow(Win *wn, Term *term);
|
int win_solo_term_set(Win *wn, Term *term);
|
||||||
void win_add_split(Win *wn, Term *term);
|
|
||||||
void win_sizing_handle(Win *wn);
|
void win_sizing_handle(Win *wn);
|
||||||
|
|
||||||
void term_next(Term *term);
|
void term_next(Term *term);
|
||||||
|
|
Loading…
Reference in New Issue