diff --git a/TODO b/TODO index 57b91d12..ff8fc222 100644 --- a/TODO +++ b/TODO @@ -2,28 +2,20 @@ here's a short list of things i think we can do in the short to medium term to make it a first-class terminal: -[X] evas textgrid needs creating and to be used -[X] underline and strikethrough need supporting at termio level [ ] blink and blink2 attributes need to be supported -[ ] improve terminal emulation handling (i know it doesn't handle gfx - chars and it definitely has an incomplete escape handling core - - many are commented out and unhandled) +[ ] improve terminal emulation handling. known apps with problems: + mc [ ] copy & paste support for clipboard not just primary (like xterm) [ ] dnd text (to/from terminal) -[X] ecore-imf support [ ] handle multibyte displays better (does handle utf8 only atm and - then maybe not according to convention) + then maybe not according to convention like double cell spacing + for jp/kr/zh etc.) [ ] general input mode handling improvements (keypad, other key - input, mousereporting etc.) -[X] save of config after options changes (option checkbox for - temporary local only changes) + input, etc.) [ ] selection of themes [ ] selection of background "wallpapers" (and support them at all - doesn't right now - should support regular images, animated gifs, and edje files) -[X] transparency support (theme needs to be told to go into - tranpsarency mode and then window alpha enabled) -[ ] visual bell reporting (signals to theme) [ ] scrollbar (elm scroller that mirrors the term smart size/position - gives us fingerscroll - layer on top of term smart, stick invisible rect inside to track for scrolling etc.) @@ -34,11 +26,7 @@ make it a first-class terminal: [ ] selection should become single edje object so it can be styled nicely [ ] selection should have handles on the start/end so u can drag and change its size once there -[ ] improve selection text extraction logic -[X] font selector should include font previews in the list - - preferably ONLY be a list of previews -[X] options widgets should be deleted once they are hidden. they stay - in memory at the moment +[ ] improve selection text extraction logic so its reliable [ ] clicking with ANY mouse button while options is up outside of options should dismiss it. diff --git a/data/themes/default.edc b/data/themes/default.edc index f58f88aa..95e5cec5 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -6,6 +6,7 @@ collections { image: "bg_shine.png" COMP; image: "bg_glint.png" COMP; image: "bg_shadow.png" COMP; + image: "bg_led.png" COMP; } parts { part { name: "shadow"; @@ -108,6 +109,23 @@ collections { aspect_preference: HORIZONTAL; } } + part { name: "bell"; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + min: 32 32; + max: 32 32; + rel2.offset: -5 -5; + align: 1.0 1.0; + image.normal: "bg_led.png"; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + } + } part { name: "terminology.options"; type: SWALLOW; scale: 1; description { state: "default" 0.0; @@ -169,6 +187,26 @@ collections { target: "shadow"; target: "fade"; } + program { name: "bell"; + signal: "bell"; + source: "terminology"; + action: STATE_SET "visible" 0.0; + target: "bell"; + after: "bell2"; + } + program { name: "bell2"; + action: STATE_SET "default" 0.0; + transition: BOUNCE 1.0 1.0 3.0; + target: "bell"; + } +// program { name: "focus_in"; +// signal: "focus,in"; +// source: "terminology"; +// } +// program { name: "focus_out"; +// signal: "focus,out"; +// source: "terminology"; +// } program { name: "media_off"; signal: "media,off"; source: "terminology"; diff --git a/data/themes/images/Makefile.am b/data/themes/images/Makefile.am index 836ef94d..1497cdc0 100644 --- a/data/themes/images/Makefile.am +++ b/data/themes/images/Makefile.am @@ -3,6 +3,7 @@ EXTRA_DIST = \ bg_bevel.png \ bg_shine.png \ bg_glint.png \ +bg_led.png \ bg_shadow.png \ cr_fill.png \ cr_key.png \ diff --git a/data/themes/images/bg_led.png b/data/themes/images/bg_led.png new file mode 100644 index 00000000..45557cf2 Binary files /dev/null and b/data/themes/images/bg_led.png differ diff --git a/src/bin/config.c b/src/bin/config.c index bee12d42..7d8db359 100644 --- a/src/bin/config.c +++ b/src/bin/config.c @@ -48,24 +48,26 @@ config_init(void) (edd_base, Config, "font.size", font.size, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "font.bitmap", font.bitmap, EET_T_UCHAR); - EET_DATA_DESCRIPTOR_ADD_BASIC - (edd_base, Config, "scrollback", scrollback, EET_T_INT); 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); + EET_DATA_DESCRIPTOR_ADD_BASIC + (edd_base, Config, "wordsep", wordsep, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC + (edd_base, Config, "scrollback", scrollback, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC + (edd_base, Config, "vidmod", vidmod, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "jump_on_change", jump_on_change, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "flicker_on_key", flicker_on_key, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "translucent", translucent, EET_T_UCHAR); - EET_DATA_DESCRIPTOR_ADD_BASIC - (edd_base, Config, "wordsep", wordsep, EET_T_STRING); - EET_DATA_DESCRIPTOR_ADD_BASIC - (edd_base, Config, "vidmod", vidmod, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "mute", mute, EET_T_UCHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC + (edd_base, Config, "urg_bell", urg_bell, EET_T_UCHAR); } void @@ -142,6 +144,7 @@ config_load(const char *key) config->wordsep = eina_stringshare_add(" '\"()[]{}=*!#$^\\:;,?`"); config->vidmod = 0; config->mute = EINA_FALSE; + config->urg_bell = EINA_TRUE; } config->config_key = eina_stringshare_add(key); /* not in eet */ diff --git a/src/bin/config.h b/src/bin/config.h index e2763d1f..c5a3b675 100644 --- a/src/bin/config.h +++ b/src/bin/config.h @@ -21,6 +21,8 @@ struct _Config Eina_Bool flicker_on_key; Eina_Bool translucent; Eina_Bool mute; + Eina_Bool urg_bell; + Eina_Bool temporary; /* not in EET */ const char *config_key; /* not in EET, the key that config was loaded */ }; diff --git a/src/bin/main.c b/src/bin/main.c index 4bed6e93..35295619 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -14,10 +14,13 @@ int _log_domain = -1; static Evas_Object *win = NULL, *bg = NULL, *term = NULL, *media = NULL; static Ecore_Timer *flush_timer = NULL; +static Eina_Bool focused = EINA_FALSE; static void _cb_focus_in(void *data, Evas_Object *obj __UNUSED__, void *event __UNUSED__) { + if (!focused) elm_win_urgent_set(win, EINA_FALSE); + focused = EINA_TRUE; edje_object_signal_emit(bg, "focus,in", "terminology"); elm_object_focus_set(data, EINA_TRUE); } @@ -25,6 +28,7 @@ _cb_focus_in(void *data, Evas_Object *obj __UNUSED__, void *event __UNUSED__) static void _cb_focus_out(void *data, Evas_Object *obj __UNUSED__, void *event __UNUSED__) { + focused = EINA_FALSE; edje_object_signal_emit(bg, "focus,out", "terminology"); elm_object_focus_set(data, EINA_FALSE); elm_cache_all_flush(); @@ -76,6 +80,19 @@ _cb_exited(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNU elm_exit(); } +static void +_cb_bell(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__) +{ + Config *config = termio_config_get(term); + + edje_object_signal_emit(bg, "bell", "terminology"); + if (!config) return; + if (config->urg_bell) + { + if (!focused) elm_win_urgent_set(win, EINA_TRUE); + } +} + void main_trans_update(const Config *config) { @@ -288,6 +305,7 @@ elm_main(int argc, char **argv) evas_object_smart_callback_add(o, "options", _cb_options, NULL); 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_show(o); main_trans_update(config); diff --git a/src/bin/options_behavior.c b/src/bin/options_behavior.c index 703eb9ee..85c991f5 100644 --- a/src/bin/options_behavior.c +++ b/src/bin/options_behavior.c @@ -29,6 +29,15 @@ _cb_op_behavior_flicker_chg(void *data, Evas_Object *obj, void *event __UNUSED__ config_save(config, NULL); } +static void +_cb_op_behavior_urg_bell_chg(void *data, Evas_Object *obj, void *event __UNUSED__) +{ + Evas_Object *term = data; + Config *config = termio_config_get(term); + config->urg_bell = elm_check_state_get(obj); + config_save(config, NULL); +} + static void _cb_op_behavior_wsep_chg(void *data, Evas_Object *obj, void *event __UNUSED__) { @@ -89,6 +98,16 @@ options_behavior(Evas_Object *opbox, Evas_Object *term) evas_object_smart_callback_add(o, "changed", _cb_op_behavior_flicker_chg, term); + 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, "Urgent on bell"); + elm_check_state_set(o, config->urg_bell); + elm_box_pack_end(opbox, o); + evas_object_show(o); + evas_object_smart_callback_add(o, "changed", + _cb_op_behavior_urg_bell_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); diff --git a/src/bin/termio.c b/src/bin/termio.c index dab57614..aa5d7afa 100644 --- a/src/bin/termio.c +++ b/src/bin/termio.c @@ -1347,6 +1347,12 @@ _smart_pty_exited(void *data) evas_object_smart_callback_call(data, "exited", NULL); } +static void +_smart_pty_bell(void *data) +{ + evas_object_smart_callback_call(data, "bell", NULL); +} + Evas_Object * termio_add(Evas_Object *parent, Config *config, const char *cmd, int w, int h) { @@ -1380,6 +1386,8 @@ termio_add(Evas_Object *parent, Config *config, const char *cmd, int w, int h) sd->pty->cb.cancel_sel.data = obj; sd->pty->cb.exited.func = _smart_pty_exited; sd->pty->cb.exited.data = obj; + sd->pty->cb.bell.func = _smart_pty_bell; + sd->pty->cb.bell.data = obj; _smart_size(obj, w, h, EINA_FALSE); return obj; } diff --git a/src/bin/termpty.c b/src/bin/termpty.c index 0f3bcd12..6f6cbd1f 100644 --- a/src/bin/termpty.c +++ b/src/bin/termpty.c @@ -1410,7 +1410,7 @@ _handle_seq(Termpty *ty, const int *c, int *ce) return 1; */ case 0x07: // BEL '\a' (bell) - INF("BEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEP"); + if (ty->cb.bell.func) ty->cb.bell.func(ty->cb.bell.data); ty->state.had_cr = 0; return 1; case 0x08: // BS '\b' (backspace) diff --git a/src/bin/termpty.h b/src/bin/termpty.h index 90c0cd3d..3e6d0e70 100644 --- a/src/bin/termpty.h +++ b/src/bin/termpty.h @@ -80,7 +80,7 @@ struct _Termpty struct { void (*func) (void *data); void *data; - } change, scroll, set_title, set_icon, cancel_sel, exited; + } change, scroll, set_title, set_icon, cancel_sel, exited, bell; } cb; struct { const char *title;