From 67805411a411487d4821d11a3b4d271b4f42da98 Mon Sep 17 00:00:00 2001 From: Boris Faure Date: Sun, 8 Sep 2019 19:28:52 +0200 Subject: [PATCH] add wizard to set scaling when config does not exist --- src/bin/main.c | 19 ++++--- src/bin/utils.c | 30 ++++++++++ src/bin/utils.h | 1 + src/bin/win.c | 144 ++++++++++++++++++++++++++++++++++++++++++++++++ src/bin/win.h | 1 + 5 files changed, 187 insertions(+), 8 deletions(-) diff --git a/src/bin/main.c b/src/bin/main.c index 9e773860..0cc1252b 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -94,10 +94,10 @@ main_ipc_new(Ipc_Instance *inst) if (inst->xterm_256color) nargc += 1; if (inst->active_links) nargc += 1; if (inst->cmd) nargc += 2; - + nargv = calloc(nargc + 1, sizeof(char *)); if (!nargv) return; - + i = 0; nargv[i++] = pargv[0]; if (inst->cd) @@ -261,13 +261,13 @@ main_ipc_new(Ipc_Instance *inst) { char *fname = alloca(strlen(inst->font) + 1); char *p; - + strcpy(fname, inst->font); p = strrchr(fname, '/'); if (p) { int sz; - + *p = 0; p++; sz = atoi(p); @@ -281,7 +281,7 @@ main_ipc_new(Ipc_Instance *inst) char buf[4096], *file; Eina_List *files; int n = strlen(inst->font); - + snprintf(buf, sizeof(buf), "%s/fonts", elm_app_data_dir_get()); files = ecore_file_ls(buf); EINA_LIST_FREE(files, file) @@ -809,7 +809,7 @@ elm_main(int argc, char **argv) pos_set = 1; } } - + if (!size_set) { if (config->custom_geometry) @@ -839,9 +839,9 @@ remote: { Ipc_Instance inst; char cwdbuf[4096]; - + memset(&inst, 0, sizeof(Ipc_Instance)); - + inst.cmd = cmd; if (cd) inst.cd = cd; else inst.cd = getcwd(cwdbuf, sizeof(cwdbuf)); @@ -970,6 +970,9 @@ remote: ecore_con_url_init(); controls_init(); + + win_scale_wizard(win, term); + terminology_starting_up = EINA_FALSE; elm_run(); diff --git a/src/bin/utils.c b/src/bin/utils.c index ecd2da35..fddb016d 100644 --- a/src/bin/utils.c +++ b/src/bin/utils.c @@ -144,6 +144,36 @@ homedir_get(char *buf, size_t size) return eina_strlcpy(buf, home, size) < size; } +Eina_Bool +utils_need_scale_wizard(void) +{ + static char path[PATH_MAX] = ""; + struct stat st; + int res; + char *tmp; + Eina_Bool use_xdg_config; + + + snprintf(path, sizeof(path) -1, "%s/terminology/config/", + efreet_config_home_get()); + res = stat(path, &st); + if (res == 0) + return EINA_FALSE; + + use_xdg_config = (getenv("ELM_CONFIG_DIR_XDG") != NULL); + + if (use_xdg_config) + tmp = eina_vpath_resolve("(:usr.config:)/elementary"); + else + tmp = eina_vpath_resolve("(:home:)/" ".elementary"); + res = stat(tmp, &st); + free(tmp); + if (res == 0) + return EINA_FALSE; + + return EINA_TRUE; +} + Eina_Bool link_is_protocol(const char *str) { diff --git a/src/bin/utils.h b/src/bin/utils.h index 73476de9..01318ba7 100644 --- a/src/bin/utils.h +++ b/src/bin/utils.h @@ -12,6 +12,7 @@ void theme_auto_reload_enable(Evas_Object *edje); const char *theme_path_get(const char *name); Eina_Bool homedir_get(char *buf, size_t size); +Eina_Bool utils_need_scale_wizard(void); Eina_Bool link_is_protocol(const char *str); Eina_Bool link_is_url(const char *str); diff --git a/src/bin/win.c b/src/bin/win.c index c4c8be9d..3ad20801 100644 --- a/src/bin/win.c +++ b/src/bin/win.c @@ -199,6 +199,150 @@ static void _term_tabregion_free(Term *term); static void _set_trans(Config *config, Evas_Object *bg, Evas_Object *base); static void _imf_event_commit_cb(void *data, Ecore_IMF_Context *_ctx EINA_UNUSED, void *event); +static void +_scale_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +_scale_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double scale = elm_config_scale_get(); + double val = elm_slider_value_get(obj); + + if (scale == val) + return; + elm_config_scale_set(val); + elm_config_all_flush(); +} + +typedef struct _Scale_Ctx +{ + Evas_Object *hv; + Term *term; +} Scale_Ctx; + +static void +_scale_done(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Scale_Ctx *ctx = data; + + evas_object_smart_callback_del_full(ctx->hv, "dismissed", + _scale_done, ctx); + evas_object_del(ctx->hv); + ctx->term->wn->on_popover--; + term_unref(ctx->term); + elm_config_save(); + config_save(ctx->term->config, NULL); + free(ctx); +} + +void +win_scale_wizard(Evas_Object *win, Term *term) +{ + Evas_Object *bx, *lbl, *sl, *fr, *bt; + const char *txt; + Scale_Ctx *ctx; + + EINA_SAFETY_ON_NULL_RETURN(term); + if (!utils_need_scale_wizard()) + return; + + ctx = calloc(1, sizeof(*ctx)); + if (!ctx) + return; + + ctx->term = term; + + term->wn->on_popover++; + + term_ref(term); + + ctx->hv = elm_hover_add(win); + evas_object_size_hint_weight_set(ctx->hv, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(ctx->hv, EVAS_HINT_FILL, 0.5); + elm_hover_parent_set(ctx->hv, win); + elm_hover_target_set(ctx->hv, win); + evas_object_smart_callback_add(ctx->hv, "dismissed", _scale_done, ctx); + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5); + elm_object_text_set(fr, _("Scale")); + elm_object_part_content_set(ctx->hv, "middle", fr); + evas_object_show(fr); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.5); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5); + elm_object_style_set(fr, "pad_medium"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + lbl = elm_label_add(win); + evas_object_size_hint_weight_set(lbl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lbl, EVAS_HINT_FILL, 0.5); + txt = eina_stringshare_printf("%s",_("Scale")); + elm_object_text_set(lbl, txt); + eina_stringshare_del(txt); + elm_object_content_set(fr, lbl); + elm_box_pack_end(bx, lbl); + evas_object_show(lbl); + + sl = elm_slider_add(win); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.2f"); + elm_slider_indicator_format_set(sl, "%1.2f"); + elm_slider_min_max_set(sl, 0.25, 5.0); + elm_slider_value_set(sl, elm_config_scale_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + evas_object_smart_callback_add(sl, "changed", _scale_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", _scale_change, NULL); + + lbl = elm_label_add(win); + evas_object_size_hint_weight_set(lbl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lbl, EVAS_HINT_FILL, 0.5); + elm_object_text_set(lbl, _("Select prefered size so that is text is readable")); + elm_box_pack_end(bx, lbl); + evas_object_show(lbl); + + lbl = elm_label_add(win); + evas_object_size_hint_weight_set(lbl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lbl, EVAS_HINT_FILL, 0.5); + elm_object_text_set(lbl, _("The scale configuration can be changed in the Settings (right click on the terminal) → Toolkit, or by starting the command elementary_config")); + elm_box_pack_end(bx, lbl); + evas_object_show(lbl); + + bt = elm_button_add(win); + elm_object_text_set(bt, _("Done")); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "clicked", _scale_done, ctx); + evas_object_show(bt); + + evas_object_show(ctx->hv); + + elm_object_focus_set(ctx->hv, EINA_TRUE); +} /* {{{ Solo */ diff --git a/src/bin/win.h b/src/bin/win.h index af4bf16b..2986dac4 100644 --- a/src/bin/win.h +++ b/src/bin/win.h @@ -50,6 +50,7 @@ void win_toggle_visible_group(Win *wn); void win_toggle_all_group(Win *wn); Eina_Bool win_is_group_action_handled(Win *wn); Eina_Bool win_is_group_input(Win *wn); +void win_scale_wizard(Evas_Object *win, Term *term); void term_ref(Term *term);