add to READMe and... add logic to find urls under the mouse. also

email addresses. seems to work well imho. :)



SVN revision: 73243
devs/lucas/wip
Carsten Haitzler 11 years ago
parent 9b476039cf
commit 2f57d0c7a9
  1. 16
      README
  2. 199
      src/bin/termio.c

@ -1,7 +1,11 @@
Terminology
-----------
Terminology 0.1.0
An EFL terminal emulator
******************************************************************************
FOR ANY ISSUES PLEASE EMAIL:
enlightenment-devel@lists.sourceforge.net
******************************************************************************
Requirements:
-------------
@ -15,9 +19,15 @@ Requirements:
* emotion
* ecore-imf
* ecore-imf-evas
* ecore-input 1.3 (1.2.99 SVN latest)
Please see http://www.enlightenment.org for information on these.
This is an EFL terminal emulator with some extra bells and whistles.
It's brand new and was only started near the begining of June 2012, so
expecting it to do everything a mature terminal emulator does is a bit
premature, but considering it's young age, it does a lot.
Compiling:
----------

@ -34,6 +34,9 @@ struct _Termio
Eina_Bool sel : 1;
Eina_Bool makesel : 1;
} cur;
struct {
int cx, cy;
} mouse;
struct {
struct {
int x, y;
@ -48,6 +51,7 @@ struct _Termio
Termpty *pty;
Ecore_Animator *anim;
Ecore_Timer *delayed_size_timer;
Ecore_Job *mouse_move_job;
Evas_Object *win;
Config *config;
Ecore_IMF_Context *imf;
@ -62,6 +66,179 @@ static Evas_Smart_Class _parent_sc = EVAS_SMART_CLASS_INIT_NULL;
static void _smart_calculate(Evas_Object *obj);
static Eina_Bool
coord_back(Termio *sd, int *x, int *y)
{
(*x)--;
if ((*x) < 0)
{
if ((*y) <= 0)
{
(*x)++;
return EINA_FALSE;
}
(*x) = sd->grid.w - 1;
(*y)--;
}
return EINA_TRUE;
}
static Eina_Bool
coord_forward(Termio *sd, int *x, int *y)
{
(*x)++;
if ((*x) >= sd->grid.w)
{
if ((*y) >= (sd->grid.h - 1))
{
(*x)--;
return EINA_FALSE;
}
(*x) = 0;
(*y)++;
}
return EINA_TRUE;
}
static void
_smart_mouseover_apply(Evas_Object *obj)
{
Termio *sd = evas_object_smart_data_get(obj);
char *s;
char endmatch = 0;
int x1, x2, y1, y2, len;
Eina_Bool goback = EINA_TRUE, goforward = EINA_FALSE, extend = EINA_FALSE;
if (!sd) return;
x1 = sd->mouse.cx;
y1 = sd->mouse.cy;
x2 = sd->mouse.cx;
y2 = sd->mouse.cy;
if (!coord_back(sd, &x1, &y1)) goback = EINA_FALSE;
for (;;)
{
s = termio_selection_get(obj,
x1, y1 - sd->scroll,
x2, y2 - sd->scroll);
if (!s) break;
if (goback)
{
if ((!strncasecmp(s, "http://", 7))||
(!strncasecmp(s, "https://", 8)) ||
(!strncasecmp(s, "ftp://", 6)))
{
goback = EINA_FALSE;
coord_back(sd, &x1, &y1);
free(s);
s = termio_selection_get(obj,
x1, y1 - sd->scroll,
x2, y2 - sd->scroll);
if (!s) break;
if (s[0] == '"') endmatch = '"';
else if (s[0] == '\'') endmatch = '\'';
else if (s[0] == '<') endmatch = '>';
coord_forward(sd, &x1, &y1);
free(s);
s = termio_selection_get(obj,
x1, y1 - sd->scroll,
x2, y2 - sd->scroll);
if (!s) break;
}
else if ((isspace(s[0])) ||
(s[0] == '"') ||
(s[0] == '\'') ||
(s[0] == '<') ||
(s[0] == '='))
{
if (s[0] == '"') endmatch = '"';
else if (s[0] == '\'') endmatch = '\'';
else if (s[0] == '<') endmatch = '>';
if ((!strncasecmp((s + 1), "www.", 4)) ||
(!strncasecmp((s + 1), "ftp.", 4)))
{
goback = EINA_FALSE;
coord_forward(sd, &x1, &y1);
}
else if (strchr((s + 2), '@'))
{
goback = EINA_FALSE;
coord_forward(sd, &x1, &y1);
}
else
{
free(s);
s = NULL;
break;
}
}
}
if (goforward)
{
len = strlen(s);
if (len > 1)
{
if (((endmatch) && (s[len - 1] == endmatch)) ||
((!endmatch) && (isspace(s[len - 1]))))
{
goforward = EINA_FALSE;
coord_back(sd, &x2, &y2);
}
}
}
if (goforward)
{
if (!coord_forward(sd, &x2, &y2)) goforward = EINA_FALSE;
}
if (goback)
{
if (!coord_back(sd, &x1, &y1)) goback = EINA_FALSE;
}
else if (!extend)
{
goforward = EINA_TRUE;
extend = EINA_TRUE;
}
if ((!goback) && (!goforward))
{
free(s);
s = termio_selection_get(obj,
x1, y1 - sd->scroll,
x2, y2 - sd->scroll);
break;
}
free(s);
s = NULL;
}
if (s)
{
len = strlen(s);
while (len > 1)
{
if (isspace(s[len - 1]))
{
s[len - 1] = 0;
len--;
}
else break;
}
if (!isspace(s[0]))
{
if ((strchr(s, '@')) ||
(!strncasecmp(s, "http://", 7))||
(!strncasecmp(s, "https://", 8)) ||
(!strncasecmp(s, "ftp://", 6)) ||
(!strncasecmp(s, "www.", 4)) ||
(!strncasecmp(s, "ftp.", 4)))
{
printf("FOUND: '%s' @ %i,%i -> %i,%i\n", s, x1, y1, x2, y2);
// XXX: record coords and url string
}
}
free(s);
}
}
static void
_smart_apply(Evas_Object *obj)
{
@ -288,6 +465,7 @@ _smart_apply(Evas_Object *obj)
evas_object_hide(sd->cur.selo2);
evas_object_hide(sd->cur.selo3);
}
_smart_mouseover_apply(obj);
}
static void
@ -1072,6 +1250,17 @@ _selection_dbl_fix(Evas_Object *obj)
}
}
static void
_smart_cb_mouse_move_job(void *data)
{
Termio *sd;
sd = evas_object_smart_data_get(data);
if (!sd) return;
sd->mouse_move_job = NULL;
_smart_mouseover_apply(data);
}
static void
_smart_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event)
{
@ -1162,10 +1351,14 @@ _smart_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__
Evas_Event_Mouse_Move *ev = event;
Termio *sd;
int cx, cy;
Eina_Bool mc_change = EINA_FALSE;
sd = evas_object_smart_data_get(data);
if (!sd) return;
_smart_xy_to_cursor(data, ev->cur.canvas.x, ev->cur.canvas.y, &cx, &cy);
if ((sd->mouse.cx != cx) || (sd->mouse.cy != cy)) mc_change = EINA_TRUE;
sd->mouse.cx = cx;
sd->mouse.cy = cy;
_rep_mouse_move(data, ev, cx, cy);
if (sd->cur.makesel)
{
@ -1180,6 +1373,11 @@ _smart_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__
_selection_dbl_fix(data);
_smart_update_queue(data, sd);
}
if (mc_change)
{
if (sd->mouse_move_job) ecore_job_del(sd->mouse_move_job);
sd->mouse_move_job = ecore_job_add(_smart_cb_mouse_move_job, data);
}
}
static void
@ -1516,6 +1714,7 @@ _smart_del(Evas_Object *obj)
if (sd->cur.selo3) evas_object_del(sd->cur.selo3);
if (sd->anim) ecore_animator_del(sd->anim);
if (sd->delayed_size_timer) ecore_timer_del(sd->delayed_size_timer);
if (sd->mouse_move_job) ecore_job_del(sd->mouse_move_job);
if (sd->font.name) eina_stringshare_del(sd->font.name);
if (sd->pty) termpty_free(sd->pty);
EINA_LIST_FREE(sd->seq, str) eina_stringshare_del(str);

Loading…
Cancel
Save