2014-07-26 10:55:24 -07:00
|
|
|
#include "private.h"
|
2018-01-14 03:52:46 -08:00
|
|
|
|
|
|
|
#include <Elementary.h>
|
|
|
|
#include <assert.h>
|
2012-08-21 20:12:40 -07:00
|
|
|
#include "config.h"
|
|
|
|
#include "termio.h"
|
|
|
|
#include "options.h"
|
2020-11-03 14:33:42 -08:00
|
|
|
#include "colors.h"
|
2012-08-21 20:12:40 -07:00
|
|
|
#include "options_colors.h"
|
2020-11-03 14:33:42 -08:00
|
|
|
#include "options_themepv.h"
|
2020-11-11 13:51:51 -08:00
|
|
|
#include "utils.h"
|
2012-08-21 20:12:40 -07:00
|
|
|
|
2022-03-04 06:18:42 -08:00
|
|
|
typedef struct tag_Color_Scheme_Ctx
|
2013-12-16 06:51:35 -08:00
|
|
|
{
|
2020-11-03 14:33:42 -08:00
|
|
|
Evas_Object *term;
|
|
|
|
Config *config;
|
|
|
|
Evas_Coord pv_width;
|
|
|
|
Evas_Coord pv_height;
|
|
|
|
Eina_List *cs_infos;
|
2020-11-04 14:17:32 -08:00
|
|
|
Ecore_Timer *seltimer;
|
2020-11-11 12:27:15 -08:00
|
|
|
Evas_Object *ctxpopup;
|
2020-11-03 14:33:42 -08:00
|
|
|
} Color_Scheme_Ctx;
|
|
|
|
|
2022-03-04 06:18:42 -08:00
|
|
|
typedef struct tag_Color_Scheme_Info
|
2020-11-03 14:33:42 -08:00
|
|
|
{
|
|
|
|
Color_Scheme_Ctx *ctx;
|
|
|
|
Elm_Object_Item *item;
|
|
|
|
Color_Scheme *cs;
|
2020-11-11 11:58:37 -08:00
|
|
|
const char *tooltip;
|
2020-11-03 14:33:42 -08:00
|
|
|
} Color_Scheme_Info;
|
|
|
|
|
|
|
|
static char *
|
|
|
|
_cb_op_cs_name_get(void *data,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *part EINA_UNUSED)
|
2012-08-21 20:12:40 -07:00
|
|
|
{
|
2020-11-03 14:33:42 -08:00
|
|
|
Color_Scheme_Info *csi = data;
|
|
|
|
Color_Scheme *cs = csi->cs;
|
2012-08-21 20:12:40 -07:00
|
|
|
|
2020-11-03 14:33:42 -08:00
|
|
|
return strdup(cs->md.name);
|
2013-12-16 06:51:35 -08:00
|
|
|
}
|
|
|
|
|
2020-11-11 12:27:15 -08:00
|
|
|
static void
|
|
|
|
_cb_ctxp_del(void *data,
|
|
|
|
Evas *_e EINA_UNUSED,
|
|
|
|
Evas_Object *_obj EINA_UNUSED,
|
|
|
|
void *_event EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Color_Scheme_Info *csi = data;
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(csi);
|
|
|
|
csi->ctx->ctxpopup = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_cb_ctxp_dismissed(void *data,
|
|
|
|
Evas_Object *obj,
|
|
|
|
void *_event EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Color_Scheme_Info *csi = data;
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(csi);
|
|
|
|
csi->ctx->ctxpopup = NULL;
|
|
|
|
evas_object_del(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_cb_ctxp_open_website(void *data,
|
|
|
|
Evas_Object *obj,
|
|
|
|
void *_event EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Color_Scheme_Info *csi = data;
|
|
|
|
Color_Scheme_Ctx *ctx;
|
|
|
|
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(csi);
|
|
|
|
ctx = csi->ctx;
|
|
|
|
|
2020-11-11 13:51:51 -08:00
|
|
|
open_url(ctx->config, csi->cs->md.website);
|
2020-11-11 12:27:15 -08:00
|
|
|
|
|
|
|
ctx->ctxpopup = NULL;
|
|
|
|
evas_object_del(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_handle_mouse_down(void *data,
|
|
|
|
Evas *_e EINA_UNUSED,
|
|
|
|
Evas_Object *obj,
|
|
|
|
void *event)
|
|
|
|
{
|
|
|
|
Evas_Event_Mouse_Down *ev = event;
|
|
|
|
Color_Scheme_Info *csi = data;
|
|
|
|
Evas_Object *ctxp;
|
|
|
|
|
|
|
|
if (ev->button != 3 || csi->cs->md.website == NULL ||
|
|
|
|
csi->cs->md.website[0] == '\0')
|
|
|
|
return;
|
|
|
|
|
|
|
|
ctxp = elm_ctxpopup_add(obj);
|
|
|
|
csi->ctx->ctxpopup = ctxp;
|
|
|
|
|
|
|
|
elm_ctxpopup_item_append(ctxp, _("Open website"), NULL,
|
|
|
|
_cb_ctxp_open_website, csi);
|
|
|
|
evas_object_move(ctxp, ev->canvas.x, ev->canvas.y);
|
|
|
|
evas_object_show(ctxp);
|
|
|
|
evas_object_smart_callback_add(ctxp, "dismissed",
|
|
|
|
_cb_ctxp_dismissed, csi);
|
|
|
|
evas_object_event_callback_add(ctxp, EVAS_CALLBACK_DEL,
|
|
|
|
_cb_ctxp_del, csi);
|
|
|
|
}
|
|
|
|
|
2020-11-03 14:33:42 -08:00
|
|
|
static Evas_Object *
|
|
|
|
_cb_op_cs_content_get(void *data, Evas_Object *obj, const char *part)
|
2018-01-15 13:51:16 -08:00
|
|
|
{
|
2020-11-03 14:33:42 -08:00
|
|
|
Color_Scheme_Info *csi = data;
|
2018-01-15 13:51:16 -08:00
|
|
|
|
2020-11-03 14:33:42 -08:00
|
|
|
if (strncmp(part, "elm.swallow.icon", sizeof("elm.swallow.icon") -1) == 0)
|
2018-01-15 13:51:16 -08:00
|
|
|
{
|
2020-11-03 14:33:42 -08:00
|
|
|
Config *config = csi->ctx->config;
|
|
|
|
Evas_Object *o;
|
|
|
|
|
|
|
|
if (!config)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
o = options_theme_preview_add(obj, config,
|
|
|
|
NULL,
|
|
|
|
csi->cs,
|
|
|
|
csi->ctx->pv_width,
|
|
|
|
csi->ctx->pv_height,
|
|
|
|
EINA_TRUE);
|
2020-11-11 11:58:37 -08:00
|
|
|
if (!csi->tooltip)
|
|
|
|
{
|
|
|
|
csi->tooltip = eina_stringshare_printf(
|
|
|
|
_("<b>Author: </b>%s<br/>"
|
|
|
|
"<b>Website: </b>%s<br/>"
|
|
|
|
"<b>License: </b>%s"),
|
|
|
|
csi->cs->md.author, csi->cs->md.website, csi->cs->md.license);
|
|
|
|
}
|
|
|
|
elm_object_tooltip_text_set(o, csi->tooltip);
|
2020-11-11 12:27:15 -08:00
|
|
|
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
|
|
|
|
_handle_mouse_down, csi);
|
2020-11-03 14:33:42 -08:00
|
|
|
return o;
|
2018-01-15 13:51:16 -08:00
|
|
|
}
|
|
|
|
|
2020-11-03 14:33:42 -08:00
|
|
|
return NULL;
|
|
|
|
}
|
2018-01-15 14:49:03 -08:00
|
|
|
|
2013-12-16 06:51:35 -08:00
|
|
|
static void
|
2020-11-03 14:33:42 -08:00
|
|
|
_cb_op_color_scheme_sel(void *data,
|
|
|
|
Evas_Object *_obj EINA_UNUSED,
|
|
|
|
void *_event EINA_UNUSED)
|
2013-12-16 06:51:35 -08:00
|
|
|
{
|
2020-11-03 14:33:42 -08:00
|
|
|
Color_Scheme_Info *csi = data;
|
2020-11-04 14:17:32 -08:00
|
|
|
Color_Scheme *cs = csi->cs;
|
2020-11-03 14:33:42 -08:00
|
|
|
Config *config = csi->ctx->config;
|
2018-01-14 03:52:46 -08:00
|
|
|
|
2020-11-04 14:17:32 -08:00
|
|
|
if ((config->color_scheme_name) &&
|
|
|
|
(!strcmp(cs->md.name, config->color_scheme_name)))
|
2020-11-03 14:33:42 -08:00
|
|
|
return;
|
2018-01-14 03:52:46 -08:00
|
|
|
|
2020-11-04 14:17:32 -08:00
|
|
|
eina_stringshare_replace(&(config->color_scheme_name), cs->md.name);
|
|
|
|
free((void*)config->color_scheme);
|
|
|
|
config->color_scheme = color_scheme_dup(cs);
|
|
|
|
|
2019-09-08 10:41:16 -07:00
|
|
|
config_save(config);
|
2020-11-04 14:17:32 -08:00
|
|
|
change_theme(termio_win_get(csi->ctx->term), config);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
|
|
|
_cb_sel_item(void *data)
|
|
|
|
{
|
|
|
|
Color_Scheme_Info *csi = data;
|
|
|
|
|
|
|
|
if (csi)
|
|
|
|
{
|
|
|
|
elm_gengrid_item_selected_set(csi->item, EINA_TRUE);
|
|
|
|
elm_gengrid_item_bring_in(csi->item, ELM_GENGRID_ITEM_SCROLLTO_MIDDLE);
|
|
|
|
csi->ctx->seltimer = NULL;
|
|
|
|
}
|
|
|
|
return EINA_FALSE;
|
2018-01-14 03:52:46 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_parent_del_cb(void *data,
|
|
|
|
Evas *_e EINA_UNUSED,
|
|
|
|
Evas_Object *_obj EINA_UNUSED,
|
|
|
|
void *_event_info EINA_UNUSED)
|
|
|
|
{
|
2020-11-03 14:33:42 -08:00
|
|
|
Color_Scheme_Ctx *ctx = data;
|
|
|
|
Color_Scheme_Info *csi;
|
2018-01-14 03:52:46 -08:00
|
|
|
|
2020-11-03 14:33:42 -08:00
|
|
|
EINA_LIST_FREE(ctx->cs_infos, csi)
|
|
|
|
{
|
|
|
|
free(csi->cs);
|
2020-11-11 11:58:37 -08:00
|
|
|
eina_stringshare_del(csi->tooltip);
|
2020-11-03 14:33:42 -08:00
|
|
|
free(csi);
|
|
|
|
}
|
2020-11-04 14:17:32 -08:00
|
|
|
ecore_timer_del(ctx->seltimer);
|
2018-01-14 03:52:46 -08:00
|
|
|
free(ctx);
|
2013-12-16 06:51:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2020-11-03 14:33:42 -08:00
|
|
|
options_colors(Evas_Object *opbox, Evas_Object *term)
|
2013-12-16 06:51:35 -08:00
|
|
|
{
|
2020-11-03 14:33:42 -08:00
|
|
|
Evas_Object *o, *box, *fr;
|
|
|
|
Elm_Gengrid_Item_Class *it_class;
|
|
|
|
Eina_List *schemes, *l, *l_next;
|
|
|
|
Color_Scheme *cs;
|
|
|
|
Color_Scheme_Ctx *ctx;
|
2013-12-16 06:51:35 -08:00
|
|
|
Config *config = termio_config_get(term);
|
2020-11-03 14:33:42 -08:00
|
|
|
int chw = 10, chh = 10;
|
2018-01-14 03:52:46 -08:00
|
|
|
|
2020-11-03 14:33:42 -08:00
|
|
|
termio_character_size_get(term, &chw, &chh);
|
2018-01-14 03:52:46 -08:00
|
|
|
ctx = calloc(1, sizeof(*ctx));
|
|
|
|
assert(ctx);
|
|
|
|
|
|
|
|
ctx->config = config;
|
|
|
|
ctx->term = term;
|
2020-11-03 14:33:42 -08:00
|
|
|
ctx->pv_width = (COLOR_MODE_PREVIEW_WIDTH+0) * chw;
|
|
|
|
ctx->pv_height = (COLOR_MODE_PREVIEW_HEIGHT+0) * chh;
|
|
|
|
if (ctx->pv_width >= ctx->pv_height)
|
|
|
|
ctx->pv_height = ctx->pv_width;
|
|
|
|
else
|
|
|
|
ctx->pv_width = ctx->pv_height;
|
2018-01-14 03:52:46 -08:00
|
|
|
|
2013-12-16 06:51:35 -08:00
|
|
|
fr = o = elm_frame_add(opbox);
|
2012-08-21 20:12:40 -07:00
|
|
|
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);
|
2020-11-03 14:33:42 -08:00
|
|
|
elm_object_text_set(o, _("Color schemes"));
|
2012-08-21 20:12:40 -07:00
|
|
|
elm_box_pack_end(opbox, o);
|
2013-12-16 06:51:35 -08:00
|
|
|
evas_object_show(o);
|
2018-01-14 03:52:46 -08:00
|
|
|
|
|
|
|
evas_object_event_callback_add(fr, EVAS_CALLBACK_DEL,
|
|
|
|
_parent_del_cb, ctx);
|
|
|
|
|
2020-11-03 14:33:42 -08:00
|
|
|
box = o = elm_box_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_horizontal_set(o, EINA_FALSE);
|
2013-12-16 06:51:35 -08:00
|
|
|
elm_object_content_set(fr, o);
|
|
|
|
evas_object_show(o);
|
2018-01-14 03:52:46 -08:00
|
|
|
|
2020-11-29 06:52:58 -08:00
|
|
|
if (config && config->theme)
|
|
|
|
{
|
|
|
|
char theme[4096];
|
|
|
|
const char *start = strrchr(config->theme, '/');
|
|
|
|
const char *end;
|
|
|
|
size_t len;
|
|
|
|
|
|
|
|
if (start)
|
|
|
|
start++;
|
|
|
|
else
|
|
|
|
start = config->theme;
|
|
|
|
|
|
|
|
end = strrchr(start, '.');
|
|
|
|
if (!end)
|
|
|
|
end = start + strlen(start) - 1;
|
|
|
|
len = end - start;
|
|
|
|
if (len < sizeof(theme))
|
|
|
|
{
|
2021-09-21 07:18:04 -07:00
|
|
|
char buf[4096 + 1024];
|
2020-11-29 06:52:58 -08:00
|
|
|
|
|
|
|
strncpy(theme, start, len);
|
|
|
|
theme[len] = '\0';
|
|
|
|
o = elm_label_add(opbox);
|
|
|
|
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0);
|
|
|
|
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
|
|
|
snprintf(buf, sizeof(buf), _("Using theme <hilight>%s</hilight>"),
|
|
|
|
theme);
|
|
|
|
elm_object_text_set(o, buf);
|
|
|
|
elm_box_pack_end(box, o);
|
|
|
|
evas_object_show(o);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-11-03 14:33:42 -08:00
|
|
|
it_class = elm_gengrid_item_class_new();
|
|
|
|
it_class->item_style = "thumb";
|
|
|
|
it_class->func.text_get = _cb_op_cs_name_get;
|
|
|
|
it_class->func.content_get = _cb_op_cs_content_get;
|
|
|
|
|
|
|
|
o = elm_gengrid_add(opbox);
|
2013-12-16 06:51:35 -08:00
|
|
|
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);
|
2018-01-14 03:52:46 -08:00
|
|
|
|
2020-11-03 14:33:42 -08:00
|
|
|
schemes = color_scheme_list();
|
2013-12-16 06:51:35 -08:00
|
|
|
|
2020-11-03 14:33:42 -08:00
|
|
|
EINA_LIST_FOREACH_SAFE(schemes, l, l_next, cs)
|
2013-12-16 06:51:35 -08:00
|
|
|
{
|
2020-11-03 14:33:42 -08:00
|
|
|
Color_Scheme_Info *csi;
|
|
|
|
|
|
|
|
csi = calloc(1, sizeof(Color_Scheme_Info));
|
|
|
|
if (!csi)
|
|
|
|
break;
|
|
|
|
csi->ctx = ctx;
|
|
|
|
csi->cs = cs;
|
|
|
|
csi->item = elm_gengrid_item_append(o, it_class, csi,
|
|
|
|
_cb_op_color_scheme_sel, csi);
|
|
|
|
if (csi->item)
|
2013-12-16 06:51:35 -08:00
|
|
|
{
|
2020-11-03 14:33:42 -08:00
|
|
|
ctx->cs_infos = eina_list_append(ctx->cs_infos, csi);
|
2018-01-15 13:51:16 -08:00
|
|
|
|
2020-11-04 14:17:32 -08:00
|
|
|
if ((config) && (config->color_scheme_name) &&
|
|
|
|
(!strcmp(config->color_scheme_name, cs->md.name)))
|
2018-01-15 14:49:03 -08:00
|
|
|
{
|
2020-11-03 14:33:42 -08:00
|
|
|
if (ctx->seltimer)
|
|
|
|
ecore_timer_del(ctx->seltimer);
|
2020-11-04 14:17:32 -08:00
|
|
|
ctx->seltimer = ecore_timer_add(0.2, _cb_sel_item, csi);
|
2018-01-15 14:49:03 -08:00
|
|
|
}
|
2013-12-16 06:51:35 -08:00
|
|
|
}
|
2020-11-03 14:33:42 -08:00
|
|
|
else
|
2013-12-16 06:51:35 -08:00
|
|
|
{
|
2020-11-03 14:33:42 -08:00
|
|
|
free(csi);
|
|
|
|
free(cs);
|
2013-12-16 06:51:35 -08:00
|
|
|
}
|
2020-11-03 14:33:42 -08:00
|
|
|
schemes = eina_list_remove_list(schemes, l);
|
2013-12-16 06:51:35 -08:00
|
|
|
}
|
|
|
|
|
2020-11-03 14:33:42 -08:00
|
|
|
elm_gengrid_item_class_free(it_class);
|
2018-01-14 03:52:46 -08:00
|
|
|
|
2020-11-03 14:33:42 -08:00
|
|
|
elm_box_pack_end(box, o);
|
|
|
|
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);
|
2013-12-16 06:51:35 -08:00
|
|
|
evas_object_show(o);
|
2012-08-21 20:12:40 -07:00
|
|
|
}
|