image: "bg_led_base.png" COMP;
image: "bg_led.png" COMP;
image: "bg_led_strobe.png" COMP;
+ image: "pm_shadow.png" COMP;
+ image: "pm_overlay.png" COMP;
+ image: "pm_fill.png" COMP;
}
parts {
// other signals sent not handled here
}
////////////////////////////////////////////////////////////////////
+ // popup media over the terminal (until dismissed)
+ part { name: "popmedia_clip"; type: RECT;
+ mouse_events: 1;
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ visible: 0;
+ color: 255 255 255 0;
+ }
+ description { state: "visible" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ color: 255 255 255 255;
+ }
+ }
+ part { name: "popmedia_shadow";
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ rel1 {
+ to: "terminology.popmedia";
+ }
+ rel2 {
+ to: "terminology.popmedia";
+ }
+ image.normal: "pm_shadow.png";
+ image.border: 64 64 64 64;
+ image.border_scale_by: 0.1;
+ fill.smooth: 0;
+ visible: 0;
+ }
+ description { state: "visible" 0.0;
+ inherit: "default" 0.0;
+ rel1.offset: -32 -32;
+ rel2.offset: 31 31;
+ image.border_scale_by: 1.0;
+ visible: 1;
+ }
+ }
+ part { name: "popmedia_fill";
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ rel1.to: "terminology.popmedia";
+ rel2.to: "terminology.popmedia";
+ image.normal: "pm_fill.png";
+ fill {
+ size.relative: 0.0 0.0;
+ size.offset: 64 64;
+ }
+ }
+ }
+ part { name: "terminology.popmedia"; type: SWALLOW;
+ clip_to: "popmedia_clip";
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ rel1.relative: 0.5 0.5;
+ rel2.relative: 0.5 0.5;
+ visible: 0;
+ }
+ description { state: "image" 0.0;
+ inherit: "default" 0.0;
+ rel1.relative: 0.1 0.1;
+ rel2.relative: 0.9 0.9;
+ visible: 1;
+ }
+ description { state: "scale" 0.0;
+ inherit: "default" 0.0;
+ rel1.relative: 0.1 0.1;
+ rel2.relative: 0.9 0.9;
+ visible: 1;
+ }
+ description { state: "edje" 0.0;
+ inherit: "default" 0.0;
+ rel1.relative: 0.1 0.1;
+ rel2.relative: 0.9 0.9;
+ visible: 1;
+ }
+ description { state: "movie" 0.0;
+ inherit: "default" 0.0;
+ rel1.relative: 0.1 0.1;
+ rel2.relative: 0.9 0.9;
+ visible: 1;
+ }
+ }
+ part { name: "popmedia_overlay";
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ rel1.to: "terminology.popmedia";
+ rel2.to: "terminology.popmedia";
+ image.normal: "pm_overlay.png";
+ fill.smooth: 0;
+ visible: 0;
+ }
+ description { state: "visible" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part { name: "popmedia_bevel";
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ rel1.to: "terminology.popmedia";
+ rel2.to: "terminology.popmedia";
+ image.normal: "bg_bevel.png";
+ image.border: 3 3 5 3;
+ image.middle: 0;
+ fill.smooth: 0;
+ visible: 0;
+ }
+ description { state: "visible" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part { name: "popmedia_glintclip"; type: RECT;
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ visible: 0;
+ }
+ description { state: "visible" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part { name: "popmedia_glint";
+ mouse_events: 0;
+ clip_to: "popmedia_glintclip";
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ min: 79 5;
+ max: 79 5;
+ rel1 {
+ to: "terminology.popmedia";
+ relative: 0.0 0.0;
+ offset: 0 0;
+ }
+ rel2 {
+ to: "terminology.popmedia";
+ relative: 1.0 0.0;
+ offset: -1 0;
+ }
+ image.normal: "bg_glint.png";
+ visible: 0;
+ }
+ description { state: "visible" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part { name: "popmedia_shine";
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ rel1.to: "terminology.popmedia";
+ rel2.to: "terminology.popmedia";
+ image.normal: "bg_shine.png";
+ fill.smooth: 0;
+ align: 0.5 0.0;
+ aspect: (255/120) (255/120);
+ aspect_preference: HORIZONTAL;
+ visible: 0;
+ }
+ description { state: "visible" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part { name: "popmedia_dismiss"; type: RECT;
+ mouse_events: 1;
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ color: 0 0 0 0;
+ visible: 0;
+ rel1.to: "terminology.popmedia";
+ rel2.to: "terminology.popmedia";
+ }
+ description { state: "visible" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ program { name: "popmedia_dismiss";
+ signal: "mouse,clicked,*";
+ source: "popmedia_dismiss";
+ action: STATE_SET "default" 0.0;
+ transition: DECELERATE 0.5;
+ target: "terminology.popmedia";
+ target: "popmedia_clip";
+ target: "popmedia_dismiss";
+ target: "popmedia_shadow";
+ target: "popmedia_fill";
+ target: "popmedia_overlay";
+ target: "popmedia_bevel";
+ target: "popmedia_glint";
+ target: "popmedia_glintclip";
+ target: "popmedia_shine";
+ after: "popmedia_dismiss2";
+ }
+ program { name: "popmedia_dismiss2";
+ action: SIGNAL_EMIT "popmedia,done" "terminology";
+ }
+ program { name: "popmedia_off";
+ signal: "popmedia,off";
+ source: "terminology";
+ action: STATE_SET "default" 0.0;
+ transition: DECELERATE 0.2;
+ target: "terminology.popmedia";
+ target: "popmedia_clip";
+ target: "popmedia_dismiss";
+ target: "popmedia_shadow";
+ target: "popmedia_fill";
+ target: "popmedia_overlay";
+ target: "popmedia_bevel";
+ target: "popmedia_glint";
+ target: "popmedia_glintclip";
+ target: "popmedia_shine";
+ after: "popmedia_dismiss2";
+ }
+ program { name: "popmedia_img";
+ signal: "popmedia,image";
+ source: "terminology";
+ action: STATE_SET "image" 0.0;
+ transition: DECELERATE 0.2;
+ target: "terminology.popmedia";
+ }
+ program { name: "popmedia_scale";
+ signal: "popmedia,scale";
+ source: "terminology";
+ action: STATE_SET "scale" 0.0;
+ transition: DECELERATE 0.2;
+ target: "terminology.popmedia";
+ }
+ program { name: "popmedia_edje";
+ signal: "popmedia,edje";
+ source: "terminology";
+ action: STATE_SET "edje" 0.0;
+ transition: DECELERATE 0.2;
+ target: "terminology.popmedia";
+ }
+ program { name: "popmedia_mov";
+ signal: "popmedia,movie";
+ source: "terminology";
+ action: STATE_SET "movie" 0.0;
+ transition: DECELERATE 0.2;
+ target: "terminology.popmedia";
+ }
+ program { name: "popmedia_img2";
+ signal: "popmedia,image";
+ source: "terminology";
+ action: STATE_SET "visible" 0.0;
+ transition: DECELERATE 0.2;
+ target: "popmedia_clip";
+ target: "popmedia_dismiss";
+ target: "popmedia_shadow";
+ target: "popmedia_fill";
+ target: "popmedia_overlay";
+ target: "popmedia_bevel";
+ target: "popmedia_glint";
+ target: "popmedia_glintclip";
+ target: "popmedia_shine";
+ }
+ program { name: "popmedia_scale2";
+ signal: "popmedia,scale";
+ source: "terminology";
+ action: STATE_SET "visible" 0.0;
+ transition: DECELERATE 0.2;
+ target: "popmedia_clip";
+ target: "popmedia_dismiss";
+ target: "popmedia_shadow";
+ target: "popmedia_fill";
+ target: "popmedia_overlay";
+ target: "popmedia_bevel";
+ target: "popmedia_glint";
+ target: "popmedia_glintclip";
+ target: "popmedia_shine";
+ }
+ program { name: "popmedia_edje2";
+ signal: "popmedia,edje";
+ source: "terminology";
+ action: STATE_SET "visible" 0.0;
+ transition: DECELERATE 0.2;
+ target: "popmedia_clip";
+ target: "popmedia_dismiss";
+ target: "popmedia_shadow";
+ target: "popmedia_fill";
+ target: "popmedia_overlay";
+ target: "popmedia_bevel";
+ target: "popmedia_glint";
+ target: "popmedia_glintclip";
+ target: "popmedia_shine";
+ }
+ program { name: "popmedia_mov2";
+ signal: "popmedia,movie";
+ source: "terminology";
+ action: STATE_SET "visible" 0.0;
+ transition: DECELERATE 0.2;
+ target: "popmedia_clip";
+ target: "popmedia_dismiss";
+ target: "popmedia_shadow";
+ target: "popmedia_fill";
+ target: "popmedia_overlay";
+ target: "popmedia_bevel";
+ target: "popmedia_glint";
+ target: "popmedia_glintclip";
+ target: "popmedia_shine";
+ }
+
+ ////////////////////////////////////////////////////////////////////
// overlayed options and controls
part { name: "terminology.about"; type: SWALLOW;
scale: 1;
}
//////////////////////////////////////////////////////////////////////////////
+ //// an object overlayd on text that is a link
+ group { name: "terminology/link";
+ images {
+ image: "lk_bottom.png" COMP;
+ image: "lk_left.png" COMP;
+ image: "lk_right.png" COMP;
+ }
+ parts {
+ part { name: "bottom";
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ image.normal: "lk_bottom.png";
+ image.border: 9 9 0 0;
+ align: 0.5 1.0;
+ min: 20 8;
+ rel1.offset: -6 0;
+ rel1.relative: 0.0 1.0;
+ rel2.offset: 5 0;
+ color: 100 200 255 255;
+ fill.smooth: 0;
+ }
+ }
+ part { name: "l";
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ image.normal: "lk_left.png";
+ align: 0.0 1.0;
+ min: 4 4;
+ rel1.offset: 16 -1;
+ rel1.relative: 0.0 1.0;
+ rel2.offset: 16 -1;
+ rel2.relative: 0.0 1.0;
+ color: 100 200 255 0;
+ }
+ description { state: "out" 0.0;
+ inherit: "default" 0.0;
+ min: 16 16;
+ rel1.offset: -10 -1;
+ rel2.offset: -10 -1;
+ color: 180 220 255 255;
+ }
+ description { state: "out2" 0.0;
+ inherit: "default" 0.0;
+ min: 32 32;
+ rel1.offset: -26 -1;
+ rel2.offset: -26 -1;
+ color: 100 200 255 0;
+ }
+ }
+ part { name: "r";
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ image.normal: "lk_right.png";
+ align: 1.0 1.0;
+ min: 4 4;
+ rel1.offset: -15 0;
+ rel1.relative: 1.0 1.0;
+ rel2.offset: -15 0;
+ rel2.relative: 1.0 1.0;
+ color: 100 200 255 0;
+ }
+ description { state: "out" 0.0;
+ inherit: "default" 0.0;
+ min: 16 16;
+ rel1.offset: 9 -1;
+ rel2.offset: 9 -1;
+ color: 180 220 255 255;
+ }
+ description { state: "out2" 0.0;
+ inherit: "default" 0.0;
+ min: 32 32;
+ rel1.offset: 25 -1;
+ rel2.offset: 25 -1;
+ color: 100 200 255 0;
+ }
+ }
+ part { name: "event"; type: RECT;
+ mouse_events: 1;
+ repeat_events: 1;
+ description { state: "default" 0.0;
+ color: 0 0 0 0;
+ }
+ }
+ programs {
+ program { name: "show";
+ signal: "show";
+ source: "";
+ action: STATE_SET "out" 0.0;
+ transition: LINEAR 0.3;
+ target: "l";
+ target: "r";
+ after: "show2";
+ }
+ program { name: "show2";
+ action: STATE_SET "default" 0.0;
+ action: STATE_SET "out2" 0.0;
+ transition: LINEAR 0.3;
+ target: "l";
+ target: "r";
+ after: "show3";
+ }
+ program { name: "show3";
+ action: STATE_SET "default" 0.0;
+ target: "l";
+ target: "r";
+ after: "show";
+ }
+ }
+ }
+ }
+
+//////////////////////////////////////////////////////////////////////////////
//// the multimedia controls
group { name: "terminology/mediactrl";
images {
media_play.png \
media_stop.png \
media_knob_pos.png \
-media_knob_vol.png
+media_knob_vol.png \
+pm_fill.png \
+pm_overlay.png \
+pm_shadow.png \
+lk_bottom.png \
+lk_left.png \
+lk_right.png
media.c media.h \
options.c options.h \
options_behavior.c options_behavior.h \
+options_helpers.c options_helpers.h \
options_font.c options_font.h \
options_video.c options_video.h \
options_theme.c options_theme.h \
EET_DATA_DESCRIPTOR_ADD_BASIC
(edd_base, Config, "font.bitmap", font.bitmap, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC
+ (edd_base, Config, "helper.email", helper.email, EET_T_STRING);
+ EET_DATA_DESCRIPTOR_ADD_BASIC
+ (edd_base, Config, "helper.url.general", helper.url.general, EET_T_STRING);
+ EET_DATA_DESCRIPTOR_ADD_BASIC
+ (edd_base, Config, "helper.url.video", helper.url.video, EET_T_STRING);
+ EET_DATA_DESCRIPTOR_ADD_BASIC
+ (edd_base, Config, "helper.url.image", helper.url.image, EET_T_STRING);
+ EET_DATA_DESCRIPTOR_ADD_BASIC
+ (edd_base, Config, "helper.local.general", helper.local.general, EET_T_STRING);
+ EET_DATA_DESCRIPTOR_ADD_BASIC
+ (edd_base, Config, "helper.local.video", helper.local.video, EET_T_STRING);
+ EET_DATA_DESCRIPTOR_ADD_BASIC
+ (edd_base, Config, "helper.local.image", helper.local.image, EET_T_STRING);
+ EET_DATA_DESCRIPTOR_ADD_BASIC
+ (edd_base, Config, "helper.inline_please", helper.inline_please, EET_T_UCHAR);
+ EET_DATA_DESCRIPTOR_ADD_BASIC
(edd_base, Config, "theme", theme, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC
(edd_base, Config, "background", background, EET_T_STRING);
config->font.bitmap = EINA_TRUE;
config->font.name = eina_stringshare_add("nexus.pcf");
config->font.size = 10;
+ config->helper.email = eina_stringshare_add("xdg-email");;
+ config->helper.url.general = eina_stringshare_add("xdg-open");
+ config->helper.url.video = eina_stringshare_add("xdg-open");
+ config->helper.url.image = eina_stringshare_add("xdg-open");
+ config->helper.local.general = eina_stringshare_add("xdg-open");
+ config->helper.local.video = eina_stringshare_add("xdg-open");
+ config->helper.local.image = eina_stringshare_add("xdg-open");
+ config->helper.inline_please = EINA_TRUE;
config->scrollback = 2000;
config->theme = eina_stringshare_add("default.edj");
config->background = NULL;
int size;
unsigned char bitmap;
} font;
+ struct {
+ const char *email;
+ struct {
+ const char *general;
+ const char *video;
+ const char *image;
+ } url, local;
+ Eina_Bool inline_please;
+ } helper;
const char *theme;
const char *background;
const char *wordsep;
int _log_domain = -1;
static Evas_Object *win = NULL, *bg = NULL, *term = NULL, *media = NULL;
+static Evas_Object *popmedia = NULL;
static Evas_Object *conform = NULL;
static Ecore_Timer *flush_timer = NULL;
static Eina_Bool focused = EINA_FALSE;
}
}
+static void
+_cb_popmedia_done(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *src __UNUSED__)
+{
+ if (popmedia)
+ {
+ evas_object_del(popmedia);
+ popmedia = NULL;
+ termio_mouseover_suspend_pushpop(term, -1);
+ }
+}
+
+static void
+_cb_popup(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__)
+{
+ Evas_Object *o;
+ Config *config = termio_config_get(term);
+ const char *src;
+ int type = 0;
+
+ if (!config) return;
+ src = termio_link_get(term);
+ if (!src) return;
+ if (popmedia) evas_object_del(popmedia);
+ if (!popmedia) termio_mouseover_suspend_pushpop(term, 1);
+ popmedia = o = media_add(win, src, config, MEDIA_POP, &type);
+ edje_object_part_swallow(bg, "terminology.popmedia", o);
+ evas_object_show(o);
+ if (type == TYPE_IMG)
+ edje_object_signal_emit(bg, "popmedia,image", "terminology");
+ else if (type == TYPE_SCALE)
+ edje_object_signal_emit(bg, "popmedia,scale", "terminology");
+ else if (type == TYPE_EDJE)
+ edje_object_signal_emit(bg, "popmedia,edje", "terminology");
+ else if (type == TYPE_MOV)
+ edje_object_signal_emit(bg, "popmedia,movie", "terminology");
+}
+
void
main_trans_update(const Config *config)
{
if (media) evas_object_del(media);
o = media = media_add(win, config->background, config, MEDIA_BG, &type);
edje_object_part_swallow(bg, "terminology.background", o);
+ evas_object_show(o);
if (type == TYPE_IMG)
edje_object_signal_emit(bg, "media,image", "terminology");
else if (type == TYPE_SCALE)
edje_object_signal_emit(bg, "media,edje", "terminology");
else if (type == TYPE_MOV)
edje_object_signal_emit(bg, "media,movie", "terminology");
- evas_object_show(o);
}
else
{
theme_auto_reload_enable(o);
elm_object_content_set(conform, o);
evas_object_show(o);
+
+ edje_object_signal_callback_add(o, "popmedia,done", "terminology",
+ _cb_popmedia_done, NULL);
if (pos_set)
{
evas_object_smart_callback_add(o, "change", _cb_change, NULL);
evas_object_smart_callback_add(o, "exited", _cb_exited, NULL);
evas_object_smart_callback_add(o, "bell", _cb_bell, NULL);
+ evas_object_smart_callback_add(o, "popup", _cb_popup, NULL);
evas_object_show(o);
main_trans_update(config);
{
int iw, ih;
- iw = w;
- ih = (sd->ih * w) / sd->iw;
- if (ih < h)
+ if (sd->mode == MEDIA_BG)
{
- ih = h;
- iw = (sd->iw * h) / sd->ih;
- if (iw < w) iw = w;
+ iw = w;
+ ih = (sd->ih * w) / sd->iw;
+ if (ih < h)
+ {
+ ih = h;
+ iw = (sd->iw * h) / sd->ih;
+ if (iw < w) iw = w;
+ }
+ }
+ else if (sd->mode == MEDIA_POP)
+ {
+ iw = w;
+ ih = (sd->ih * w) / sd->iw;
+ if (ih > h)
+ {
+ ih = h;
+ iw = (sd->iw * h) / sd->ih;
+ if (iw > w) iw = w;
+ }
+ if ((iw > sd->iw) || (ih > sd->ih))
+ {
+ iw = sd->iw;
+ ih = sd->ih;
+ }
}
x += ((w - iw) / 2);
y += ((h - ih) / 2);
{
int iw, ih;
- iw = w;
- ih = (sd->ih * w) / sd->iw;
- if (ih < h)
+ if (sd->mode == MEDIA_BG)
+ {
+ iw = w;
+ ih = (sd->ih * w) / sd->iw;
+ if (ih < h)
+ {
+ ih = h;
+ iw = (sd->iw * h) / sd->ih;
+ if (iw < w) iw = w;
+ }
+ }
+ else if (sd->mode == MEDIA_POP)
{
- ih = h;
- iw = (sd->iw * h) / sd->ih;
- if (iw < w) iw = w;
+ iw = w;
+ ih = (sd->ih * w) / sd->iw;
+ if (ih > h)
+ {
+ ih = h;
+ iw = (sd->iw * h) / sd->ih;
+ if (iw > w) iw = w;
+ }
}
x += ((w - iw) / 2);
y += ((h - ih) / 2);
ratio = emotion_object_ratio_get(sd->o_img);
if (ratio > 0.0) sd->iw = (sd->ih * ratio) + 0.5;
else ratio = (double)sd->iw / (double)sd->ih;
-
- iw = w;
- ih = w / ratio;
- if (ih < h)
+
+ if (sd->mode == MEDIA_BG)
{
- ih = h;
- iw = h * ratio;
- if (iw < w) iw = w;
+ iw = w;
+ ih = w / ratio;
+ if (ih < h)
+ {
+ ih = h;
+ iw = h * ratio;
+ if (iw < w) iw = w;
+ }
+ }
+ else if (sd->mode == MEDIA_POP)
+ {
+ iw = w;
+ ih = w / ratio;
+ if (ih > h)
+ {
+ ih = h;
+ iw = h * ratio;
+ if (iw > w) iw = w;
+ }
}
x += ((w - iw) / 2);
y += ((h - ih) / 2);
emotion_object_audio_volume_set(sd->o_img, vol);
edje_object_part_drag_value_set(sd->o_ctrl, "terminology.voldrag", vol, vol);
}
+
+int
+media_src_type_get(const char *src)
+{
+ int type = TYPE_UNKNOWN;
+
+ if (_is_fmt(src, extn_img)) type = TYPE_IMG;
+ else if (_is_fmt(src, extn_scale)) type = TYPE_SCALE;
+ else if (_is_fmt(src, extn_edj)) type = TYPE_EDJE;
+ else if (_is_fmt(src, extn_mov)) type = TYPE_MOV;
+ return type;
+}
#define _MEDIA_H__ 1
#define MEDIA_BG 0
+#define MEDIA_POP 1
-#define TYPE_IMG 0
-#define TYPE_SCALE 1
-#define TYPE_EDJE 2
-#define TYPE_MOV 3
+#define TYPE_UNKNOWN -1
+#define TYPE_IMG 0
+#define TYPE_SCALE 1
+#define TYPE_EDJE 2
+#define TYPE_MOV 3
#include "config.h"
void media_position_set(Evas_Object *obj, double pos);
void media_volume_set(Evas_Object *obj, double vol);
void media_stop(Evas_Object *obj);
+int media_src_type_get(const char *src);
#endif
#include <Elementary.h>
#include "options.h"
#include "options_font.h"
+#include "options_helpers.h"
#include "options_behavior.h"
#include "options_video.h"
#include "options_theme.h"
}
static void
+_cb_op_helpers(void *data, Evas_Object *obj __UNUSED__, void *event __UNUSED__)
+{
+ elm_box_clear(op_opbox);
+ options_helpers(op_opbox, data);
+}
+
+static void
_cb_op_tmp_chg(void *data, Evas_Object *obj __UNUSED__, void *event __UNUSED__)
{
Config *config = data;
"Video", _cb_op_video, term);
elm_toolbar_item_append(o, "system-run",
"Behavior", _cb_op_behavior, term);
+ elm_toolbar_item_append(o, "document-open",
+ "Helpers", _cb_op_helpers, term);
elm_box_pack_end(op_tbox, o);
evas_object_show(o);
--- /dev/null
+#include "private.h"
+
+#include <Elementary.h>
+#include "config.h"
+#include "termio.h"
+#include "options.h"
+#include "options_helpers.h"
+#include "main.h"
+
+static void
+_cb_op_helper_inline_chg(void *data, Evas_Object *obj, void *event __UNUSED__)
+{
+ Evas_Object *term = data;
+ Config *config = termio_config_get(term);
+ config->helper.inline_please = elm_check_state_get(obj);
+ config_save(config, NULL);
+}
+
+static void
+_cb_op_helper_email_chg(void *data, Evas_Object *obj, void *event __UNUSED__)
+{
+ Evas_Object *term = data;
+ Config *config = termio_config_get(term);
+ char *txt;
+
+ if (config->helper.email)
+ {
+ eina_stringshare_del(config->helper.email);
+ config->helper.email = NULL;
+ }
+ txt = elm_entry_markup_to_utf8(elm_object_text_get(obj));
+ if (txt)
+ {
+ config->helper.email = eina_stringshare_add(txt);
+ free(txt);
+ }
+ config_save(config, NULL);
+}
+
+static void
+_cb_op_helper_url_image_chg(void *data, Evas_Object *obj, void *event __UNUSED__)
+{
+ Evas_Object *term = data;
+ Config *config = termio_config_get(term);
+ char *txt;
+
+ if (config->helper.url.image)
+ {
+ eina_stringshare_del(config->helper.url.image);
+ config->helper.email = NULL;
+ }
+ txt = elm_entry_markup_to_utf8(elm_object_text_get(obj));
+ if (txt)
+ {
+ config->helper.url.image = eina_stringshare_add(txt);
+ free(txt);
+ }
+ config_save(config, NULL);
+}
+
+static void
+_cb_op_helper_url_video_chg(void *data, Evas_Object *obj, void *event __UNUSED__)
+{
+ Evas_Object *term = data;
+ Config *config = termio_config_get(term);
+ char *txt;
+
+ if (config->helper.url.video)
+ {
+ eina_stringshare_del(config->helper.url.video);
+ config->helper.email = NULL;
+ }
+ txt = elm_entry_markup_to_utf8(elm_object_text_get(obj));
+ if (txt)
+ {
+ config->helper.url.video = eina_stringshare_add(txt);
+ free(txt);
+ }
+ config_save(config, NULL);
+}
+
+static void
+_cb_op_helper_url_general_chg(void *data, Evas_Object *obj, void *event __UNUSED__)
+{
+ Evas_Object *term = data;
+ Config *config = termio_config_get(term);
+ char *txt;
+
+ if (config->helper.url.general)
+ {
+ eina_stringshare_del(config->helper.url.general);
+ config->helper.email = NULL;
+ }
+ txt = elm_entry_markup_to_utf8(elm_object_text_get(obj));
+ if (txt)
+ {
+ config->helper.url.general = eina_stringshare_add(txt);
+ free(txt);
+ }
+ config_save(config, NULL);
+}
+
+static void
+_cb_op_helper_local_image_chg(void *data, Evas_Object *obj, void *event __UNUSED__)
+{
+ Evas_Object *term = data;
+ Config *config = termio_config_get(term);
+ char *txt;
+
+ if (config->helper.local.image)
+ {
+ eina_stringshare_del(config->helper.local.image);
+ config->helper.email = NULL;
+ }
+ txt = elm_entry_markup_to_utf8(elm_object_text_get(obj));
+ if (txt)
+ {
+ config->helper.local.image = eina_stringshare_add(txt);
+ free(txt);
+ }
+ config_save(config, NULL);
+}
+
+static void
+_cb_op_helper_local_video_chg(void *data, Evas_Object *obj, void *event __UNUSED__)
+{
+ Evas_Object *term = data;
+ Config *config = termio_config_get(term);
+ char *txt;
+
+ if (config->helper.local.video)
+ {
+ eina_stringshare_del(config->helper.local.video);
+ config->helper.email = NULL;
+ }
+ txt = elm_entry_markup_to_utf8(elm_object_text_get(obj));
+ if (txt)
+ {
+ config->helper.local.video = eina_stringshare_add(txt);
+ free(txt);
+ }
+ config_save(config, NULL);
+}
+
+static void
+_cb_op_helper_local_general_chg(void *data, Evas_Object *obj, void *event __UNUSED__)
+{
+ Evas_Object *term = data;
+ Config *config = termio_config_get(term);
+ char *txt;
+
+ if (config->helper.local.general)
+ {
+ eina_stringshare_del(config->helper.local.general);
+ config->helper.email = NULL;
+ }
+ txt = elm_entry_markup_to_utf8(elm_object_text_get(obj));
+ if (txt)
+ {
+ config->helper.local.general = eina_stringshare_add(txt);
+ free(txt);
+ }
+ config_save(config, NULL);
+}
+
+void
+options_helpers(Evas_Object *opbox, Evas_Object *term)
+{
+ Config *config = termio_config_get(term);
+ Evas_Object *o, *bx, *sc;
+ char *txt;
+
+ o = elm_check_add(opbox);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(o, "Inline if possible");
+ elm_check_state_set(o, config->helper.inline_please);
+ elm_box_pack_end(opbox, o);
+ evas_object_show(o);
+ evas_object_smart_callback_add(o, "changed",
+ _cb_op_helper_inline_chg, term);
+
+ o = elm_separator_add(opbox);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
+ elm_separator_horizontal_set(o, EINA_TRUE);
+ elm_box_pack_end(opbox, o);
+ evas_object_show(o);
+
+ sc = o = elm_scroller_add(opbox);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(opbox, o);
+ evas_object_show(o);
+
+ bx = o = elm_box_add(opbox);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.0);
+ elm_object_content_set(sc, o);
+ evas_object_show(o);
+
+ o = elm_label_add(bx);
+ evas_object_size_hint_weight_set(o, 0.0, 0.0);
+ evas_object_size_hint_align_set(o, 0.0, 0.5);
+ elm_object_text_set(o, "E-mail:");
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ o = elm_entry_add(bx);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
+ elm_entry_single_line_set(o, EINA_TRUE);
+ elm_entry_scrollable_set(o, EINA_TRUE);
+ elm_entry_scrollbar_policy_set(o, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ txt = elm_entry_utf8_to_markup(config->helper.email);
+ if (txt)
+ {
+ elm_object_text_set(o, txt);
+ free(txt);
+ }
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+ evas_object_smart_callback_add(o, "changed",
+ _cb_op_helper_email_chg, term);
+
+ o = elm_label_add(bx);
+ evas_object_size_hint_weight_set(o, 0.0, 0.0);
+ evas_object_size_hint_align_set(o, 0.0, 0.5);
+ elm_object_text_set(o, "URL (Images):");
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ o = elm_entry_add(bx);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
+ elm_entry_single_line_set(o, EINA_TRUE);
+ elm_entry_scrollable_set(o, EINA_TRUE);
+ elm_entry_scrollbar_policy_set(o, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ txt = elm_entry_utf8_to_markup(config->helper.url.image);
+ if (txt)
+ {
+ elm_object_text_set(o, txt);
+ free(txt);
+ }
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+ evas_object_smart_callback_add(o, "changed",
+ _cb_op_helper_url_image_chg, term);
+
+ o = elm_label_add(bx);
+ evas_object_size_hint_weight_set(o, 0.0, 0.0);
+ evas_object_size_hint_align_set(o, 0.0, 0.5);
+ elm_object_text_set(o, "URL (Video):");
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ o = elm_entry_add(bx);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
+ elm_entry_single_line_set(o, EINA_TRUE);
+ elm_entry_scrollable_set(o, EINA_TRUE);
+ elm_entry_scrollbar_policy_set(o, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ txt = elm_entry_utf8_to_markup(config->helper.url.video);
+ if (txt)
+ {
+ elm_object_text_set(o, txt);
+ free(txt);
+ }
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+ evas_object_smart_callback_add(o, "changed",
+ _cb_op_helper_url_video_chg, term);
+
+ o = elm_label_add(bx);
+ evas_object_size_hint_weight_set(o, 0.0, 0.0);
+ evas_object_size_hint_align_set(o, 0.0, 0.5);
+ elm_object_text_set(o, "URL (All):");
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ o = elm_entry_add(bx);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
+ elm_entry_single_line_set(o, EINA_TRUE);
+ elm_entry_scrollable_set(o, EINA_TRUE);
+ elm_entry_scrollbar_policy_set(o, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ txt = elm_entry_utf8_to_markup(config->helper.url.general);
+ if (txt)
+ {
+ elm_object_text_set(o, txt);
+ free(txt);
+ }
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+ evas_object_smart_callback_add(o, "changed",
+ _cb_op_helper_url_general_chg, term);
+
+ o = elm_label_add(bx);
+ evas_object_size_hint_weight_set(o, 0.0, 0.0);
+ evas_object_size_hint_align_set(o, 0.0, 0.5);
+ elm_object_text_set(o, "Local (Images):");
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ o = elm_entry_add(bx);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
+ elm_entry_single_line_set(o, EINA_TRUE);
+ elm_entry_scrollable_set(o, EINA_TRUE);
+ elm_entry_scrollbar_policy_set(o, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ txt = elm_entry_utf8_to_markup(config->helper.local.image);
+ if (txt)
+ {
+ elm_object_text_set(o, txt);
+ free(txt);
+ }
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+ evas_object_smart_callback_add(o, "changed",
+ _cb_op_helper_local_image_chg, term);
+
+ o = elm_label_add(bx);
+ evas_object_size_hint_weight_set(o, 0.0, 0.0);
+ evas_object_size_hint_align_set(o, 0.0, 0.5);
+ elm_object_text_set(o, "Local (Video):");
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ o = elm_entry_add(bx);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
+ elm_entry_single_line_set(o, EINA_TRUE);
+ elm_entry_scrollable_set(o, EINA_TRUE);
+ elm_entry_scrollbar_policy_set(o, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ txt = elm_entry_utf8_to_markup(config->helper.local.video);
+ if (txt)
+ {
+ elm_object_text_set(o, txt);
+ free(txt);
+ }
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+ evas_object_smart_callback_add(o, "changed",
+ _cb_op_helper_local_video_chg, term);
+
+ o = elm_label_add(bx);
+ evas_object_size_hint_weight_set(o, 0.0, 0.0);
+ evas_object_size_hint_align_set(o, 0.0, 0.5);
+ elm_object_text_set(o, "Local (All):");
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ o = elm_entry_add(bx);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
+ elm_entry_single_line_set(o, EINA_TRUE);
+ elm_entry_scrollable_set(o, EINA_TRUE);
+ elm_entry_scrollbar_policy_set(o, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ txt = elm_entry_utf8_to_markup(config->helper.local.general);
+ if (txt)
+ {
+ elm_object_text_set(o, txt);
+ free(txt);
+ }
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+ evas_object_smart_callback_add(o, "changed",
+ _cb_op_helper_local_general_chg, term);
+
+ evas_object_size_hint_weight_set(opbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(opbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(o);
+}
--- /dev/null
+void options_helpers(Evas_Object *opbox, Evas_Object *term);
#include "keyin.h"
#include "config.h"
#include "utils.h"
+#include "media.h"
typedef struct _Termio Termio;
} sel1, sel2;
Eina_Bool sel : 1;
} backup;
+ struct {
+ char *string;
+ int x1, y1, x2, y2;
+ int suspend;
+ Eina_List *objs;
+ } link;
int zoom_fontsize_start;
int scroll;
unsigned int last_keyup;
Termpty *pty;
Ecore_Animator *anim;
Ecore_Timer *delayed_size_timer;
+ Ecore_Timer *link_do_timer;
Ecore_Job *mouse_move_job;
Evas_Object *win;
Config *config;
Eina_Bool have_sel : 1;
Eina_Bool noreqsize : 1;
Eina_Bool composing : 1;
+ Eina_Bool didclick : 1;
};
static Evas_Smart *_smart = NULL;
return EINA_TRUE;
}
-static void
-_smart_mouseover_apply(Evas_Object *obj)
+static char *
+_magic_string_find(Evas_Object *obj, int cx, int cy, int *x1r, int *y1r, int *x2r, int *y2r)
{
Termio *sd = evas_object_smart_data_get(obj);
char *s;
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 (!sd) return NULL;
+ x1 = cx;
+ y1 = cy;
+ x2 = cx;
+ y2 = cy;
if (!coord_back(sd, &x1, &y1)) goback = EINA_FALSE;
for (;;)
{
{
if ((!strncasecmp(s, "http://", 7))||
(!strncasecmp(s, "https://", 8)) ||
+ (!strncasecmp(s, "file://", 7)) ||
(!strncasecmp(s, "ftp://", 6)))
{
goback = EINA_FALSE;
else if (s[0] == '\'') endmatch = '\'';
else if (s[0] == '<') endmatch = '>';
if ((!strncasecmp((s + 1), "www.", 4)) ||
- (!strncasecmp((s + 1), "ftp.", 4)))
+ (!strncasecmp((s + 1), "ftp.", 4)) ||
+ (!strncasecmp((s + 1), "/", 1)))
{
goback = EINA_FALSE;
coord_forward(sd, &x1, &y1);
goback = EINA_FALSE;
coord_forward(sd, &x1, &y1);
}
+ else if (s[0] == '=')
+ {
+ }
else
{
free(s);
if (len > 1)
{
if (((endmatch) && (s[len - 1] == endmatch)) ||
- ((!endmatch) && (isspace(s[len - 1]))))
+ ((!endmatch) &&
+ ((isspace(s[len - 1])) || (s[len - 1] == '>'))
+ ))
{
goforward = EINA_FALSE;
coord_back(sd, &x2, &y2);
{
if (!coord_back(sd, &x1, &y1)) goback = EINA_FALSE;
}
- else if (!extend)
+ if ((!extend) && (!goback))
{
goforward = EINA_TRUE;
extend = EINA_TRUE;
}
else break;
}
- if (!isspace(s[0]))
+ if ((!isspace(s[0])) && (len > 1))
{
if ((strchr(s, '@')) ||
(!strncasecmp(s, "http://", 7))||
(!strncasecmp(s, "https://", 8)) ||
(!strncasecmp(s, "ftp://", 6)) ||
+ (!strncasecmp(s, "file://", 7)) ||
(!strncasecmp(s, "www.", 4)) ||
- (!strncasecmp(s, "ftp.", 4)))
+ (!strncasecmp(s, "ftp.", 4)) ||
+ (!strncasecmp(s, "/", 1))
+ )
+ {
+ if (x1r) *x1r = x1;
+ if (y1r) *y1r = y1;
+ if (x2r) *x2r = x2;
+ if (y2r) *y2r = y2;
+ return s;
+ }
+ }
+ free(s);
+ }
+ return NULL;
+}
+
+static void
+_activate_link(Evas_Object *obj)
+{
+ Termio *sd = evas_object_smart_data_get(obj);
+ Config *config = termio_config_get(obj);
+ char buf[PATH_MAX], *s;
+ const char *path = NULL, *cmd = NULL;
+ Eina_Bool url = EINA_FALSE, email = EINA_FALSE, handled = EINA_FALSE;
+ int type;
+
+ if (!sd) return;
+ if (!config) return;
+ if (!sd->link.string) return;
+ if ((!strncasecmp(sd->link.string, "http://", 7))||
+ (!strncasecmp(sd->link.string, "https://", 8)) ||
+ (!strncasecmp(sd->link.string, "ftp://", 6)) ||
+ (!strncasecmp(sd->link.string, "www.", 4)) ||
+ (!strncasecmp(sd->link.string, "ftp.", 4)))
+ {
+ url = EINA_TRUE;
+ }
+ else if ((!strncasecmp(sd->link.string, "file://", 7)) ||
+ (!strncasecmp(sd->link.string, "/", 1)))
+ {
+ path = sd->link.string;
+ if (!strncasecmp(sd->link.string, "file://", 7)) path = path + 7;
+ }
+ else if (strchr(sd->link.string, '@'))
+ {
+ email = EINA_TRUE;
+ }
+
+ s = eina_str_escape(sd->link.string);
+ if (!s) return;
+ if (email)
+ {
+ // run mail client
+ cmd = "xdg-email";
+
+ if ((config->helper.email) &&
+ (config->helper.email[0]))
+ cmd = config->helper.email;
+ snprintf(buf, sizeof(buf), "%s %s", cmd, s);
+ }
+ else if (path)
+ {
+ // locally accessible file
+ cmd = "xdg-open";
+
+ type = media_src_type_get(sd->link.string);
+ if (config->helper.inline_please)
+ {
+ if ((type == TYPE_IMG) ||
+ (type == TYPE_SCALE) ||
+ (type == TYPE_EDJE))
+ {
+ evas_object_smart_callback_call(obj, "popup", NULL);
+ handled = EINA_TRUE;
+ }
+ else if (type == TYPE_MOV)
+ {
+ evas_object_smart_callback_call(obj, "popup", NULL);
+ handled = EINA_TRUE;
+ }
+ }
+ if (!handled)
+ {
+ if ((type == TYPE_IMG) ||
+ (type == TYPE_SCALE) ||
+ (type == TYPE_EDJE))
+ {
+ if ((config->helper.local.image) &&
+ (config->helper.local.image[0]))
+ cmd = config->helper.local.image;
+ }
+ else if (type == TYPE_MOV)
+ {
+ if ((config->helper.local.video) &&
+ (config->helper.local.video[0]))
+ cmd = config->helper.local.video;
+ }
+ else
+ {
+ if ((config->helper.local.general) &&
+ (config->helper.local.general[0]))
+ cmd = config->helper.local.general;
+ }
+ snprintf(buf, sizeof(buf), "%s %s", cmd, s);
+ }
+ }
+ else if (url)
+ {
+ // remote file needs ecore-con-url
+ cmd = "xdg-open";
+
+ type = media_src_type_get(sd->link.string);
+ if (config->helper.inline_please)
+ {
+ if ((type == TYPE_IMG) ||
+ (type == TYPE_SCALE) ||
+ (type == TYPE_EDJE))
+ {
+ // XXX: begin fetch of url, once done, show
+ evas_object_smart_callback_call(obj, "popup", NULL);
+ handled = EINA_TRUE;
+ }
+ else if (type == TYPE_MOV)
+ {
+ // XXX: if no http:// add
+ evas_object_smart_callback_call(obj, "popup", NULL);
+ handled = EINA_TRUE;
+ }
+ }
+ if (!handled)
+ {
+ if ((type == TYPE_IMG) ||
+ (type == TYPE_SCALE) ||
+ (type == TYPE_EDJE))
{
- printf("FOUND: '%s' @ %i,%i -> %i,%i\n", s, x1, y1, x2, y2);
- // XXX: record coords and url string
+ if ((config->helper.url.image) &&
+ (config->helper.url.image[0]))
+ cmd = config->helper.url.image;
}
+ else if (type == TYPE_MOV)
+ {
+ if ((config->helper.url.video) &&
+ (config->helper.url.video[0]))
+ cmd = config->helper.url.video;
+ }
+ else
+ {
+ if ((config->helper.url.general) &&
+ (config->helper.url.general[0]))
+ cmd = config->helper.url.general;
+ }
+ snprintf(buf, sizeof(buf), "%s %s", cmd, s);
}
+ }
+ else
+ {
free(s);
+ return;
}
+ free(s);
+ if (!handled) ecore_exe_run(buf, NULL);
+}
+
+static Eina_Bool
+_cb_link_up_delay(void *data)
+{
+ Termio *sd = evas_object_smart_data_get(data);
+
+ if (!sd) return EINA_FALSE;
+ sd->link_do_timer = NULL;
+ if (!sd->didclick) _activate_link(data);
+ sd->didclick = EINA_FALSE;
+ return EINA_FALSE;
+}
+
+static void
+_cb_link_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event)
+{
+ Evas_Event_Mouse_Up *ev = event;
+ Termio *sd = evas_object_smart_data_get(data);
+
+ if (!sd) return;
+ if (ev->button == 1)
+ {
+ if (sd->link_do_timer) ecore_timer_del(sd->link_do_timer);
+ sd->link_do_timer = ecore_timer_add(0.2, _cb_link_up_delay, data);
+ }
+}
+
+static void
+_update_link(Evas_Object *obj, Eina_Bool same_link, Eina_Bool same_geom)
+{
+ Termio *sd = evas_object_smart_data_get(obj);
+
+ if (!sd) return;
+
+ if (!same_link)
+ {
+ // check link and re-probe/fetch create popup preview
+ }
+
+ if (!same_geom)
+ {
+ Evas_Coord ox, oy, ow, oh;
+ Evas_Object *o;
+ // fix up edje objects "underlining" the link
+ int y;
+
+ evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
+ EINA_LIST_FREE(sd->link.objs, o) evas_object_del(o);
+ if ((sd->link.string) && (sd->link.suspend == 0))
+ {
+ for (y = sd->link.y1; y <= sd->link.y2; y++)
+ {
+ o = edje_object_add(evas_object_evas_get(obj));
+ evas_object_smart_member_add(o, obj);
+ theme_apply(o, sd->config, "terminology/link");
+
+ if (y == sd->link.y1)
+ {
+ evas_object_move(o, ox + (sd->link.x1 * sd->font.chw),
+ oy + (y * sd->font.chh));
+ if (sd->link.y1 == sd->link.y2)
+ evas_object_resize(o,
+ ((sd->link.x2 - sd->link.x1 + 1) * sd->font.chw),
+ sd->font.chh);
+ else
+ evas_object_resize(o,
+ ((sd->grid.w - sd->link.x1) * sd->font.chw),
+ sd->font.chh);
+ }
+ else if (y == sd->link.y2)
+ {
+ evas_object_move(o, ox, oy + (y * sd->font.chh));
+ evas_object_resize(o,
+ ((sd->link.x2 + 1) * sd->font.chw),
+ sd->font.chh);
+ }
+ else
+ {
+ evas_object_move(o, ox, oy + (y * sd->font.chh));
+ evas_object_resize(o, (sd->grid.w * sd->font.chw),
+ sd->font.chh);
+ }
+
+ sd->link.objs = eina_list_append(sd->link.objs, o);
+ evas_object_show(o);
+ evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP,
+ _cb_link_up, obj);
+ }
+ }
+ }
+}
+
+static void
+_smart_mouseover_apply(Evas_Object *obj)
+{
+ char *s;
+ int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
+ Eina_Bool same_link = EINA_FALSE, same_geom = EINA_FALSE;
+ Termio *sd = evas_object_smart_data_get(obj);
+
+ if (!sd) return;
+
+ s = _magic_string_find(obj, sd->mouse.cx, sd->mouse.cy,
+ &x1, &y1, &x2, &y2);
+ if (!s)
+ {
+ if (sd->link.string) free(sd->link.string);
+ sd->link.string = NULL;
+ sd->link.x1 = -1;
+ sd->link.y1 = -1;
+ sd->link.x2 = -1;
+ sd->link.y2 = -1;
+ _update_link(obj, same_link, same_geom);
+ return;
+ }
+
+ if ((sd->link.string) && (!strcmp(sd->link.string, s)))
+ same_link = EINA_TRUE;
+ if (sd->link.string) free(sd->link.string);
+ sd->link.string = s;
+ if ((x1 == sd->link.x1) && (y1 == sd->link.y1) &&
+ (x2 == sd->link.x2) && (y2 == sd->link.y2))
+ same_geom = EINA_TRUE;
+ if (((sd->link.suspend != 0) && (sd->link.objs)) ||
+ ((sd->link.suspend == 0) && (!sd->link.objs)))
+ same_geom = EINA_FALSE;
+ sd->link.x1 = x1;
+ sd->link.y1 = y1;
+ sd->link.x2 = x2;
+ sd->link.y2 = y2;
+ _update_link(obj, same_link, same_geom);
}
static void
if (!sd) return;
_smart_xy_to_cursor(data, ev->canvas.x, ev->canvas.y, &cx, &cy);
_rep_mouse_down(data, ev, cx, cy);
+ sd->didclick = EINA_FALSE;
if (ev->button == 1)
{
if (ev->flags & EVAS_BUTTON_TRIPLE_CLICK)
{
_sel_line(data, cx, cy - sd->scroll);
if (sd->cur.sel) _take_selection(data, ELM_SEL_TYPE_PRIMARY);
+ sd->didclick = EINA_TRUE;
}
else if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
{
_sel_word(data, cx, cy - sd->scroll);
}
if (sd->cur.sel) _take_selection(data, ELM_SEL_TYPE_PRIMARY);
+ sd->didclick = EINA_TRUE;
}
else
{
sd->backup.sel1.y = sd->cur.sel1.y;
sd->backup.sel2.x = sd->cur.sel2.x;
sd->backup.sel2.y = sd->cur.sel2.y;
- if (sd->cur.sel) sd->cur.sel = 0;
+ if (sd->cur.sel)
+ {
+ sd->cur.sel = 0;
+ sd->didclick = EINA_TRUE;
+ }
sd->cur.makesel = 1;
sd->cur.sel1.x = cx;
sd->cur.sel1.y = cy - sd->scroll;
sd->cur.makesel = 0;
if (sd->cur.sel)
{
+ sd->didclick = EINA_TRUE;
sd->cur.sel2.x = cx;
sd->cur.sel2.y = cy - sd->scroll;
_selection_dbl_fix(data);
}
static void
+_smart_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__)
+{
+ termio_mouseover_suspend_pushpop(data, -1);
+}
+
+static void
+_smart_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__)
+{
+ termio_mouseover_suspend_pushpop(data, 1);
+}
+
+static void
_smart_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event)
{
Evas_Event_Mouse_Wheel *ev = event;
if (!sd) return EVAS_EVENT_FLAG_ON_HOLD;
evas_object_smart_callback_call(data, "options", NULL);
+ sd->didclick = EINA_TRUE;
return EVAS_EVENT_FLAG_ON_HOLD;
}
sd->zoom_fontsize_start = config->font.size;
_font_size_set(data, (double)sd->zoom_fontsize_start * p->zoom);
}
+ sd->didclick = EINA_TRUE;
return EVAS_EVENT_FLAG_ON_HOLD;
}
sd->zoom_fontsize_start = config->font.size;
_font_size_set(data, (double)sd->zoom_fontsize_start * p->zoom);
}
+ sd->didclick = EINA_TRUE;
return EVAS_EVENT_FLAG_ON_HOLD;
}
sd->zoom_fontsize_start = config->font.size;
_font_size_set(data, (double)sd->zoom_fontsize_start * p->zoom);
}
+ sd->didclick = EINA_TRUE;
return EVAS_EVENT_FLAG_ON_HOLD;
}
sd->zoom_fontsize_start = config->font.size;
_font_size_set(data, sd->zoom_fontsize_start);
}
+ sd->didclick = EINA_TRUE;
return EVAS_EVENT_FLAG_ON_HOLD;
}
_smart_cb_mouse_up, obj);
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE,
_smart_cb_mouse_move, obj);
+ evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_IN,
+ _smart_cb_mouse_in, obj);
+ evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_OUT,
+ _smart_cb_mouse_out, obj);
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_WHEEL,
_smart_cb_mouse_wheel, obj);
evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_OUT,
_smart_cb_focus_out, obj);
+ sd->link.suspend = 1;
+
if (ecore_imf_init())
{
const char *imf_id = ecore_imf_context_default_id_get();
_smart_del(Evas_Object *obj)
{
char *str;
+ Evas_Object *o;
Termio *sd = evas_object_smart_data_get(obj);
+
if (!sd) return;
if (sd->imf)
{
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->link_do_timer) ecore_timer_del(sd->link_do_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);
+ if (sd->link.string) free(sd->link.string);
+ EINA_LIST_FREE(sd->link.objs, o) evas_object_del(o);
EINA_LIST_FREE(sd->seq, str) eina_stringshare_del(str);
sd->cur.obj = NULL;
sd->event = NULL;
w = 0;
last0 = -1;
cells = termpty_cellrow_get(sd->pty, y, &w);
+ if (!cells) continue;
if (w > sd->grid.w) w = sd->grid.w;
start_x = c1x;
end_x = c2x;
{
_paste_selection(obj, ELM_SEL_TYPE_CLIPBOARD);
}
+
+const char *
+termio_link_get(const Evas_Object *obj)
+{
+ Termio *sd = evas_object_smart_data_get(obj);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(sd, NULL);
+ return sd->link.string;
+}
+
+void
+termio_mouseover_suspend_pushpop(Evas_Object *obj, int dir)
+{
+ Termio *sd = evas_object_smart_data_get(obj);
+ if (!sd) return;
+ sd->link.suspend += dir;
+ if (sd->link.suspend < 0) sd->link.suspend = 0;
+ _smart_update_queue(obj, sd);
+}
Config *termio_config_get(const Evas_Object *obj);
void termio_copy_clipboard(Evas_Object *obj);
void termio_paste_clipboard(Evas_Object *obj);
-
+const char *termio_link_get(const Evas_Object *obj);
+void termio_mouseover_suspend_pushpop(Evas_Object *obj, int dir);
#endif