2014-12-01 14:54:17 -08:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <Eet.h>
|
|
|
|
#include <Eina.h>
|
|
|
|
#include <Ecore_File.h>
|
|
|
|
#include <Efreet.h>
|
|
|
|
#include <Elementary.h>
|
|
|
|
|
|
|
|
#include "edi_config.h"
|
|
|
|
|
|
|
|
#include "edi_private.h"
|
|
|
|
|
|
|
|
# define EDI_CONFIG_LIMIT(v, min, max) \
|
|
|
|
if (v > max) v = max; else if (v < min) v = min;
|
|
|
|
|
|
|
|
# define EDI_CONFIG_DD_NEW(str, typ) \
|
|
|
|
_edi_config_descriptor_new(str, sizeof(typ))
|
|
|
|
|
|
|
|
# define EDI_CONFIG_DD_FREE(eed) \
|
|
|
|
if (eed) { eet_data_descriptor_free(eed); (eed) = NULL; }
|
|
|
|
|
|
|
|
# define EDI_CONFIG_VAL(edd, type, member, dtype) \
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(edd, type, #member, member, dtype)
|
|
|
|
|
|
|
|
# define EDI_CONFIG_SUB(edd, type, member, eddtype) \
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_SUB(edd, type, #member, member, eddtype)
|
|
|
|
|
|
|
|
# define EDI_CONFIG_LIST(edd, type, member, eddtype) \
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_LIST(edd, type, #member, member, eddtype)
|
|
|
|
|
|
|
|
# define EDI_CONFIG_HASH(edd, type, member, eddtype) \
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_HASH(edd, type, #member, member, eddtype)
|
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
# define EDI_CONFIG_FILE_EPOCH 0x0003
|
|
|
|
# define EDI_CONFIG_FILE_GENERATION 0x000c
|
2014-12-01 14:54:17 -08:00
|
|
|
# define EDI_CONFIG_FILE_VERSION \
|
|
|
|
((EDI_CONFIG_FILE_EPOCH << 16) | EDI_CONFIG_FILE_GENERATION)
|
|
|
|
|
2015-05-30 02:26:51 -07:00
|
|
|
# define EDI_PROJECT_CONFIG_FILE_EPOCH 0x0001
|
2016-02-08 16:32:16 -08:00
|
|
|
# define EDI_PROJECT_CONFIG_FILE_GENERATION 0x0003
|
2015-05-16 01:56:39 -07:00
|
|
|
# define EDI_PROJECT_CONFIG_FILE_VERSION \
|
|
|
|
((EDI_PROJECT_CONFIG_FILE_EPOCH << 16) | EDI_PROJECT_CONFIG_FILE_GENERATION)
|
|
|
|
|
2014-12-01 14:54:17 -08:00
|
|
|
typedef Eet_Data_Descriptor Edi_Config_DD;
|
2015-05-16 01:56:39 -07:00
|
|
|
typedef Eet_Data_Descriptor Edi_Project_Config_DD;
|
2014-12-01 14:54:17 -08:00
|
|
|
|
|
|
|
/* local variables */
|
|
|
|
static Edi_Config_DD *_edi_cfg_edd = NULL;
|
|
|
|
static Edi_Config_DD *_edi_cfg_proj_edd = NULL;
|
2015-02-07 00:13:40 -08:00
|
|
|
static Edi_Config_DD *_edi_cfg_mime_edd = NULL;
|
2014-12-01 14:54:17 -08:00
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
static Edi_Project_Config_DD *_edi_proj_cfg_edd = NULL;
|
2015-05-18 08:32:46 -07:00
|
|
|
static Edi_Project_Config_DD *_edi_proj_cfg_tab_edd = NULL;
|
2015-05-16 01:56:39 -07:00
|
|
|
|
2014-12-01 14:54:17 -08:00
|
|
|
/* external variables */
|
2015-05-16 01:56:39 -07:00
|
|
|
Edi_Config *_edi_config = NULL;
|
|
|
|
Edi_Project_Config *_edi_project_config = NULL;
|
2015-03-08 14:07:02 -07:00
|
|
|
int EDI_EVENT_CONFIG_CHANGED;
|
2014-12-01 14:54:17 -08:00
|
|
|
|
|
|
|
const char *
|
|
|
|
_edi_config_dir_get(void)
|
|
|
|
{
|
|
|
|
static char dir[PATH_MAX];
|
|
|
|
|
|
|
|
if (!dir[0])
|
|
|
|
snprintf(dir, sizeof(dir), "%s/edi", efreet_config_home_get());
|
|
|
|
|
|
|
|
return dir;
|
|
|
|
}
|
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
const char *
|
|
|
|
_edi_project_config_dir_get(void)
|
|
|
|
{
|
|
|
|
static char dir[PATH_MAX];
|
|
|
|
|
|
|
|
if (!dir[0] && edi_project_get())
|
|
|
|
snprintf(dir, sizeof(dir), "%s/.edi", edi_project_get());
|
|
|
|
|
|
|
|
return dir;
|
|
|
|
}
|
|
|
|
|
2014-12-01 14:54:17 -08:00
|
|
|
/* local functions */
|
|
|
|
static Edi_Config_DD *
|
|
|
|
_edi_config_descriptor_new(const char *name, int size)
|
|
|
|
{
|
|
|
|
Eet_Data_Descriptor_Class eddc;
|
|
|
|
|
2016-02-11 06:14:30 -08:00
|
|
|
if (!eet_eina_stream_data_descriptor_class_set(&eddc, sizeof(eddc),
|
2014-12-01 14:54:17 -08:00
|
|
|
name, size))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
return (Edi_Config_DD *)eet_data_descriptor_stream_new(&eddc);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_edi_config_cb_free(void)
|
|
|
|
{
|
|
|
|
Edi_Config_Project *proj;
|
2015-02-07 08:37:36 -08:00
|
|
|
Edi_Config_Mime_Association *mime;
|
2014-12-01 14:54:17 -08:00
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
EINA_LIST_FREE(_edi_config->projects, proj)
|
2014-12-01 14:54:17 -08:00
|
|
|
{
|
|
|
|
if (proj->name) eina_stringshare_del(proj->name);
|
|
|
|
if (proj->path) eina_stringshare_del(proj->path);
|
|
|
|
free(proj);
|
|
|
|
}
|
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
EINA_LIST_FREE(_edi_config->mime_assocs, mime)
|
2015-02-07 00:13:40 -08:00
|
|
|
{
|
2015-02-07 08:37:36 -08:00
|
|
|
if (mime->id) eina_stringshare_del(mime->id);
|
|
|
|
if (mime->mime) eina_stringshare_del(mime->mime);
|
|
|
|
free(mime);
|
2015-02-07 00:13:40 -08:00
|
|
|
}
|
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
free(_edi_config);
|
|
|
|
_edi_config = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_edi_project_config_cb_free(void)
|
|
|
|
{
|
2015-05-18 08:32:46 -07:00
|
|
|
Edi_Project_Config_Tab *tab;
|
|
|
|
|
2015-05-21 05:58:51 -07:00
|
|
|
if (!_edi_project_config)
|
|
|
|
return;
|
|
|
|
|
2015-05-18 08:32:46 -07:00
|
|
|
EINA_LIST_FREE(_edi_project_config->tabs, tab)
|
|
|
|
{
|
|
|
|
if (tab->path) eina_stringshare_del(tab->path);
|
|
|
|
free(tab);
|
|
|
|
}
|
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
free(_edi_project_config);
|
|
|
|
_edi_project_config = NULL;
|
2014-12-01 14:54:17 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
2015-05-16 01:56:39 -07:00
|
|
|
_edi_config_domain_load(const char *dir, const char *domain, Eet_Data_Descriptor *edd)
|
2014-12-01 14:54:17 -08:00
|
|
|
{
|
|
|
|
Eet_File *ef;
|
|
|
|
char buff[PATH_MAX];
|
|
|
|
|
|
|
|
if (!domain) return NULL;
|
|
|
|
snprintf(buff, sizeof(buff),
|
2015-05-16 01:56:39 -07:00
|
|
|
"%s/%s.cfg", dir, domain);
|
2014-12-01 14:54:17 -08:00
|
|
|
ef = eet_open(buff, EET_FILE_MODE_READ);
|
|
|
|
if (ef)
|
|
|
|
{
|
|
|
|
void *data;
|
|
|
|
|
|
|
|
data = eet_data_read(ef, edd, "config");
|
|
|
|
eet_close(ef);
|
|
|
|
if (data) return data;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2016-02-11 06:14:30 -08:00
|
|
|
static Eina_Bool
|
2015-05-16 01:56:39 -07:00
|
|
|
_edi_config_domain_save(const char *dir, const char *domain, Eet_Data_Descriptor *edd, const void *data)
|
2014-12-01 14:54:17 -08:00
|
|
|
{
|
|
|
|
Eet_File *ef;
|
|
|
|
char buff[PATH_MAX];
|
|
|
|
|
|
|
|
if (!domain) return 0;
|
2015-05-16 01:56:39 -07:00
|
|
|
snprintf(buff, sizeof(buff), "%s/", dir);
|
2014-12-01 14:54:17 -08:00
|
|
|
if (!ecore_file_exists(buff)) ecore_file_mkpath(buff);
|
2015-05-16 01:56:39 -07:00
|
|
|
snprintf(buff, sizeof(buff), "%s/%s.tmp", dir, domain);
|
2014-12-01 14:54:17 -08:00
|
|
|
ef = eet_open(buff, EET_FILE_MODE_WRITE);
|
|
|
|
if (ef)
|
|
|
|
{
|
|
|
|
char buff2[PATH_MAX];
|
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
snprintf(buff2, sizeof(buff2), "%s/%s.cfg", dir, domain);
|
2014-12-01 14:54:17 -08:00
|
|
|
if (!eet_data_write(ef, edd, "config", data, 1))
|
|
|
|
{
|
|
|
|
eet_close(ef);
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
if (eet_close(ef) > 0) return EINA_FALSE;
|
|
|
|
if (!ecore_file_mv(buff, buff2)) return EINA_FALSE;
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* external functions */
|
2016-02-11 06:14:30 -08:00
|
|
|
Eina_Bool
|
2014-12-01 14:54:17 -08:00
|
|
|
_edi_config_init(void)
|
|
|
|
{
|
|
|
|
elm_need_efreet();
|
|
|
|
if (!efreet_init()) return EINA_FALSE;
|
2015-03-08 14:07:02 -07:00
|
|
|
EDI_EVENT_CONFIG_CHANGED = ecore_event_type_new();
|
2014-12-01 14:54:17 -08:00
|
|
|
|
|
|
|
_edi_cfg_proj_edd = EDI_CONFIG_DD_NEW("Config_Project", Edi_Config_Project);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T Edi_Config_Project
|
|
|
|
#define D _edi_cfg_proj_edd
|
|
|
|
EDI_CONFIG_VAL(D, T, name, EET_T_STRING);
|
|
|
|
EDI_CONFIG_VAL(D, T, path, EET_T_STRING);
|
|
|
|
|
2015-02-07 08:37:36 -08:00
|
|
|
_edi_cfg_mime_edd = EDI_CONFIG_DD_NEW("Config_Mime", Edi_Config_Mime_Association);
|
2015-02-07 00:13:40 -08:00
|
|
|
#undef T
|
|
|
|
#undef D
|
2015-02-07 08:37:36 -08:00
|
|
|
#define T Edi_Config_Mime_Association
|
2015-02-07 00:13:40 -08:00
|
|
|
#define D _edi_cfg_mime_edd
|
|
|
|
EDI_CONFIG_VAL(D, T, id, EET_T_STRING);
|
|
|
|
EDI_CONFIG_VAL(D, T, mime, EET_T_STRING);
|
|
|
|
|
2014-12-01 14:54:17 -08:00
|
|
|
_edi_cfg_edd = EDI_CONFIG_DD_NEW("Config", Edi_Config);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T Edi_Config
|
|
|
|
#define D _edi_cfg_edd
|
|
|
|
EDI_CONFIG_VAL(D, T, version, EET_T_INT);
|
2015-05-16 01:56:39 -07:00
|
|
|
EDI_CONFIG_VAL(D, T, autosave, EET_T_UCHAR);
|
2015-08-29 06:46:18 -07:00
|
|
|
EDI_CONFIG_VAL(D, T, trim_whitespace, EET_T_UCHAR);
|
2015-05-16 01:56:39 -07:00
|
|
|
|
|
|
|
EDI_CONFIG_LIST(D, T, projects, _edi_cfg_proj_edd);
|
|
|
|
EDI_CONFIG_LIST(D, T, mime_assocs, _edi_cfg_mime_edd);
|
|
|
|
|
2015-05-18 08:32:46 -07:00
|
|
|
_edi_proj_cfg_tab_edd = EDI_CONFIG_DD_NEW("Project_Config_Tab", Edi_Project_Config_Tab);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T Edi_Project_Config_Tab
|
|
|
|
#define D _edi_proj_cfg_tab_edd
|
|
|
|
EDI_CONFIG_VAL(D, T, path, EET_T_STRING);
|
|
|
|
EDI_CONFIG_VAL(D, T, windowed, EET_T_UCHAR);
|
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
_edi_proj_cfg_edd = EDI_CONFIG_DD_NEW("Project_Config", Edi_Project_Config);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T Edi_Project_Config
|
|
|
|
#define D _edi_proj_cfg_edd
|
|
|
|
EDI_CONFIG_VAL(D, T, version, EET_T_INT);
|
2015-05-24 10:39:57 -07:00
|
|
|
EDI_CONFIG_VAL(D, T, font.name, EET_T_STRING);
|
2014-12-01 14:54:17 -08:00
|
|
|
EDI_CONFIG_VAL(D, T, font.size, EET_T_INT);
|
|
|
|
EDI_CONFIG_VAL(D, T, gui.translucent, EET_T_UCHAR);
|
2014-12-03 15:52:12 -08:00
|
|
|
EDI_CONFIG_VAL(D, T, gui.width, EET_T_INT);
|
|
|
|
EDI_CONFIG_VAL(D, T, gui.height, EET_T_INT);
|
|
|
|
EDI_CONFIG_VAL(D, T, gui.leftsize, EET_T_DOUBLE);
|
|
|
|
EDI_CONFIG_VAL(D, T, gui.leftopen, EET_T_UCHAR);
|
|
|
|
EDI_CONFIG_VAL(D, T, gui.bottomsize, EET_T_DOUBLE);
|
|
|
|
EDI_CONFIG_VAL(D, T, gui.bottomopen, EET_T_UCHAR);
|
|
|
|
EDI_CONFIG_VAL(D, T, gui.bottomtab, EET_T_INT);
|
2015-03-27 17:45:20 -07:00
|
|
|
EDI_CONFIG_VAL(D, T, gui.show_whitespace, EET_T_UCHAR);
|
2015-03-29 12:40:24 -07:00
|
|
|
EDI_CONFIG_VAL(D, T, gui.width_marker, EET_T_UINT);
|
|
|
|
EDI_CONFIG_VAL(D, T, gui.tabstop, EET_T_UINT);
|
2015-05-18 15:17:24 -07:00
|
|
|
EDI_CONFIG_VAL(D, T, gui.toolbar_hidden, EET_T_UCHAR);
|
2016-02-08 16:32:16 -08:00
|
|
|
EDI_CONFIG_VAL(D, T, gui.tab_inserts_spaces, EET_T_UCHAR);
|
2014-12-01 14:54:17 -08:00
|
|
|
|
2015-05-18 08:32:46 -07:00
|
|
|
EDI_CONFIG_LIST(D, T, tabs, _edi_proj_cfg_tab_edd);
|
2015-05-31 04:13:31 -07:00
|
|
|
EDI_CONFIG_VAL(D, T, launch.path, EET_T_STRING);
|
|
|
|
EDI_CONFIG_VAL(D, T, launch.args, EET_T_STRING);
|
2015-05-18 08:32:46 -07:00
|
|
|
|
2014-12-01 14:54:17 -08:00
|
|
|
_edi_config_load();
|
|
|
|
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
2016-02-11 06:14:30 -08:00
|
|
|
Eina_Bool
|
2014-12-01 14:54:17 -08:00
|
|
|
_edi_config_shutdown(void)
|
|
|
|
{
|
|
|
|
_edi_config_cb_free();
|
2015-05-21 05:58:51 -07:00
|
|
|
_edi_project_config_cb_free();
|
2014-12-01 14:54:17 -08:00
|
|
|
|
|
|
|
EDI_CONFIG_DD_FREE(_edi_cfg_proj_edd);
|
2015-02-07 00:13:40 -08:00
|
|
|
EDI_CONFIG_DD_FREE(_edi_cfg_mime_edd);
|
2014-12-01 14:54:17 -08:00
|
|
|
EDI_CONFIG_DD_FREE(_edi_cfg_edd);
|
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
EDI_CONFIG_DD_FREE(_edi_proj_cfg_edd);
|
2015-05-18 08:32:46 -07:00
|
|
|
EDI_CONFIG_DD_FREE(_edi_proj_cfg_tab_edd);
|
2015-05-16 01:56:39 -07:00
|
|
|
|
2014-12-01 14:54:17 -08:00
|
|
|
efreet_shutdown();
|
|
|
|
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
2016-02-11 06:14:30 -08:00
|
|
|
void
|
2014-12-01 14:54:17 -08:00
|
|
|
_edi_config_load(void)
|
|
|
|
{
|
|
|
|
Eina_Bool save = EINA_FALSE;
|
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
_edi_config = _edi_config_domain_load(_edi_config_dir_get(), PACKAGE_NAME, _edi_cfg_edd);
|
|
|
|
if (_edi_config)
|
2014-12-01 14:54:17 -08:00
|
|
|
{
|
|
|
|
Eina_Bool reload = EINA_FALSE;
|
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
if ((_edi_config->version >> 16) < EDI_CONFIG_FILE_EPOCH)
|
2014-12-01 14:54:17 -08:00
|
|
|
{
|
|
|
|
/* config too old */
|
|
|
|
reload = EINA_TRUE;
|
|
|
|
}
|
2015-05-16 01:56:39 -07:00
|
|
|
else if (_edi_config->version > EDI_CONFIG_FILE_VERSION)
|
2014-12-01 14:54:17 -08:00
|
|
|
{
|
|
|
|
/* config too new, WTF ? */
|
|
|
|
reload = EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if too old or too new, clear it so we can create new */
|
|
|
|
if (reload) _edi_config_cb_free();
|
|
|
|
}
|
|
|
|
|
2016-02-11 06:14:30 -08:00
|
|
|
if (!_edi_config)
|
2014-12-01 14:54:17 -08:00
|
|
|
{
|
2015-05-16 01:56:39 -07:00
|
|
|
_edi_config = calloc(1, sizeof(Edi_Config));
|
2014-12-01 14:54:17 -08:00
|
|
|
save = EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* define some convenient macros */
|
2015-05-16 01:56:39 -07:00
|
|
|
#define IFCFG(v) if ((_edi_config->version & 0xffff) < (v)) {
|
2014-12-01 14:54:17 -08:00
|
|
|
#define IFCFGELSE } else {
|
|
|
|
#define IFCFGEND }
|
|
|
|
|
|
|
|
/* setup defaults */
|
2015-05-16 01:56:39 -07:00
|
|
|
IFCFG(0x000c);
|
2014-12-01 14:54:17 -08:00
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
_edi_config->autosave = EINA_TRUE;
|
2015-08-29 06:46:18 -07:00
|
|
|
_edi_config->trim_whitespace = EINA_TRUE;
|
2015-05-16 01:56:39 -07:00
|
|
|
_edi_config->projects = NULL;
|
|
|
|
_edi_config->mime_assocs = NULL;
|
2015-03-27 17:45:20 -07:00
|
|
|
IFCFGEND;
|
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
_edi_config->version = EDI_CONFIG_FILE_VERSION;
|
2014-12-01 14:54:17 -08:00
|
|
|
|
|
|
|
if (save) _edi_config_save();
|
|
|
|
}
|
|
|
|
|
2016-02-11 06:14:30 -08:00
|
|
|
void
|
2014-12-01 14:54:17 -08:00
|
|
|
_edi_config_save(void)
|
|
|
|
{
|
2015-05-16 01:56:39 -07:00
|
|
|
if (_edi_config_domain_save(_edi_config_dir_get(), PACKAGE_NAME, _edi_cfg_edd, _edi_config))
|
2015-03-08 14:07:02 -07:00
|
|
|
ecore_event_add(EDI_EVENT_CONFIG_CHANGED, NULL, NULL, NULL);
|
2014-12-01 14:54:17 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_edi_config_project_add(const char *path)
|
|
|
|
{
|
|
|
|
Edi_Config_Project *project;
|
|
|
|
Eina_List *list, *next;
|
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
EINA_LIST_FOREACH_SAFE(_edi_config->projects, list, next, project)
|
2014-12-01 14:54:17 -08:00
|
|
|
{
|
|
|
|
if (!strncmp(project->path, path, strlen(project->path)))
|
2015-05-16 01:56:39 -07:00
|
|
|
_edi_config->projects = eina_list_remove_list(_edi_config->projects, list);
|
2014-12-01 14:54:17 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
project = malloc(sizeof(*project));
|
|
|
|
project->path = eina_stringshare_add(path);
|
|
|
|
project->name = eina_stringshare_add(basename((char*) path));
|
2015-05-16 01:56:39 -07:00
|
|
|
_edi_config->projects = eina_list_prepend(_edi_config->projects, project);
|
2014-12-01 14:54:17 -08:00
|
|
|
_edi_config_save();
|
|
|
|
}
|
2015-01-15 15:13:14 -08:00
|
|
|
|
|
|
|
void
|
|
|
|
_edi_config_project_remove(const char *path)
|
|
|
|
{
|
|
|
|
Edi_Config_Project *project;
|
|
|
|
Eina_List *list, *next;
|
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
EINA_LIST_FOREACH_SAFE(_edi_config->projects, list, next, project)
|
2015-01-15 15:13:14 -08:00
|
|
|
{
|
|
|
|
if (!strncmp(project->path, path, strlen(project->path)))
|
2015-05-16 01:56:39 -07:00
|
|
|
break;
|
2015-01-15 15:13:14 -08:00
|
|
|
}
|
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
_edi_config->projects = eina_list_remove(_edi_config->projects, project);
|
2015-01-15 15:13:14 -08:00
|
|
|
_edi_config_save();
|
2015-05-18 09:56:21 -07:00
|
|
|
|
|
|
|
eina_stringshare_del(project->path);
|
|
|
|
eina_stringshare_del(project->name);
|
|
|
|
free(project);
|
2015-01-15 15:13:14 -08:00
|
|
|
}
|
2015-02-07 00:13:40 -08:00
|
|
|
|
|
|
|
void
|
|
|
|
_edi_config_mime_add(const char *mime, const char *id)
|
|
|
|
{
|
2015-02-07 08:37:36 -08:00
|
|
|
Edi_Config_Mime_Association *mime_assoc;
|
2015-02-07 00:13:40 -08:00
|
|
|
|
|
|
|
mime_assoc = malloc(sizeof(*mime_assoc));
|
|
|
|
mime_assoc->id = eina_stringshare_add(id);
|
|
|
|
mime_assoc->mime = eina_stringshare_add(mime);
|
2015-05-16 01:56:39 -07:00
|
|
|
_edi_config->mime_assocs = eina_list_prepend(_edi_config->mime_assocs, mime_assoc);
|
2015-02-07 00:13:40 -08:00
|
|
|
_edi_config_save();
|
|
|
|
}
|
|
|
|
|
2015-02-07 08:37:36 -08:00
|
|
|
const char *
|
2015-02-07 00:13:40 -08:00
|
|
|
_edi_config_mime_search(const char *mime)
|
|
|
|
{
|
2015-02-07 08:37:36 -08:00
|
|
|
Edi_Config_Mime_Association *mime_assoc;
|
2015-02-07 00:13:40 -08:00
|
|
|
Eina_List *list, *next;
|
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
EINA_LIST_FOREACH_SAFE(_edi_config->mime_assocs, list, next, mime_assoc)
|
2015-02-07 00:13:40 -08:00
|
|
|
{
|
|
|
|
if (!strncmp(mime_assoc->mime, mime, strlen(mime_assoc->mime)))
|
2015-02-07 08:37:36 -08:00
|
|
|
{
|
|
|
|
return mime_assoc->id;
|
|
|
|
}
|
2015-02-07 00:13:40 -08:00
|
|
|
}
|
2015-02-07 08:37:36 -08:00
|
|
|
return NULL;
|
2015-02-07 00:13:40 -08:00
|
|
|
}
|
2015-05-16 01:56:39 -07:00
|
|
|
|
|
|
|
void
|
|
|
|
_edi_project_config_load()
|
|
|
|
{
|
|
|
|
Eina_Bool save = EINA_FALSE;
|
|
|
|
|
|
|
|
_edi_project_config = _edi_config_domain_load(_edi_project_config_dir_get(), PACKAGE_NAME, _edi_proj_cfg_edd);
|
|
|
|
if (_edi_project_config)
|
|
|
|
{
|
|
|
|
Eina_Bool reload = EINA_FALSE;
|
|
|
|
|
|
|
|
if ((_edi_project_config->version >> 16) < EDI_PROJECT_CONFIG_FILE_EPOCH)
|
|
|
|
{
|
|
|
|
/* config too old */
|
|
|
|
reload = EINA_TRUE;
|
|
|
|
}
|
|
|
|
else if (_edi_project_config->version > EDI_PROJECT_CONFIG_FILE_VERSION)
|
|
|
|
{
|
|
|
|
/* config too new, WTF ? */
|
|
|
|
reload = EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if too old or too new, clear it so we can create new */
|
|
|
|
if (reload) _edi_project_config_cb_free();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!_edi_project_config)
|
|
|
|
{
|
|
|
|
_edi_project_config = calloc(1, sizeof(Edi_Project_Config));
|
|
|
|
save = EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* define some convenient macros */
|
|
|
|
#define IFPCFG(v) if ((_edi_project_config->version & 0xffff) < (v)) {
|
|
|
|
#define IFPCFGELSE } else {
|
|
|
|
#define IFPCFGEND }
|
|
|
|
|
|
|
|
/* setup defaults */
|
|
|
|
IFPCFG(0x0001);
|
|
|
|
_edi_project_config->gui.translucent = EINA_TRUE;
|
|
|
|
_edi_project_config->gui.width = 640;
|
|
|
|
_edi_project_config->gui.height = 480;
|
|
|
|
_edi_project_config->gui.leftsize = 0.25;
|
|
|
|
_edi_project_config->gui.leftopen = EINA_TRUE;
|
|
|
|
_edi_project_config->gui.bottomsize = 0.2;
|
|
|
|
_edi_project_config->gui.bottomopen = EINA_FALSE;
|
|
|
|
_edi_project_config->gui.bottomtab = 0;
|
|
|
|
|
2016-08-26 07:13:54 -07:00
|
|
|
_edi_project_config->gui.width_marker = 81;
|
2015-05-16 01:56:39 -07:00
|
|
|
_edi_project_config->gui.tabstop = 8;
|
2015-05-18 15:17:24 -07:00
|
|
|
_edi_project_config->gui.toolbar_hidden = EINA_FALSE;
|
2015-05-18 08:32:46 -07:00
|
|
|
|
|
|
|
_edi_project_config->tabs = NULL;
|
2015-05-16 01:56:39 -07:00
|
|
|
IFPCFGEND;
|
|
|
|
|
2015-05-24 10:39:57 -07:00
|
|
|
IFPCFG(0x0002);
|
2015-05-30 02:26:51 -07:00
|
|
|
_edi_project_config->font.name = eina_stringshare_add("Mono");
|
2015-05-24 10:39:57 -07:00
|
|
|
_edi_project_config->font.size = 12;
|
|
|
|
IFPCFGEND;
|
|
|
|
|
2016-02-08 16:32:16 -08:00
|
|
|
IFPCFG(0x0003);
|
|
|
|
_edi_project_config->gui.tab_inserts_spaces = EINA_TRUE;
|
|
|
|
IFPCFGEND;
|
|
|
|
|
2015-05-16 01:56:39 -07:00
|
|
|
/* limit config values so they are sane */
|
2015-05-30 02:26:51 -07:00
|
|
|
EDI_CONFIG_LIMIT(_edi_project_config->font.size, EDI_FONT_MIN, EDI_FONT_MAX);
|
2015-05-16 01:56:39 -07:00
|
|
|
EDI_CONFIG_LIMIT(_edi_project_config->gui.width, 150, 10000);
|
|
|
|
EDI_CONFIG_LIMIT(_edi_project_config->gui.height, 100, 8000);
|
|
|
|
EDI_CONFIG_LIMIT(_edi_project_config->gui.leftsize, 0.0, 1.0);
|
|
|
|
EDI_CONFIG_LIMIT(_edi_project_config->gui.bottomsize, 0.0, 1.0);
|
|
|
|
EDI_CONFIG_LIMIT(_edi_project_config->gui.tabstop, 1, 32);
|
|
|
|
|
|
|
|
_edi_project_config->version = EDI_PROJECT_CONFIG_FILE_VERSION;
|
|
|
|
|
|
|
|
if (save) _edi_project_config_save();
|
|
|
|
}
|
|
|
|
|
2015-05-18 08:32:46 -07:00
|
|
|
static Eina_Bool
|
|
|
|
_edi_project_config_save_no_notify()
|
|
|
|
{
|
|
|
|
return _edi_config_domain_save(_edi_project_config_dir_get(), PACKAGE_NAME, _edi_proj_cfg_edd, _edi_project_config);
|
|
|
|
}
|
|
|
|
|
2016-02-11 06:14:30 -08:00
|
|
|
void
|
2015-05-16 01:56:39 -07:00
|
|
|
_edi_project_config_save()
|
|
|
|
{
|
2015-05-18 08:32:46 -07:00
|
|
|
if (_edi_project_config_save_no_notify())
|
2015-05-16 01:56:39 -07:00
|
|
|
ecore_event_add(EDI_EVENT_CONFIG_CHANGED, NULL, NULL, NULL);
|
|
|
|
}
|
|
|
|
|
2015-05-18 08:32:46 -07:00
|
|
|
void
|
|
|
|
_edi_project_config_tab_add(const char *path, Eina_Bool windowed)
|
|
|
|
{
|
|
|
|
Edi_Project_Config_Tab *tab;
|
|
|
|
Eina_List *list, *next;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH_SAFE(_edi_project_config->tabs, list, next, tab)
|
|
|
|
{
|
|
|
|
if (!strncmp(tab->path, path, strlen(tab->path)))
|
|
|
|
_edi_project_config->tabs = eina_list_remove_list(_edi_project_config->tabs, list);
|
|
|
|
}
|
|
|
|
|
|
|
|
tab = malloc(sizeof(*tab));
|
|
|
|
tab->path = eina_stringshare_add(path);
|
|
|
|
tab->windowed = windowed;
|
|
|
|
_edi_project_config->tabs = eina_list_append(_edi_project_config->tabs, tab);
|
|
|
|
_edi_project_config_save_no_notify();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_edi_project_config_tab_remove(const char *path)
|
|
|
|
{
|
|
|
|
Edi_Project_Config_Tab *tab;
|
|
|
|
Eina_List *list, *next;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH_SAFE(_edi_project_config->tabs, list, next, tab)
|
|
|
|
{
|
|
|
|
if (!strncmp(tab->path, path, strlen(tab->path)))
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
_edi_project_config->tabs = eina_list_remove(_edi_project_config->tabs, tab);
|
|
|
|
_edi_project_config_save_no_notify();
|
|
|
|
|
|
|
|
eina_stringshare_del(tab->path);
|
|
|
|
free(tab);
|
|
|
|
}
|