diff --git a/data/themes/default.edc b/data/themes/default.edc index ca4adea1..2981fffa 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -28,6 +28,19 @@ collections { visible: 0; } } + part { name: "fade"; type: RECT; + description { state: "default" 0.0; + } + description { state: "translucent" 0.0; + inherit: "default" 0.0; + color: 255 255 255 128; + } + } + part { name: "terminology.background"; type: SWALLOW; + clip_to: "fade"; + description { state: "default" 0.0; + } + } part { name: "terminology.content"; type: SWALLOW; description { state: "default" 0.0; rel1.offset: 1 2; @@ -99,6 +112,7 @@ collections { action: STATE_SET "translucent" 0.0; target: "base"; target: "shadow"; + target: "fade"; } program { name: "trans_off"; signal: "translucent,off"; @@ -106,6 +120,7 @@ collections { action: STATE_SET "default" 0.0; target: "base"; target: "shadow"; + target: "fade"; } } } diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index eddc6eeb..e437c2ea 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -13,9 +13,10 @@ col.c col.h \ config.c config.h \ keyin.c keyin.h \ main.c main.h \ +media.c media.h \ options.c options.h \ -options_font.c options_font.h \ options_behavior.c options_behavior.h \ +options_font.c options_font.h \ termio.c termio.h \ termpty.c termpty.h \ utf8.c utf8.h \ diff --git a/src/bin/main.c b/src/bin/main.c index fa86266c..f8844e72 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -4,9 +4,10 @@ #include "termio.h" #include "config.h" #include "options.h" +#include "media.h" const char *cmd = NULL; -static Evas_Object *win = NULL, *bg = NULL, *term = NULL; +static Evas_Object *win = NULL, *bg = NULL, *term = NULL, *media = NULL; static Ecore_Timer *flush_timer = NULL; static void @@ -79,12 +80,34 @@ main_trans_update(void) } } +void +main_media_update(void) +{ + Evas_Object *o; + + if (config->background) + { + if (media) evas_object_del(media); + o = media = media_add(win, config->background, MEDIA_BG); + edje_object_part_swallow(bg, "terminology.background", o); + evas_object_show(o); + } + else + { + if (media) + { + evas_object_del(media); + media = NULL; + } + } +} + EAPI_MAIN int elm_main(int argc, char **argv) { int i; Evas_Object *o; - char buf[4096]; + char buf[4096], *p; config_init(); elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); @@ -99,6 +122,25 @@ elm_main(int argc, char **argv) i++; cmd = argv[i]; } + else if ((!strcmp(argv[i], "-t")) && (i < (argc - 1))) + { + i++; + if (config->theme) eina_stringshare_del(config->theme); + p = strchr(argv[i], '.'); + if ((!p) || (strcasecmp(p, ".edj"))) + { + snprintf(buf, sizeof(buf), "%s.edj", argv[i]); + config->theme = eina_stringshare_add(buf); + } + else + config->theme = eina_stringshare_add(argv[i]); + } + else if ((!strcmp(argv[i], "-b")) && (i < (argc - 1))) + { + i++; + if (config->background) eina_stringshare_del(config->background); + config->background = eina_stringshare_add(argv[i]); + } } win = tg_win_add(); @@ -106,9 +148,14 @@ elm_main(int argc, char **argv) bg = o = edje_object_add(evas_object_evas_get(win)); evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); - snprintf(buf, sizeof(buf), "%s/themes/%s", - elm_app_data_dir_get(), config->theme); - edje_object_file_set(o, buf, "terminology/background"); + if (strchr(config->theme, '/')) + edje_object_file_set(o, config->theme, "terminology/background"); + else + { + snprintf(buf, sizeof(buf), "%s/themes/%s", + elm_app_data_dir_get(), config->theme); + edje_object_file_set(o, buf, "terminology/background"); + } elm_win_resize_object_add(win, o); evas_object_show(o); @@ -120,10 +167,11 @@ elm_main(int argc, char **argv) _cb_size_hint, win); edje_object_part_swallow(bg, "terminology.content", o); evas_object_smart_callback_add(o, "options", _cb_options, NULL); - evas_object_smart_callback_add(o, "options", _cb_change, NULL); + evas_object_smart_callback_add(o, "change", _cb_change, NULL); evas_object_show(o); main_trans_update(); + main_media_update(); evas_object_smart_callback_add(win, "focus,in", _cb_focus_in, term); evas_object_smart_callback_add(win, "focus,out", _cb_focus_out, term); diff --git a/src/bin/media.c b/src/bin/media.c new file mode 100644 index 00000000..11894a2f --- /dev/null +++ b/src/bin/media.c @@ -0,0 +1,117 @@ +#include +#include "config.h" + +typedef struct _Media Media; + +struct _Media +{ + Evas_Object_Smart_Clipped_Data __clipped_data; + Evas_Object *event; +}; + +static Evas_Smart *_smart = NULL; +static Evas_Smart_Class _meida_sc = EVAS_SMART_CLASS_INIT_NULL; + +static void _smart_calculate(Evas_Object *obj); + +static void +_smart_add(Evas_Object *obj) +{ + Media *sd; + Evas_Object_Smart_Clipped_Data *cd; + Evas_Object *o; + char buf[4096]; + + _meida_sc.add(obj); + cd = evas_object_smart_data_get(obj); + if (!cd) return; + sd = calloc(1, sizeof(Media)); + if (!sd) return; + sd->__clipped_data = *cd; + free(cd); + evas_object_smart_data_set(obj, sd); + + o = evas_object_rectangle_add(evas_object_evas_get(obj)); + evas_object_smart_member_add(o, obj); + sd->event = o; + evas_object_color_set(o, 128, 0, 0, 128); + evas_object_show(o); +} + +static void +_smart_del(Evas_Object *obj) +{ + Media *sd = evas_object_smart_data_get(obj); + if (!sd) return; + if (sd->event) evas_object_del(sd->event); + _meida_sc.del(obj); + evas_object_smart_data_set(obj, NULL); +} + +static void +_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h) +{ + Media *sd = evas_object_smart_data_get(obj); + Evas_Coord ow, oh; + if (!sd) return; + evas_object_geometry_get(obj, NULL, NULL, &ow, &oh); + if ((ow == w) && (oh == h)) return; + evas_object_smart_changed(obj); + evas_object_resize(sd->event, ow, oh); +} + +static void +_smart_calculate(Evas_Object *obj) +{ + Media *sd = evas_object_smart_data_get(obj); + Evas_Coord ox, oy, ow, oh; + + if (!sd) return; + + evas_object_geometry_get(obj, &ox, &oy, &ow, &oh); + evas_object_move(sd->event, ox, oy); + evas_object_resize(sd->event, ow, oh); +} + +static void +_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + Media *sd = evas_object_smart_data_get(obj); + if (!sd) return; + evas_object_smart_changed(obj); +} + +static void +_smart_init(void) +{ + static Evas_Smart_Class sc; + + evas_object_smart_clipped_smart_set(&_meida_sc); + sc = _meida_sc; + sc.name = "media"; + sc.version = EVAS_SMART_CLASS_VERSION; + sc.add = _smart_add; + sc.del = _smart_del; + sc.resize = _smart_resize; + sc.move = _smart_move; + sc.calculate = _smart_calculate; + _smart = evas_smart_class_new(&sc); +} + +Evas_Object * +media_add(Evas_Object *parent, const char *src, int mode) +{ + Evas *e; + Evas_Object *obj; + Media *sd; + + EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL); + e = evas_object_evas_get(parent); + if (!e) return NULL; + + if (!_smart) _smart_init(); + obj = evas_object_smart_add(e, _smart); + sd = evas_object_smart_data_get(obj); + if (!sd) return obj; + return obj; +} diff --git a/src/bin/media.h b/src/bin/media.h new file mode 100644 index 00000000..bca11a34 --- /dev/null +++ b/src/bin/media.h @@ -0,0 +1,3 @@ +#define MEDIA_BG 0 + +Evas_Object *media_add(Evas_Object *parent, const char *src, int mode);