text_setting: Show monospaced fonts.

Monospaced fonts are identified by fontconfig APIs.
(i.e. Monospaced fonts have a spacing value with 100.)
Therefore, showing monospaced fonts are available only if fontconfig is
installed.
This commit is contained in:
Jaehyun Cho 2016-02-20 12:58:12 +09:00 committed by Jaehyun Cho
parent 9a4c1c667c
commit f391c03be0
7 changed files with 264 additions and 33 deletions

View File

@ -87,6 +87,13 @@ edje >= ${efl_version} \
eio >= ${efl_version} \
efreet >= ${efl_version}"
# Check fontconfig
PKG_CHECK_EXISTS([fontconfig >= 2.5.0],
[
AC_DEFINE(HAVE_FONTCONFIG, 1, [have fontconfig searching capabilities])
requirement_enventor="fontconfig >= 2.5.0 ${requirement_enventor}"
])
AC_SUBST(requirement_enventor)
PKG_CHECK_MODULES([ENVENTOR], [${requirement_enventor}])

View File

@ -1,3 +1,6 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "common.h"
typedef struct config_s
@ -39,6 +42,7 @@ typedef struct config_s
Eina_Bool auto_complete;
Eina_Bool smart_undo_redo;
Eina_Bool edc_navigator;
Eina_Bool monospace_font;
} config_data;
static config_data *g_cd = NULL;
@ -182,6 +186,10 @@ config_load(void)
cd->version = ENVENTOR_CONFIG_VERSION;
cd->smart_undo_redo = EINA_FALSE;
cd->edc_navigator = EINA_TRUE;
#ifdef HAVE_FONTCONFIG
//Check Monospace Font is disabled if fontconfig is not installed.
cd->monospace_font = EINA_TRUE;
#endif
}
g_cd = cd;
@ -299,6 +307,8 @@ eddc_init(void)
smart_undo_redo, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "edc_navigator",
edc_navigator, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "monospace_font",
monospace_font, EET_T_UCHAR);
}
void
@ -901,3 +911,17 @@ config_edc_navigator_get(void)
config_data *cd = g_cd;
return cd->edc_navigator;
}
void
config_monospace_font_set(Eina_Bool monospace_font)
{
config_data *cd = g_cd;
cd->monospace_font = monospace_font;
}
Eina_Bool
config_monospace_font_get(void)
{
config_data *cd = g_cd;
return cd->monospace_font;
}

View File

@ -185,7 +185,7 @@ setting_reset_btn_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
text_setting_linenumber_set(config_linenumber_get());
text_setting_auto_indent_set(config_auto_indent_get());
text_setting_auto_complete_set(config_auto_complete_get());
text_setting_monospace_font_set(config_monospace_font_get());
text_setting_syntax_color_reset();
}

View File

@ -11,6 +11,10 @@
#define SYNTAX_TEMPLATE_FONT_SIZE 10
#define SYNTAX_COLOR_LEN 7
#ifdef HAVE_FONTCONFIG
static FcConfig *fc_config = NULL;
#endif
static char unsupported_font_list[UNSUPPORTED_FONT_CNT][UNSUPPORTED_FONT_MAX_LEN] =
{
"Dingbats", "KacstArt", "KacstBook", "KacstDecorative", "KacstDigital",
@ -620,24 +624,69 @@ font_name_selected_cb(void *data, Evas_Object *obj,
elm_list_clear(list_font_style);
//Append Items of Font Style List
Elm_Font_Properties *efp;
Eina_List *font_list;
Eina_List *font_list = NULL;
Eina_List *l, *ll;
char *font, *style;
#ifdef HAVE_FONTCONFIG
if (!fc_config)
fc_config = FcInitLoadConfigAndFonts();
FcPattern *p = FcPatternCreate();
FcObjectSet *os = FcObjectSetBuild(FC_FAMILY, FC_STYLE, FC_SPACING, NULL);
FcFontSet *set = NULL;
if (p && os) set = FcFontList(fc_config, p, os);
if (p) FcPatternDestroy(p);
if (os) FcObjectSetDestroy(os);
if (set)
{
int i;
for (i = 0; i < set->nfont; i++)
{
char *font = (char *)FcNameUnparse(set->fonts[i]);
font_list = eina_list_append(font_list,
eina_stringshare_add(font));
free(font);
}
FcFontSetDestroy(set);
}
#else
font_list = evas_font_available_list(evas_object_evas_get(obj));
#endif
if (!font_list) return;
font_list = eina_list_sort(font_list, eina_list_count(font_list),
font_cmp_cb);
EINA_LIST_FOREACH(font_list, l, font)
{
efp = elm_font_properties_get(font);
Elm_Font_Properties *efp = elm_font_properties_get(font);
if (efp)
{
if (!strcmp(font_name, efp->name))
{
EINA_LIST_FOREACH(efp->styles, ll, style)
{
elm_list_item_append(list_font_style, style, NULL, NULL,
font_style_selected_cb, obj);
#ifdef HAVE_FONTCONFIG
char *spacing = strstr(style, ":spacing=");
if (spacing)
{
const char *style_only = NULL;
int style_len = spacing - style;
style_only = eina_stringshare_add_length(style,
style_len);
elm_list_item_append(list_font_style, style_only,
NULL, NULL,
font_style_selected_cb, obj);
eina_stringshare_del(style_only);
}
else
#endif
elm_list_item_append(list_font_style, style, NULL,
NULL, font_style_selected_cb,
obj);
}
}
elm_font_properties_free(efp);
@ -663,6 +712,77 @@ is_supported_font(const char *font_name)
return EINA_TRUE;
}
//Check Monospace Font is disabled if fontconfig is not installed.
#ifdef HAVE_FONTCONFIG
static void
monospace_font_check_changed_cb(void *data, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
text_setting_data *tsd = data;
Eina_List *font_list = NULL;
Eina_List *l;
char *font;
char prev_font[128] = {0};
//Reset Font Name List and Font Style List
elm_list_clear(tsd->list_font_name);
elm_list_clear(tsd->list_font_style);
if (!fc_config)
fc_config = FcInitLoadConfigAndFonts();
FcPattern *p = FcPatternCreate();
FcObjectSet *os = FcObjectSetBuild(FC_FAMILY, FC_STYLE, FC_SPACING, NULL);
FcFontSet *set = NULL;
if (p && os) set = FcFontList(fc_config, p, os);
if (p) FcPatternDestroy(p);
if (os) FcObjectSetDestroy(os);
if (set)
{
int i;
for (i = 0; i < set->nfont; i++)
{
char *font = (char *)FcNameUnparse(set->fonts[i]);
font_list = eina_list_append(font_list,
eina_stringshare_add(font));
free(font);
}
FcFontSetDestroy(set);
}
font_list = eina_list_sort(font_list, eina_list_count(font_list),
font_cmp_cb);
EINA_LIST_FOREACH(font_list, l, font)
{
Elm_Font_Properties *efp = elm_font_properties_get(font);
if (efp)
{
if (elm_check_state_get(obj))
{
char *style = eina_list_data_get(efp->styles);
if (!strstr(style, ":spacing=100"))
{
elm_font_properties_free(efp);
continue;
}
}
if (strcmp(prev_font, efp->name) && is_supported_font(efp->name))
{
elm_list_item_append(tsd->list_font_name, efp->name, NULL,
NULL, font_name_selected_cb,
tsd->list_font_style);
snprintf(prev_font, sizeof(prev_font), "%s", efp->name);
}
elm_font_properties_free(efp);
}
}
elm_list_go(tsd->list_font_name);
}
#endif
Evas_Object *
text_setting_layout_create(Evas_Object *parent)
{
@ -759,78 +879,134 @@ text_setting_layout_create(Evas_Object *parent)
config_smart_undo_redo_get());
elm_box_pack_end(box, toggle_smart_undo_redo);
//Font Name and Style (Box)
//Font Name and Style and Check Monospace Font (Box)
box = elm_box_add(layout);
elm_box_horizontal_set(box, EINA_TRUE);
evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_object_part_content_set(layout, "elm.swallow.font", box);
//Font Name (Box)
//Font Name and Style (Box2)
box2 = elm_box_add(box);
elm_box_horizontal_set(box2, EINA_TRUE);
evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(box2);
elm_box_pack_end(box, box2);
//Font Name (Label)
//Font Name (Box3)
Evas_Object *box3 = elm_box_add(box2);
evas_object_size_hint_weight_set(box3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(box3, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(box3);
elm_box_pack_end(box2, box3);
//Font Name (Label)
/* This layout is intended to put the label aligned to left side
far from 3 pixels. */
Evas_Object *layout_padding3 = elm_layout_add(box2);
Evas_Object *layout_padding3 = elm_layout_add(box3);
elm_layout_file_set(layout_padding3, EDJE_PATH, "padding3_layout");
evas_object_show(layout_padding3);
elm_box_pack_end(box2, layout_padding3);
elm_box_pack_end(box3, layout_padding3);
Evas_Object *label_font_name = label_create(layout_padding3, _("Font Name"));
elm_object_part_content_set(layout_padding3, "elm.swallow.content",
label_font_name);
//Font Name (List)
Evas_Object *list_font_name = list_create(box2);
elm_box_pack_end(box2, list_font_name);
Evas_Object *list_font_name = list_create(box3);
elm_box_pack_end(box3, list_font_name);
//Font Style (Box)
box2 = elm_box_add(box);
evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(box2);
elm_box_pack_end(box, box2);
//Font Style (Box3)
box3 = elm_box_add(box2);
evas_object_size_hint_weight_set(box3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(box3, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(box3);
elm_box_pack_end(box2, box3);
//Font Style (Label)
/* This layout is intended to put the label aligned to left side
far from 3 pixels. */
layout_padding3 = elm_layout_add(box2);
layout_padding3 = elm_layout_add(box3);
elm_layout_file_set(layout_padding3, EDJE_PATH, "padding3_layout");
evas_object_show(layout_padding3);
elm_box_pack_end(box2, layout_padding3);
elm_box_pack_end(box3, layout_padding3);
Evas_Object *label_font_style = label_create(layout_padding3, _("Font Style"));
elm_object_part_content_set(layout_padding3, "elm.swallow.content",
label_font_style);
//Font Style (List)
Evas_Object *list_font_style = list_create(box2);
elm_box_pack_end(box2, list_font_style);
Evas_Object *list_font_style = list_create(box3);
elm_box_pack_end(box3, list_font_style);
//Check (Monospace Font)
Evas_Object *check_monospace_font = elm_check_add(box);
evas_object_size_hint_weight_set(check_monospace_font, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(check_monospace_font, EVAS_HINT_FILL, 0);
elm_object_text_set(check_monospace_font, _("Monospaced Fonts"));
#ifdef HAVE_FONTCONFIG
elm_check_state_set(check_monospace_font, config_monospace_font_get());
evas_object_smart_callback_add(check_monospace_font, "changed",
monospace_font_check_changed_cb, tsd);
#else
elm_check_state_set(check_monospace_font, EINA_FALSE);
elm_object_disabled_set(check_monospace_font, EINA_TRUE);
#endif
evas_object_show(check_monospace_font);
elm_box_pack_end(box, check_monospace_font);
//Append Items of Font Name List
Elm_Font_Properties *efp;
Eina_List *font_list;
Eina_List *font_list = NULL;
Eina_List *l;
char *font;
char prev_font[128] = {0};
#ifdef HAVE_FONTCONFIG
if (!fc_config)
fc_config = FcInitLoadConfigAndFonts();
FcPattern *p = FcPatternCreate();
FcObjectSet *os = FcObjectSetBuild(FC_FAMILY, FC_STYLE, FC_SPACING, NULL);
FcFontSet *set = NULL;
if (p && os) set = FcFontList(fc_config, p, os);
if (p) FcPatternDestroy(p);
if (os) FcObjectSetDestroy(os);
if (set)
{
int i;
for (i = 0; i < set->nfont; i++)
{
char *font = (char *)FcNameUnparse(set->fonts[i]);
font_list = eina_list_append(font_list,
eina_stringshare_add(font));
free(font);
}
FcFontSetDestroy(set);
}
#else
font_list = evas_font_available_list(evas_object_evas_get(parent));
#endif
font_list = eina_list_sort(font_list, eina_list_count(font_list),
font_cmp_cb);
EINA_LIST_FOREACH(font_list, l, font)
{
efp = elm_font_properties_get(font);
Elm_Font_Properties *efp = elm_font_properties_get(font);
if (efp)
{
#ifdef HAVE_FONTCONFIG
if (elm_check_state_get(check_monospace_font))
{
char *style = eina_list_data_get(efp->styles);
if (!strstr(style, ":spacing=100"))
{
elm_font_properties_free(efp);
continue;
}
}
#endif
if (strcmp(prev_font, efp->name) && is_supported_font(efp->name))
{
elm_list_item_append(list_font_name, efp->name, NULL, NULL,
@ -849,6 +1025,9 @@ text_setting_layout_create(Evas_Object *parent)
tsd->toggle_indent = toggle_indent;
tsd->toggle_autocomp = toggle_autocomp;
tsd->toggle_smart_undo_redo = toggle_smart_undo_redo;
tsd->check_monospace_font = check_monospace_font;
tsd->list_font_name = list_font_name;
tsd->list_font_style = list_font_style;
return layout;
}
@ -895,6 +1074,7 @@ text_setting_config_set(void)
config_auto_indent_set(elm_check_state_get(tsd->toggle_indent));
config_auto_complete_set(elm_check_state_get(tsd->toggle_autocomp));
config_smart_undo_redo_set(elm_check_state_get(tsd->toggle_smart_undo_redo));
config_monospace_font_set(elm_check_state_get(tsd->check_monospace_font));
}
static void
@ -961,6 +1141,13 @@ text_setting_smart_undo_redo_set(Eina_Bool enabled)
elm_check_state_set(tsd->toggle_smart_undo_redo, enabled);
}
void
text_setting_monospace_font_set(Eina_Bool enabled)
{
text_setting_data *tsd = g_tsd;
elm_check_state_set(tsd->check_monospace_font, enabled);
}
void
text_setting_init(void)
{

View File

@ -57,7 +57,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
#define ROUNDING(x, dig) (floor((x) * pow(10, dig) + 0.5) / pow(10, dig))
#define ENVENTOR_CONFIG_VERSION 5
#define ENVENTOR_CONFIG_VERSION 6
#define EVENT_KEY_MODIFIER_CHECK(NAME, MASK) \
((MASK & ECORE_EVENT_MODIFIER_##NAME) && \
@ -96,4 +96,11 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
#endif /* localization */
/* fontconfig */
#ifdef HAVE_FONTCONFIG
#include <fontconfig/fontconfig.h>
#include <fontconfig/fcfreetype.h>
#endif /* fontconfig */
#endif

View File

@ -60,3 +60,5 @@ void config_smart_undo_redo_set(Eina_Bool smart_undo_redo);
Eina_Bool config_smart_undo_redo_get(void);
void config_edc_navigator_set(Eina_Bool enabled);
Eina_Bool config_edc_navigator_get(void);
void config_monospace_font_set(Eina_Bool monospace_font);
Eina_Bool config_monospace_font_get(void);

View File

@ -16,6 +16,9 @@ struct text_setting_s
Evas_Object *toggle_indent;
Evas_Object *toggle_autocomp;
Evas_Object *toggle_smart_undo_redo;
Evas_Object *check_monospace_font;
Evas_Object *list_font_name;
Evas_Object *list_font_style;
color_keyword *color_keyword_list;
char *syntax_template_format;
@ -39,5 +42,6 @@ void text_setting_linenumber_set(Eina_Bool enabled);
void text_setting_auto_indent_set(Eina_Bool enabled);
void text_setting_auto_complete_set(Eina_Bool enabled);
void text_setting_smart_undo_redo_set(Eina_Bool enabled);
void text_setting_monospace_font_set(Eina_Bool enabled);
void text_setting_term(void);
void text_setting_init(void);