Fixed get_font_funcs to alias of default font.
[platform/core/api/system-settings.git] / system-settings-util / src / system_settings_util.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <errno.h>
5 #include <time.h>
6
7 #include <string.h>
8 #include <sys/types.h>
9 #include <sys/stat.h>
10 #include <fcntl.h>
11
12 #include <regex.h>
13
14 #include <dlog.h>
15 #include <vconf.h>
16
17 #include <glib.h>
18 #include <libxml/xmlmemory.h>
19 #include <libxml/parser.h>
20
21 #include <fontconfig/fontconfig.h>
22
23 #include <Elementary.h>
24 #include <Evas.h>
25 #include <Ecore_Evas.h>
26
27 #include <pkgmgr-info.h>
28
29 #include <system_settings.h>
30 #include <system_settings_private.h>
31
32 #include <tzplatform_config.h>
33 #include <system_settings_util.h>
34
35 #ifdef TIZEN_WEARABLE
36 #define SMALL_FONT_DPI                                          (-90)
37 #endif
38 #ifdef TIZEN_MOBILE
39 #define SMALL_FONT_DPI                                          (-80)
40 #endif
41 #define MIDDLE_FONT_DPI                                         (-100)
42 #ifdef TIZEN_WEARABLE
43 #define LARGE_FONT_DPI                                          (-110)
44 #endif
45 #ifdef TIZEN_MOBILE
46 #define LARGE_FONT_DPI                                          (-150)
47 #endif
48 #define HUGE_FONT_DPI                                           (-190)
49 #define GIANT_FONT_DPI                                          (-250)
50
51 #define SETTING_FONT_PRELOAD_FONT_PATH _TZ_SYS_RO_SHARE"/fonts"
52 #define SETTING_FONT_DOWNLOADED_FONT_PATH _TZ_SYS_SHARE"/fonts"
53
54 #define SETTING_FONT_CONF_FILE _TZ_SYS_ETC"/fonts/conf.avail/99-tizen.conf"
55
56 #define SETTING_FONT_TIZEN_FONT_ALIAS "Tizen"
57 #define SETTING_FONT_TIZEN_DEFAULT_FONT_ALIAS "TizenDefaultFont"
58
59 static int __font_size_get();
60
61 /* Returned family name should be free'd manually. */
62 char *__get_main_font_family_name_by_alias(char *alias)
63 {
64         SETTING_TRACE_BEGIN;
65         FcFontSet *set = NULL;
66         FcPattern *pat = NULL;
67         FcConfig *font_config = NULL;
68         FcChar8 *family = NULL;
69         char *ret = NULL;
70         FcResult res = 0;
71
72         font_config = FcInitLoadConfigAndFonts();
73
74         pat = FcPatternBuild(0, FC_FAMILY, FcTypeString, alias, (char *)0);
75         FcConfigSubstitute(font_config, pat, FcMatchPattern);
76         FcDefaultSubstitute(pat);
77
78         /* do matching */
79         set = FcFontSort(font_config, pat, FcTrue, NULL, &res);
80
81         if (set && (set->nfont > 0)) {
82                 FcPatternGetString(set->fonts[0], FC_FAMILY, 0, &family);
83                 ret = g_strdup((char *)family);
84
85                 FcFontSetDestroy(set);
86                 set = NULL;
87         }
88
89         if (pat) {
90                 FcPatternDestroy(pat);
91                 pat = NULL;
92         }
93
94         FcConfigDestroy(font_config);
95         font_config = NULL;
96
97         return ret;
98 }
99
100 /*  LCOV_EXCL_START */
101 bool __is_supported_image_type_load(char *path)
102 {
103         SETTING_TRACE_BEGIN;
104         evas_init();
105         Ecore_Evas      *ee;
106         Evas            *evas;
107
108         ee = ecore_evas_new(NULL, 0, 0, 100, 100, NULL);
109         evas = ecore_evas_get(ee);
110
111         Evas_Object *img = evas_object_image_add(evas);
112         evas_object_image_file_set(img, path, NULL);
113         Evas_Load_Error ret = evas_object_image_load_error_get(img);
114
115         bool result = false;
116         if (ret == EVAS_LOAD_ERROR_NONE) {
117                 SETTING_TRACE("%s - OK", path);
118                 result = true;
119         } else {
120                 SETTING_TRACE("%s - NO", path);
121                 result = false;
122         }
123         ecore_evas_free(ee);
124         evas_shutdown();
125         return result;
126 }
127 /*  LCOV_EXCL_STOP */
128
129 char *_get_cur_font()
130 {
131         return __get_main_font_family_name_by_alias(SETTING_FONT_TIZEN_FONT_ALIAS);
132 }
133
134 /*  LCOV_EXCL_START */
135 void font_config_set_notification()
136 {
137         SETTING_TRACE_BEGIN;
138 #if 0
139         /* notification */
140         Ecore_X_Window ecore_win = ecore_x_window_root_first_get();
141         Ecore_X_Atom atom = ecore_x_atom_get("FONT_TYPE_change");
142         ecore_x_window_prop_string_set(ecore_win, atom, "tizen");
143 #endif
144 }
145 /*  LCOV_EXCL_STOP */
146
147 /*  LCOV_EXCL_START */
148 int __is_available_font(char *font_name)
149 {
150         SETTING_TRACE_BEGIN;
151         FcObjectSet *os = NULL;
152         FcFontSet *fs = NULL;
153         FcPattern *pat = NULL;
154         FcConfig *font_config = NULL;
155
156         int ret = 0;
157
158         if (font_name == NULL)
159                 return -1;
160
161         font_config = FcInitLoadConfigAndFonts();
162
163         /*setting_retvm_if(font_config == NULL, NULL, "Failed: FcInitLoadConfigAndFonts"); */
164
165         char *locale = setlocale(0, NULL);
166
167         pat = FcPatternCreate();
168
169         os = FcObjectSetBuild(FC_FAMILY, FC_FILE, FC_FAMILYLANG, (char *) 0);
170
171         if (os) {
172                 fs = FcFontList(font_config, pat, os);
173                 FcObjectSetDestroy(os);
174                 os = NULL;
175         }
176
177         if (pat) {
178                 FcPatternDestroy(pat);
179                 pat = NULL;
180         }
181
182         if (fs) {
183                 int j;
184                 SETTING_TRACE("fs->nfont = %d", fs->nfont);
185
186                 for (j = 0; j < fs->nfont; j++) {
187                         FcChar8 *family = NULL;
188                         FcChar8 *file = NULL;
189
190                         if (FcPatternGetString(fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch) {
191                                 int preload_path_len = strlen(SETTING_FONT_PRELOAD_FONT_PATH);
192                                 int download_path_len = strlen(SETTING_FONT_DOWNLOADED_FONT_PATH);
193
194                                 if (file && (!strncmp((const char *)file, SETTING_FONT_PRELOAD_FONT_PATH, preload_path_len)
195                                                 || !strncmp((const char *)file, SETTING_FONT_DOWNLOADED_FONT_PATH, download_path_len))) {
196                                         char *family_result = NULL;
197                                         FcChar8 *lang = NULL;
198                                         int id = 0;
199                                         if (FcPatternGetString(fs->fonts[j], FC_FAMILY, id, &family) != FcResultMatch) {
200                                                 break;
201                                         }
202                                         if (FcPatternGetString(fs->fonts[j], FC_FAMILYLANG, id, &lang) != FcResultMatch) {
203                                                 break;
204                                         }
205                                         family_result = (char *)family;
206
207                                         /* Find proper family name for current locale. */
208                                         while (locale && family && lang) {
209                                                 if (!strncmp(locale, (char *)lang, strlen((char *)lang))) {
210                                                         family_result = (char *)family;
211                                                         break;
212                                                 }
213
214                                                 /* I will set english as default family language. */
215                                                 /* If there is no proper family language for current locale, */
216                                                 /* we have to show the english family name. */
217                                                 if (!strcmp((char *)lang, (char *)"en")) {
218                                                         family_result = (char *)family;
219                                                 }
220                                                 id++;
221                                                 if (FcPatternGetString(fs->fonts[j], FC_FAMILY, id, &family) != FcResultMatch) {
222                                                         break;
223                                                 }
224                                                 if (FcPatternGetString(fs->fonts[j], FC_FAMILYLANG, id, &lang) != FcResultMatch) {
225                                                         break;
226                                                 }
227                                         }
228
229                                         if (family_result) {
230                                                 SETTING_TRACE("-------- FONT - family_result = %s", (char *)family_result);
231                                                 if (strcmp(family_result, font_name) == 0) {
232                                                         ret = 1;
233                                                         break;
234                                                 }
235                                         }
236                                 }
237                         }
238                 }
239                 FcFontSetDestroy(fs);
240                 fs = NULL;
241         }
242         FcConfigDestroy(font_config);
243         font_config = NULL;
244         return ret;
245 }
246 /*  LCOV_EXCL_STOP */
247
248
249 char *_get_default_font()
250 {
251         return __get_main_font_family_name_by_alias(SETTING_FONT_TIZEN_DEFAULT_FONT_ALIAS);
252 }
253
254 /*  LCOV_EXCL_START */
255 bool font_config_set(char *font_name)
256 {
257         SETTING_TRACE_BEGIN;
258         Eina_List *text_classes = NULL;
259         Elm_Text_Class *etc = NULL;
260         const Eina_List *l = NULL;
261         Eina_List *fo_list = NULL;
262         Elm_Font_Overlay *efo = NULL;
263
264         int font_size = __font_size_get();
265         int size = 0;
266
267         text_classes = elm_config_text_classes_list_get();
268
269         fo_list = (Eina_List *)elm_config_font_overlay_list_get();
270
271         Eina_List *ll = NULL;
272         Eina_List *l_next = NULL;
273
274         Eina_Bool slp_medium_exist = EINA_FALSE;
275         Eina_Bool slp_roman_exist = EINA_FALSE;
276         Eina_Bool slp_bold_exist = EINA_FALSE;
277         Eina_Bool slp_regular_exist = EINA_FALSE;
278
279         /* Tizen */
280         Eina_Bool tizen_exist = EINA_FALSE;
281
282         EINA_LIST_FOREACH_SAFE(fo_list, ll, l_next, efo) {
283                 if (!strcmp(efo->text_class, "tizen_medium")) {
284                         elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
285                         slp_medium_exist = EINA_TRUE;
286                 } else if (!strcmp(efo->text_class, "tizen_roman")) {
287                         elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
288                         slp_roman_exist = EINA_TRUE;
289                 } else if (!strcmp(efo->text_class, "tizen_bold")) {
290                         elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
291                         slp_bold_exist = EINA_TRUE;
292                 } else if (!strcmp(efo->text_class, "tizen_regular")) {
293                         elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
294                         slp_regular_exist = EINA_TRUE;
295                 }
296
297                 /* Tizen */
298                 if (!strcmp(efo->text_class, "tizen")) {
299                         elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
300                         tizen_exist = EINA_TRUE;
301                 }
302
303         }
304
305         /* if slp_XX do not exist, need to set them, font size is -100(100%) */
306         if (slp_medium_exist == EINA_FALSE) {
307                 elm_config_font_overlay_set("tizen_medium", (const char *)font_name,  MIDDLE_FONT_DPI);
308         }
309         if (slp_roman_exist == EINA_FALSE) {
310                 elm_config_font_overlay_set("tizen_roman", (const char *)font_name,      MIDDLE_FONT_DPI);
311         }
312         if (slp_bold_exist == EINA_FALSE) {
313                 elm_config_font_overlay_set("tizen_bold", (const char *)font_name,      MIDDLE_FONT_DPI);
314         }
315         if (slp_regular_exist == EINA_FALSE) {
316                 elm_config_font_overlay_set("tizen_regular", (const char *)font_name,  MIDDLE_FONT_DPI);
317         }
318
319         /* Tizen */
320         if (tizen_exist == EINA_FALSE) {
321                 elm_config_font_overlay_set("tizen", (const char *)font_name,  MIDDLE_FONT_DPI);
322         }
323
324         elm_config_font_overlay_set("tizen", (const char *)font_name,  MIDDLE_FONT_DPI);
325
326         /* Tizen */
327         elm_config_font_overlay_set("tizen", (const char *)font_name,  MIDDLE_FONT_DPI);
328
329         EINA_LIST_FOREACH(text_classes, l, etc) {
330                 ll = NULL;
331
332                 size = font_size;
333                 EINA_LIST_FOREACH(fo_list, ll, efo) {
334                         if (!strcmp(etc->name, efo->text_class)) {
335                                 size = efo->size;
336                         }
337                 }
338                 elm_config_font_overlay_set(etc->name, (const char *)font_name, size);
339         }
340         elm_config_text_classes_list_free(text_classes);
341         text_classes = NULL;
342
343         /* add new function */
344 #ifdef USE_EFL_ASSIST
345         ea_theme_system_font_set(font_name, font_size);
346         ea_theme_system_fonts_apply();
347 #endif
348
349         elm_config_font_overlay_apply();
350         elm_config_all_flush();
351         elm_config_save();
352         return 1;
353 }
354 /*  LCOV_EXCL_STOP */
355
356 /*  LCOV_EXCL_START */
357 void __font_size_set()
358 {
359         SETTING_TRACE_BEGIN;
360         Eina_List *text_classes = NULL;
361         Elm_Text_Class *etc = NULL;
362         const Eina_List *l = NULL;
363         int font_size = __font_size_get();
364         char *font_name = _get_cur_font();
365
366         if (font_size == -1) {
367                 return;
368         }
369
370         text_classes = elm_config_text_classes_list_get();
371
372         EINA_LIST_FOREACH(text_classes, l, etc) {
373                 elm_config_font_overlay_set(etc->name, font_name, font_size);
374         }
375
376         elm_config_text_classes_list_free(text_classes);
377
378 #ifdef USE_EFL_ASSIST
379         ea_theme_system_font_set(font_name, font_size);
380         ea_theme_system_fonts_apply();
381 #endif
382
383         elm_config_font_overlay_apply();
384         elm_config_all_flush();
385         elm_config_save();
386
387         text_classes = NULL;
388         g_free(font_name);
389 }
390 /*  LCOV_EXCL_STOP */
391
392 /*  LCOV_EXCL_START */
393 static int __font_size_get()
394 {
395         SETTING_TRACE_BEGIN;
396         int font_size = -1;
397
398         int vconf_value = -1;
399         if (vconf_get_int(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, &vconf_value)) {
400                 return -1;
401         }
402
403         switch (vconf_value) {
404         case SYSTEM_SETTINGS_FONT_SIZE_SMALL:
405                 font_size = SMALL_FONT_DPI;
406                 break;
407         case SYSTEM_SETTINGS_FONT_SIZE_NORMAL:
408                 font_size = MIDDLE_FONT_DPI;
409                 break;
410         case SYSTEM_SETTINGS_FONT_SIZE_LARGE:
411                 font_size = LARGE_FONT_DPI;
412                 break;
413         case SYSTEM_SETTINGS_FONT_SIZE_HUGE:
414                 font_size = HUGE_FONT_DPI;
415                 break;
416         case SYSTEM_SETTINGS_FONT_SIZE_GIANT:
417                 font_size = GIANT_FONT_DPI;
418                 break;
419         default:
420                 font_size = MIDDLE_FONT_DPI;
421                 break;
422         }
423         return font_size;
424 }
425 /*  LCOV_EXCL_STOP */